@lowlighter/toolbox 1.0.1
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/README.md +14 -0
- package/clone.d.ts +9 -0
- package/clone.js +37 -0
- package/deno.lock +53 -0
- package/env.d.ts +28 -0
- package/env.js +28 -0
- package/evaluate.d.ts +49 -0
- package/evaluate.js +90 -0
- package/events.d.ts +8 -0
- package/events.js +28 -0
- package/filesystem.d.ts +19 -0
- package/filesystem.js +40 -0
- package/fixtures/filesystem/a/b/foo.txt +1 -0
- package/fixtures/filesystem/a/c/bar.txt +1 -0
- package/fixtures/filesystem/a/c/baz.txt +1 -0
- package/fixtures/filesystem/a/d/qux.ts +1 -0
- package/format.d.ts +9 -0
- package/format.js +21 -0
- package/identicon.d.ts +6 -0
- package/identicon.js +32 -0
- package/imgb64.d.ts +1 -0
- package/imgb64.js +15 -0
- package/mod.ts +1 -0
- package/noop.d.ts +1 -0
- package/noop.js +2 -0
- package/package.json +116 -0
- package/permissions.d.ts +1 -0
- package/permissions.js +31 -0
- package/pluralize.d.ts +6 -0
- package/pluralize.js +44 -0
- package/promises.d.ts +1 -0
- package/promises.js +12 -0
- package/resolve.d.ts +5 -0
- package/resolve.js +18 -0
- package/scripts/code_quality.d.ts +0 -0
- package/scripts/code_quality.js +210 -0
- package/scripts/download_lambda_chromium.d.ts +10 -0
- package/scripts/download_lambda_chromium.js +133 -0
- package/scripts/highlight_coverage.d.ts +0 -0
- package/scripts/highlight_coverage.js +62 -0
- package/scripts/publish/_utils.js +95 -0
- package/scripts/publish/npm.d.ts +11 -0
- package/scripts/publish/npm.js +130 -0
- package/scripts/publish/x.d.ts +20 -0
- package/scripts/publish/x.js +303 -0
- package/timezone.d.ts +2 -0
- package/timezone.js +8 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// deno-lint-ignore-file no-console
|
|
2
|
+
/**
|
|
3
|
+
* Publish a package on deno.land/x.
|
|
4
|
+
*
|
|
5
|
+
* 1. Check whether `https://deno.land/x/<name>@<version>` is already published (in which case there is nothing to do)
|
|
6
|
+
* 2. When `map` is set, create a temporary git branch where all imports are resolved against import maps
|
|
7
|
+
* (raw imports served by deno.land/x cannot resolve import maps, so bare specifiers are rewritten to fully qualified ones)
|
|
8
|
+
* 3. Search the github repository for the deno.land/x webhook, and activate it when `reactive` is set
|
|
9
|
+
* (this lets you keep the hook disabled by default so unrelated tags are not published)
|
|
10
|
+
* 4. Create and push a git tag named after `version` to trigger the webhook
|
|
11
|
+
* 5. Wait for the webhook payload delivery and for the version to be published on deno.land/x
|
|
12
|
+
* 6. Restore the webhook state, and clean up the temporary branch and tag (when `remove` is set)
|
|
13
|
+
*
|
|
14
|
+
* Note that you must configure the webhook on deno.land/x prior to using this script.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/ // Imports
|
|
18
|
+
import { parseArgs } from "@std/cli";
|
|
19
|
+
import { expandGlob } from "@std/fs";
|
|
20
|
+
import { dirname, resolve } from "@std/path";
|
|
21
|
+
import { command } from "@lowlighter/run/command";
|
|
22
|
+
import { commit, pull, push, tag } from "@lowlighter/git";
|
|
23
|
+
import { manifest, unmap, workspaceImports } from "./_utils.js";
|
|
24
|
+
import { cyan, gray, green, yellow } from "@std/fmt/colors";
|
|
25
|
+
/** Publish a package on deno.land/x. */ export async function publish({ token, repository, name, version, directory = "", map = "", reactive = false, remove = false, attempts = 30, delay = 30000, dryrun = false, fetcher = fetch }) {
|
|
26
|
+
directory = directory.trim().replace(/\/$/, "");
|
|
27
|
+
const hooked = `https://api.deno.land/webhook/gh/${name}${directory ? `?subdir=${encodeURIComponent(`/${directory}/`)}` : ""}`;
|
|
28
|
+
const url = `https://deno.land/x/${name}@${version}`;
|
|
29
|
+
const github = (path, init = {})=>fetcher(`https://api.github.com/repos/${repository}${path}`, {
|
|
30
|
+
...init,
|
|
31
|
+
headers: {
|
|
32
|
+
Accept: "application/vnd.github+json",
|
|
33
|
+
Authorization: `Bearer ${token}`
|
|
34
|
+
}
|
|
35
|
+
}).then(async (response)=>{
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
await response.body?.cancel();
|
|
38
|
+
throw new Error(`GitHub API request failed with status ${response.status}: ${path}`);
|
|
39
|
+
}
|
|
40
|
+
return response.json();
|
|
41
|
+
});
|
|
42
|
+
const published = ()=>fetcher(url, {
|
|
43
|
+
headers: {
|
|
44
|
+
Accept: "text/html"
|
|
45
|
+
}
|
|
46
|
+
}).then(async (response)=>{
|
|
47
|
+
await response.body?.cancel();
|
|
48
|
+
return response.ok;
|
|
49
|
+
});
|
|
50
|
+
const sleep = ()=>new Promise((resolve)=>setTimeout(resolve, delay));
|
|
51
|
+
// Check if package is already published
|
|
52
|
+
if (await published()) {
|
|
53
|
+
console.error(`${url} is already published, nothing to do`);
|
|
54
|
+
return {
|
|
55
|
+
name,
|
|
56
|
+
version,
|
|
57
|
+
url,
|
|
58
|
+
changed: false
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Resolve imports on a temporary branch if needed
|
|
62
|
+
const branch = {
|
|
63
|
+
current: "",
|
|
64
|
+
temporary: ""
|
|
65
|
+
};
|
|
66
|
+
try {
|
|
67
|
+
if (map) {
|
|
68
|
+
branch.current = command("git", [
|
|
69
|
+
"rev-parse",
|
|
70
|
+
"--abbrev-ref",
|
|
71
|
+
"HEAD"
|
|
72
|
+
], {
|
|
73
|
+
sync: true,
|
|
74
|
+
throw: true
|
|
75
|
+
}).stdout.trim();
|
|
76
|
+
branch.temporary = `x-${name}-${version}`;
|
|
77
|
+
console.error(`switching from ${branch.current} to temporary branch ${branch.temporary}`);
|
|
78
|
+
if (!dryrun) {
|
|
79
|
+
command("git", [
|
|
80
|
+
"switch",
|
|
81
|
+
"--create",
|
|
82
|
+
branch.temporary
|
|
83
|
+
], {
|
|
84
|
+
sync: true,
|
|
85
|
+
throw: true
|
|
86
|
+
});
|
|
87
|
+
push(branch.temporary);
|
|
88
|
+
command("git", [
|
|
89
|
+
"branch",
|
|
90
|
+
"--set-upstream-to",
|
|
91
|
+
`origin/${branch.temporary}`
|
|
92
|
+
], {
|
|
93
|
+
sync: true,
|
|
94
|
+
throw: true
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const cwd = resolve(Deno.cwd());
|
|
98
|
+
const workspace = await workspaceImports(cwd);
|
|
99
|
+
const mapped = manifest(dirname(resolve(cwd, map)))?.imports ?? {};
|
|
100
|
+
const exclude = [
|
|
101
|
+
...new Set([
|
|
102
|
+
...manifest(cwd)?.publish?.exclude ?? [],
|
|
103
|
+
"node_modules",
|
|
104
|
+
".git",
|
|
105
|
+
"coverage",
|
|
106
|
+
".github"
|
|
107
|
+
])
|
|
108
|
+
];
|
|
109
|
+
for await (const { path } of expandGlob("**/*.ts", {
|
|
110
|
+
root: cwd,
|
|
111
|
+
includeDirs: false,
|
|
112
|
+
exclude
|
|
113
|
+
})){
|
|
114
|
+
// Resolve against workspace members, the nearest manifest imports and the specified map
|
|
115
|
+
let local = {};
|
|
116
|
+
for(let base = dirname(path); base.startsWith(cwd); base = dirname(base)){
|
|
117
|
+
const parsed = manifest(base);
|
|
118
|
+
if (parsed) {
|
|
119
|
+
local = parsed.imports ?? {};
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const { result, resolved } = unmap(await Deno.readTextFile(path), {
|
|
124
|
+
...workspace,
|
|
125
|
+
...local,
|
|
126
|
+
...mapped
|
|
127
|
+
});
|
|
128
|
+
if (resolved) {
|
|
129
|
+
console.error(gray(`resolved ${resolved} imports in ${path}`));
|
|
130
|
+
if (!dryrun) await Deno.writeTextFile(path, result);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
console.error(gray(`committing resolved imports on ${branch.temporary}`));
|
|
134
|
+
if (!dryrun) {
|
|
135
|
+
commit(`build(${name}): deno.land/x@${version}`, {
|
|
136
|
+
all: true
|
|
137
|
+
});
|
|
138
|
+
push(branch.temporary);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Search webhook and activate it if needed
|
|
142
|
+
const webhooks = await github("/hooks");
|
|
143
|
+
const hook = webhooks.find(({ config })=>config.url === hooked);
|
|
144
|
+
if (!hook) throw new Error(`Could not find a hook with expected url: ${hooked}`);
|
|
145
|
+
console.error(`found hook ${hook.id} (active: ${hook.active})`);
|
|
146
|
+
if (reactive && !hook.active) {
|
|
147
|
+
console.error(yellow("hook is inactive prior publishing, activating"));
|
|
148
|
+
if (!dryrun) await github(`/hooks/${hook.id}`, {
|
|
149
|
+
method: "PATCH",
|
|
150
|
+
body: JSON.stringify({
|
|
151
|
+
active: true
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
// Create and push tag to trigger webhook
|
|
157
|
+
console.error(`creating and pushing tag ${version}`);
|
|
158
|
+
const pushed = Date.now();
|
|
159
|
+
if (!dryrun) {
|
|
160
|
+
tag(version, {
|
|
161
|
+
force: true
|
|
162
|
+
});
|
|
163
|
+
pull({
|
|
164
|
+
rebase: true
|
|
165
|
+
});
|
|
166
|
+
push(version);
|
|
167
|
+
}
|
|
168
|
+
// Wait for webhook payload delivery and deno.land/x publishing
|
|
169
|
+
if (!dryrun) {
|
|
170
|
+
for(let attempt = 0;; attempt++){
|
|
171
|
+
const deliveries = await github(`/hooks/${hook.id}/deliveries`);
|
|
172
|
+
if (deliveries.some(({ event, delivered_at })=>event === "create" && Date.parse(delivered_at) >= pushed - delay)) break;
|
|
173
|
+
if (attempt >= attempts) throw new Error("Webhook payload has not been delivered in the expected time frame");
|
|
174
|
+
console.error(gray("webhook payload has not been delivered yet"));
|
|
175
|
+
await sleep();
|
|
176
|
+
}
|
|
177
|
+
console.error(cyan("webhook payload has been delivered"));
|
|
178
|
+
for(let attempt = 0;; attempt++){
|
|
179
|
+
if (await published()) break;
|
|
180
|
+
if (attempt >= attempts) throw new Error("Package has not been published in the expected time frame");
|
|
181
|
+
console.error(gray("package has not been published yet"));
|
|
182
|
+
await sleep();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
console.error(green(`published on ${url}`));
|
|
186
|
+
} finally{
|
|
187
|
+
// Restore hook state if needed
|
|
188
|
+
if (reactive && !hook.active) {
|
|
189
|
+
console.error(yellow("hook was inactive prior publishing, restoring state"));
|
|
190
|
+
if (!dryrun) await github(`/hooks/${hook.id}`, {
|
|
191
|
+
method: "PATCH",
|
|
192
|
+
body: JSON.stringify({
|
|
193
|
+
active: false
|
|
194
|
+
})
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Remove tag if needed
|
|
198
|
+
if (remove && !dryrun) {
|
|
199
|
+
console.error(gray(`removing tag ${version} locally and from origin`));
|
|
200
|
+
command("git", [
|
|
201
|
+
"tag",
|
|
202
|
+
"--delete",
|
|
203
|
+
version
|
|
204
|
+
], {
|
|
205
|
+
sync: true
|
|
206
|
+
});
|
|
207
|
+
push(version, {
|
|
208
|
+
args: [
|
|
209
|
+
"--delete"
|
|
210
|
+
]
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} finally{
|
|
215
|
+
// Remove temporary branch if needed
|
|
216
|
+
if (map && !dryrun && branch.temporary) {
|
|
217
|
+
console.error(`switching back to ${branch.current} and deleting temporary branch ${branch.temporary}`);
|
|
218
|
+
command("git", [
|
|
219
|
+
"switch",
|
|
220
|
+
branch.current
|
|
221
|
+
], {
|
|
222
|
+
sync: true
|
|
223
|
+
});
|
|
224
|
+
command("git", [
|
|
225
|
+
"branch",
|
|
226
|
+
"--delete",
|
|
227
|
+
"--force",
|
|
228
|
+
branch.temporary
|
|
229
|
+
], {
|
|
230
|
+
sync: true
|
|
231
|
+
});
|
|
232
|
+
push(branch.temporary, {
|
|
233
|
+
args: [
|
|
234
|
+
"--delete"
|
|
235
|
+
]
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
name,
|
|
241
|
+
version,
|
|
242
|
+
url,
|
|
243
|
+
changed: true
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
// Entry point
|
|
247
|
+
if (import.meta.main) {
|
|
248
|
+
const args = parseArgs(Deno.args, {
|
|
249
|
+
string: [
|
|
250
|
+
"token",
|
|
251
|
+
"repository",
|
|
252
|
+
"name",
|
|
253
|
+
"version",
|
|
254
|
+
"directory",
|
|
255
|
+
"map",
|
|
256
|
+
"attempts",
|
|
257
|
+
"delay"
|
|
258
|
+
],
|
|
259
|
+
boolean: [
|
|
260
|
+
"reactive",
|
|
261
|
+
"remove",
|
|
262
|
+
"dryrun",
|
|
263
|
+
"help"
|
|
264
|
+
]
|
|
265
|
+
});
|
|
266
|
+
if (args.help) {
|
|
267
|
+
console.error("Usage: deno run --allow-all jsr:@libs/toolbox/scripts/publish/x --token <token> --repository <owner/repo> [options]");
|
|
268
|
+
console.error("");
|
|
269
|
+
console.error("Options:");
|
|
270
|
+
console.error(" --token <token> GitHub API token");
|
|
271
|
+
console.error(" --repository <owner/repo> GitHub repository");
|
|
272
|
+
console.error(" --name [name] Package name on deno.land/x (defaults to the unscoped name from the deno.json(c) in the current directory)");
|
|
273
|
+
console.error(" --version [version] Version to publish (defaults to the version from the deno.json(c) in the current directory)");
|
|
274
|
+
console.error(" --directory [directory] Subdirectory of the repository to publish");
|
|
275
|
+
console.error(" --map [map] Import map path, when specified imports are resolved on a temporary branch which is published instead");
|
|
276
|
+
console.error(" --reactive Activate the webhook before publishing and restore its state afterwards");
|
|
277
|
+
console.error(" --remove Remove the tag after publishing");
|
|
278
|
+
console.error(" --attempts [attempts=30] Maximum number of attempts for publishing operations to complete");
|
|
279
|
+
console.error(" --delay [delay=30000] Delay between each attempt (in milliseconds)");
|
|
280
|
+
console.error(" --dryrun Do not actually publish");
|
|
281
|
+
Deno.exit(2);
|
|
282
|
+
}
|
|
283
|
+
if (!args.name || !args.version) {
|
|
284
|
+
const { name = "", version = "" } = await manifest(Deno.cwd()) ?? {};
|
|
285
|
+
args.name ||= name.split("/").at(-1);
|
|
286
|
+
args.version ||= version;
|
|
287
|
+
}
|
|
288
|
+
const { token = "", repository = "", name = "", version = "", directory, map, reactive, remove, dryrun } = args;
|
|
289
|
+
await publish({
|
|
290
|
+
token,
|
|
291
|
+
repository,
|
|
292
|
+
name,
|
|
293
|
+
version,
|
|
294
|
+
directory,
|
|
295
|
+
map,
|
|
296
|
+
reactive,
|
|
297
|
+
remove,
|
|
298
|
+
dryrun,
|
|
299
|
+
attempts: Number(args.attempts) || undefined,
|
|
300
|
+
delay: Number(args.delay) || undefined
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL3B1Ymxpc2gveC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBkZW5vLWxpbnQtaWdub3JlLWZpbGUgbm8tY29uc29sZVxuLyoqXG4gKiBQdWJsaXNoIGEgcGFja2FnZSBvbiBkZW5vLmxhbmQveC5cbiAqXG4gKiAxLiBDaGVjayB3aGV0aGVyIGBodHRwczovL2Rlbm8ubGFuZC94LzxuYW1lPkA8dmVyc2lvbj5gIGlzIGFscmVhZHkgcHVibGlzaGVkIChpbiB3aGljaCBjYXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8pXG4gKiAyLiBXaGVuIGBtYXBgIGlzIHNldCwgY3JlYXRlIGEgdGVtcG9yYXJ5IGdpdCBicmFuY2ggd2hlcmUgYWxsIGltcG9ydHMgYXJlIHJlc29sdmVkIGFnYWluc3QgaW1wb3J0IG1hcHNcbiAqICAgIChyYXcgaW1wb3J0cyBzZXJ2ZWQgYnkgZGVuby5sYW5kL3ggY2Fubm90IHJlc29sdmUgaW1wb3J0IG1hcHMsIHNvIGJhcmUgc3BlY2lmaWVycyBhcmUgcmV3cml0dGVuIHRvIGZ1bGx5IHF1YWxpZmllZCBvbmVzKVxuICogMy4gU2VhcmNoIHRoZSBnaXRodWIgcmVwb3NpdG9yeSBmb3IgdGhlIGRlbm8ubGFuZC94IHdlYmhvb2ssIGFuZCBhY3RpdmF0ZSBpdCB3aGVuIGByZWFjdGl2ZWAgaXMgc2V0XG4gKiAgICAodGhpcyBsZXRzIHlvdSBrZWVwIHRoZSBob29rIGRpc2FibGVkIGJ5IGRlZmF1bHQgc28gdW5yZWxhdGVkIHRhZ3MgYXJlIG5vdCBwdWJsaXNoZWQpXG4gKiA0LiBDcmVhdGUgYW5kIHB1c2ggYSBnaXQgdGFnIG5hbWVkIGFmdGVyIGB2ZXJzaW9uYCB0byB0cmlnZ2VyIHRoZSB3ZWJob29rXG4gKiA1LiBXYWl0IGZvciB0aGUgd2ViaG9vayBwYXlsb2FkIGRlbGl2ZXJ5IGFuZCBmb3IgdGhlIHZlcnNpb24gdG8gYmUgcHVibGlzaGVkIG9uIGRlbm8ubGFuZC94XG4gKiA2LiBSZXN0b3JlIHRoZSB3ZWJob29rIHN0YXRlLCBhbmQgY2xlYW4gdXAgdGhlIHRlbXBvcmFyeSBicmFuY2ggYW5kIHRhZyAod2hlbiBgcmVtb3ZlYCBpcyBzZXQpXG4gKlxuICogTm90ZSB0aGF0IHlvdSBtdXN0IGNvbmZpZ3VyZSB0aGUgd2ViaG9vayBvbiBkZW5vLmxhbmQveCBwcmlvciB0byB1c2luZyB0aGlzIHNjcmlwdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gSW1wb3J0c1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIkBzdGQvY2xpXCJcbmltcG9ydCB7IGV4cGFuZEdsb2IgfSBmcm9tIFwiQHN0ZC9mc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIkBzdGQvcGF0aFwiXG5pbXBvcnQgeyBjb21tYW5kIH0gZnJvbSBcIkBsaWJzL3J1bi9jb21tYW5kXCJcbmltcG9ydCB7IGNvbW1pdCwgcHVsbCwgcHVzaCwgdGFnIH0gZnJvbSBcIkBsaWJzL2dpdFwiXG5pbXBvcnQgeyBtYW5pZmVzdCwgdW5tYXAsIHdvcmtzcGFjZUltcG9ydHMgfSBmcm9tIFwiLi9fdXRpbHMuanNcIlxuaW1wb3J0IHsgY3lhbiwgZ3JheSwgZ3JlZW4sIHllbGxvdyB9IGZyb20gXCJAc3RkL2ZtdC9jb2xvcnNcIlxuXG4vKiogUHVibGlzaCBhIHBhY2thZ2Ugb24gZGVuby5sYW5kL3guICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaCh7IHRva2VuLCByZXBvc2l0b3J5LCBuYW1lLCB2ZXJzaW9uLCBkaXJlY3RvcnkgPSBcIlwiLCBtYXAgPSBcIlwiLCByZWFjdGl2ZSA9IGZhbHNlLCByZW1vdmUgPSBmYWxzZSwgYXR0ZW1wdHMgPSAzMCwgZGVsYXkgPSAzMDAwMCwgZHJ5cnVuID0gZmFsc2UsIGZldGNoZXIgPSBmZXRjaCB9OiBPcHRpb25zKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyB1cmw6IHN0cmluZzsgY2hhbmdlZDogYm9vbGVhbiB9PiB7XG4gIGRpcmVjdG9yeSA9IGRpcmVjdG9yeS50cmltKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gIGNvbnN0IGhvb2tlZCA9IGBodHRwczovL2FwaS5kZW5vLmxhbmQvd2ViaG9vay9naC8ke25hbWV9JHtkaXJlY3RvcnkgPyBgP3N1YmRpcj0ke2VuY29kZVVSSUNvbXBvbmVudChgLyR7ZGlyZWN0b3J5fS9gKX1gIDogXCJcIn1gXG4gIGNvbnN0IHVybCA9IGBodHRwczovL2Rlbm8ubGFuZC94LyR7bmFtZX1AJHt2ZXJzaW9ufWBcbiAgY29uc3QgZ2l0aHViID0gKHBhdGg6IHN0cmluZywgaW5pdCA9IHt9IGFzIFJlcXVlc3RJbml0KSA9PlxuICAgIGZldGNoZXIoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvc2l0b3J5fSR7cGF0aH1gLCB7IC4uLmluaXQsIGhlYWRlcnM6IHsgQWNjZXB0OiBcImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvblwiLCBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9IH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c306ICR7cGF0aH1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKVxuICAgIH0pXG4gIGNvbnN0IHB1Ymxpc2hlZCA9ICgpID0+XG4gICAgZmV0Y2hlcih1cmwsIHsgaGVhZGVyczogeyBBY2NlcHQ6IFwidGV4dC9odG1sXCIgfSB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKClcbiAgICAgIHJldHVybiByZXNwb25zZS5va1xuICAgIH0pXG4gIGNvbnN0IHNsZWVwID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKVxuXG4gIC8vIENoZWNrIGlmIHBhY2thZ2UgaXMgYWxyZWFkeSBwdWJsaXNoZWRcbiAgaWYgKGF3YWl0IHB1Ymxpc2hlZCgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHt1cmx9IGlzIGFscmVhZHkgcHVibGlzaGVkLCBub3RoaW5nIHRvIGRvYClcbiAgICByZXR1cm4geyBuYW1lLCB2ZXJzaW9uLCB1cmwsIGNoYW5nZWQ6IGZhbHNlIH1cbiAgfVxuXG4gIC8vIFJlc29sdmUgaW1wb3J0cyBvbiBhIHRlbXBvcmFyeSBicmFuY2ggaWYgbmVlZGVkXG4gIGNvbnN0IGJyYW5jaCA9IHsgY3VycmVudDogXCJcIiwgdGVtcG9yYXJ5OiBcIlwiIH1cbiAgdHJ5IHtcbiAgICBpZiAobWFwKSB7XG4gICAgICBicmFuY2guY3VycmVudCA9IGNvbW1hbmQoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1hYmJyZXYtcmVmXCIsIFwiSEVBRFwiXSwgeyBzeW5jOiB0cnVlLCB0aHJvdzogdHJ1ZSB9KS5zdGRvdXQudHJpbSgpXG4gICAgICBicmFuY2gudGVtcG9yYXJ5ID0gYHgtJHtuYW1lfS0ke3ZlcnNpb259YFxuICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoaW5nIGZyb20gJHticmFuY2guY3VycmVudH0gdG8gdGVtcG9yYXJ5IGJyYW5jaCAke2JyYW5jaC50ZW1wb3Jhcnl9YClcbiAgICAgIGlmICghZHJ5cnVuKSB7XG4gICAgICAgIGNvbW1hbmQoXCJnaXRcIiwgW1wic3dpdGNoXCIsIFwiLS1jcmVhdGVcIiwgYnJhbmNoLnRlbXBvcmFyeV0sIHsgc3luYzogdHJ1ZSwgdGhyb3c6IHRydWUgfSlcbiAgICAgICAgcHVzaChicmFuY2gudGVtcG9yYXJ5KVxuICAgICAgICBjb21tYW5kKFwiZ2l0XCIsIFtcImJyYW5jaFwiLCBcIi0tc2V0LXVwc3RyZWFtLXRvXCIsIGBvcmlnaW4vJHticmFuY2gudGVtcG9yYXJ5fWBdLCB7IHN5bmM6IHRydWUsIHRocm93OiB0cnVlIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBjd2QgPSByZXNvbHZlKERlbm8uY3dkKCkpXG4gICAgICBjb25zdCB3b3Jrc3BhY2UgPSBhd2FpdCB3b3Jrc3BhY2VJbXBvcnRzKGN3ZClcbiAgICAgIGNvbnN0IG1hcHBlZCA9IG1hbmlmZXN0KGRpcm5hbWUocmVzb2x2ZShjd2QsIG1hcCkpKT8uaW1wb3J0cyA/PyB7fVxuICAgICAgY29uc3QgZXhjbHVkZSA9IFsuLi5uZXcgU2V0KFsuLi4obWFuaWZlc3QoY3dkKT8ucHVibGlzaD8uZXhjbHVkZSA/PyBbXSksIFwibm9kZV9tb2R1bGVzXCIsIFwiLmdpdFwiLCBcImNvdmVyYWdlXCIsIFwiLmdpdGh1YlwiXSldXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IHsgcGF0aCB9IG9mIGV4cGFuZEdsb2IoXCIqKi8qLnRzXCIsIHsgcm9vdDogY3dkLCBpbmNsdWRlRGlyczogZmFsc2UsIGV4Y2x1ZGUgfSkpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBhZ2FpbnN0IHdvcmtzcGFjZSBtZW1iZXJzLCB0aGUgbmVhcmVzdCBtYW5pZmVzdCBpbXBvcnRzIGFuZCB0aGUgc3BlY2lmaWVkIG1hcFxuICAgICAgICBsZXQgbG9jYWwgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgICAgIGZvciAobGV0IGJhc2UgPSBkaXJuYW1lKHBhdGgpOyBiYXNlLnN0YXJ0c1dpdGgoY3dkKTsgYmFzZSA9IGRpcm5hbWUoYmFzZSkpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBtYW5pZmVzdChiYXNlKVxuICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIGxvY2FsID0gcGFyc2VkLmltcG9ydHMgPz8ge31cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgcmVzdWx0LCByZXNvbHZlZCB9ID0gdW5tYXAoYXdhaXQgRGVuby5yZWFkVGV4dEZpbGUocGF0aCksIHsgLi4ud29ya3NwYWNlLCAuLi5sb2NhbCwgLi4ubWFwcGVkIH0pXG4gICAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ3JheShgcmVzb2x2ZWQgJHtyZXNvbHZlZH0gaW1wb3J0cyBpbiAke3BhdGh9YCkpXG4gICAgICAgICAgaWYgKCFkcnlydW4pXG4gICAgICAgICAgICBhd2FpdCBEZW5vLndyaXRlVGV4dEZpbGUocGF0aCwgcmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKGdyYXkoYGNvbW1pdHRpbmcgcmVzb2x2ZWQgaW1wb3J0cyBvbiAke2JyYW5jaC50ZW1wb3Jhcnl9YCkpXG4gICAgICBpZiAoIWRyeXJ1bikge1xuICAgICAgICBjb21taXQoYGJ1aWxkKCR7bmFtZX0pOiBkZW5vLmxhbmQveEAke3ZlcnNpb259YCwgeyBhbGw6IHRydWUgfSlcbiAgICAgICAgcHVzaChicmFuY2gudGVtcG9yYXJ5KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlYXJjaCB3ZWJob29rIGFuZCBhY3RpdmF0ZSBpdCBpZiBuZWVkZWRcbiAgICBjb25zdCB3ZWJob29rcyA9IGF3YWl0IGdpdGh1YihcIi9ob29rc1wiKSBhcyBBcnJheTx7IGlkOiBudW1iZXI7IGFjdGl2ZTogYm9vbGVhbjsgY29uZmlnOiB7IHVybD86IHN0cmluZyB9IH0+XG4gICAgY29uc3QgaG9vayA9IHdlYmhvb2tzLmZpbmQoKHsgY29uZmlnIH0pID0+IGNvbmZpZy51cmwgPT09IGhvb2tlZClcbiAgICBpZiAoIWhvb2spXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgaG9vayB3aXRoIGV4cGVjdGVkIHVybDogJHtob29rZWR9YClcbiAgICBjb25zb2xlLmVycm9yKGBmb3VuZCBob29rICR7aG9vay5pZH0gKGFjdGl2ZTogJHtob29rLmFjdGl2ZX0pYClcbiAgICBpZiAocmVhY3RpdmUgJiYgKCFob29rLmFjdGl2ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoeWVsbG93KFwiaG9vayBpcyBpbmFjdGl2ZSBwcmlvciBwdWJsaXNoaW5nLCBhY3RpdmF0aW5nXCIpKVxuICAgICAgaWYgKCFkcnlydW4pXG4gICAgICAgIGF3YWl0IGdpdGh1YihgL2hvb2tzLyR7aG9vay5pZH1gLCB7IG1ldGhvZDogXCJQQVRDSFwiLCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGl2ZTogdHJ1ZSB9KSB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYW5kIHB1c2ggdGFnIHRvIHRyaWdnZXIgd2ViaG9va1xuICAgICAgY29uc29sZS5lcnJvcihgY3JlYXRpbmcgYW5kIHB1c2hpbmcgdGFnICR7dmVyc2lvbn1gKVxuICAgICAgY29uc3QgcHVzaGVkID0gRGF0ZS5ub3coKVxuICAgICAgaWYgKCFkcnlydW4pIHtcbiAgICAgICAgdGFnKHZlcnNpb24sIHsgZm9yY2U6IHRydWUgfSlcbiAgICAgICAgcHVsbCh7IHJlYmFzZTogdHJ1ZSB9KVxuICAgICAgICBwdXNoKHZlcnNpb24pXG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgZm9yIHdlYmhvb2sgcGF5bG9hZCBkZWxpdmVyeSBhbmQgZGVuby5sYW5kL3ggcHVibGlzaGluZ1xuICAgICAgaWYgKCFkcnlydW4pIHtcbiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7OyBhdHRlbXB0KyspIHtcbiAgICAgICAgICBjb25zdCBkZWxpdmVyaWVzID0gYXdhaXQgZ2l0aHViKGAvaG9va3MvJHtob29rLmlkfS9kZWxpdmVyaWVzYCkgYXMgQXJyYXk8eyBldmVudDogc3RyaW5nOyBkZWxpdmVyZWRfYXQ6IHN0cmluZyB9PlxuICAgICAgICAgIGlmIChkZWxpdmVyaWVzLnNvbWUoKHsgZXZlbnQsIGRlbGl2ZXJlZF9hdCB9KSA9PiAoZXZlbnQgPT09IFwiY3JlYXRlXCIpICYmIChEYXRlLnBhcnNlKGRlbGl2ZXJlZF9hdCkgPj0gcHVzaGVkIC0gZGVsYXkpKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgaWYgKGF0dGVtcHQgPj0gYXR0ZW1wdHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJob29rIHBheWxvYWQgaGFzIG5vdCBiZWVuIGRlbGl2ZXJlZCBpbiB0aGUgZXhwZWN0ZWQgdGltZSBmcmFtZVwiKVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ3JheShcIndlYmhvb2sgcGF5bG9hZCBoYXMgbm90IGJlZW4gZGVsaXZlcmVkIHlldFwiKSlcbiAgICAgICAgICBhd2FpdCBzbGVlcCgpXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihjeWFuKFwid2ViaG9vayBwYXlsb2FkIGhhcyBiZWVuIGRlbGl2ZXJlZFwiKSlcbiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7OyBhdHRlbXB0KyspIHtcbiAgICAgICAgICBpZiAoYXdhaXQgcHVibGlzaGVkKCkpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGlmIChhdHRlbXB0ID49IGF0dGVtcHRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFja2FnZSBoYXMgbm90IGJlZW4gcHVibGlzaGVkIGluIHRoZSBleHBlY3RlZCB0aW1lIGZyYW1lXCIpXG4gICAgICAgICAgY29uc29sZS5lcnJvcihncmF5KFwicGFja2FnZSBoYXMgbm90IGJlZW4gcHVibGlzaGVkIHlldFwiKSlcbiAgICAgICAgICBhd2FpdCBzbGVlcCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoZ3JlZW4oYHB1Ymxpc2hlZCBvbiAke3VybH1gKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzdG9yZSBob29rIHN0YXRlIGlmIG5lZWRlZFxuICAgICAgaWYgKHJlYWN0aXZlICYmICghaG9vay5hY3RpdmUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoeWVsbG93KFwiaG9vayB3YXMgaW5hY3RpdmUgcHJpb3IgcHVibGlzaGluZywgcmVzdG9yaW5nIHN0YXRlXCIpKVxuICAgICAgICBpZiAoIWRyeXJ1bilcbiAgICAgICAgICBhd2FpdCBnaXRodWIoYC9ob29rcy8ke2hvb2suaWR9YCwgeyBtZXRob2Q6IFwiUEFUQ0hcIiwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3RpdmU6IGZhbHNlIH0pIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB0YWcgaWYgbmVlZGVkXG4gICAgICBpZiAocmVtb3ZlICYmICghZHJ5cnVuKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGdyYXkoYHJlbW92aW5nIHRhZyAke3ZlcnNpb259IGxvY2FsbHkgYW5kIGZyb20gb3JpZ2luYCkpXG4gICAgICAgIGNvbW1hbmQoXCJnaXRcIiwgW1widGFnXCIsIFwiLS1kZWxldGVcIiwgdmVyc2lvbl0sIHsgc3luYzogdHJ1ZSB9KVxuICAgICAgICBwdXNoKHZlcnNpb24sIHsgYXJnczogW1wiLS1kZWxldGVcIl0gfSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBicmFuY2ggaWYgbmVlZGVkXG4gICAgaWYgKG1hcCAmJiAoIWRyeXJ1bikgJiYgYnJhbmNoLnRlbXBvcmFyeSkge1xuICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoaW5nIGJhY2sgdG8gJHticmFuY2guY3VycmVudH0gYW5kIGRlbGV0aW5nIHRlbXBvcmFyeSBicmFuY2ggJHticmFuY2gudGVtcG9yYXJ5fWApXG4gICAgICBjb21tYW5kKFwiZ2l0XCIsIFtcInN3aXRjaFwiLCBicmFuY2guY3VycmVudF0sIHsgc3luYzogdHJ1ZSB9KVxuICAgICAgY29tbWFuZChcImdpdFwiLCBbXCJicmFuY2hcIiwgXCItLWRlbGV0ZVwiLCBcIi0tZm9yY2VcIiwgYnJhbmNoLnRlbXBvcmFyeV0sIHsgc3luYzogdHJ1ZSB9KVxuICAgICAgcHVzaChicmFuY2gudGVtcG9yYXJ5LCB7IGFyZ3M6IFtcIi0tZGVsZXRlXCJdIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgbmFtZSwgdmVyc2lvbiwgdXJsLCBjaGFuZ2VkOiB0cnVlIH1cbn1cblxuLyoqIFB1Ymxpc2hpbmcgb3B0aW9ucyBmb3Ige0BsaW5rY29kZSBwdWJsaXNoKCl9LiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgLyoqIEdpdEh1YiBBUEkgdG9rZW4uICovXG4gIHRva2VuOiBzdHJpbmdcbiAgLyoqIEdpdEh1YiByZXBvc2l0b3J5IChlLmcuIGBvY3RvY2F0L2hlbGxvLXdvcmxkYCkuICovXG4gIHJlcG9zaXRvcnk6IHN0cmluZ1xuICAvKiogUGFja2FnZSBuYW1lIG9uIGRlbm8ubGFuZC94LiAqL1xuICBuYW1lOiBzdHJpbmdcbiAgLyoqIFZlcnNpb24gdG8gcHVibGlzaC4gKi9cbiAgdmVyc2lvbjogc3RyaW5nXG4gIC8qKiBTdWJkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkgdG8gcHVibGlzaCAob3B0aW9uYWwpLiAqL1xuICBkaXJlY3Rvcnk/OiBzdHJpbmdcbiAgLyoqIFBhdGggdG8gYW4gaW1wb3J0IG1hcC4gV2hlbiBzcGVjaWZpZWQsIGEgdGVtcG9yYXJ5IGJyYW5jaCB3aXRoIGFsbCBpbXBvcnRzIHJlc29sdmVkIGlzIGNyZWF0ZWQgYW5kIHB1Ymxpc2hlZCBpbnN0ZWFkLiAqL1xuICBtYXA/OiBzdHJpbmdcbiAgLyoqIEFjdGl2YXRlIHRoZSB3ZWJob29rIGJlZm9yZSBwdWJsaXNoaW5nIGFuZCByZXN0b3JlIGl0cyBzdGF0ZSBhZnRlcndhcmRzLiAqL1xuICByZWFjdGl2ZT86IGJvb2xlYW5cbiAgLyoqIFJlbW92ZSB0aGUgdGFnIGFmdGVyIHB1Ymxpc2hpbmcuICovXG4gIHJlbW92ZT86IGJvb2xlYW5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGZvciBwdWJsaXNoaW5nIG9wZXJhdGlvbnMgdG8gY29tcGxldGUuICovXG4gIGF0dGVtcHRzPzogbnVtYmVyXG4gIC8qKiBEZWxheSBiZXR3ZWVuIGVhY2ggYXR0ZW1wdCAoaW4gbWlsbGlzZWNvbmRzKS4gKi9cbiAgZGVsYXk/OiBudW1iZXJcbiAgLyoqIERvIG5vdCBhY3R1YWxseSBwdWJsaXNoIChubyBmaWxlIGlzIHdyaXR0ZW4gYW5kIG5vIG11dGF0aW5nIGdpdCBvciByZW1vdGUgY2FsbCBpcyBtYWRlKS4gKi9cbiAgZHJ5cnVuPzogYm9vbGVhblxuICAvKiogRmV0Y2ggaW1wbGVtZW50YXRpb24gKG1vc3RseSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzKS4gKi9cbiAgZmV0Y2hlcj86IHR5cGVvZiBmZXRjaFxufVxuXG4vLyBFbnRyeSBwb2ludFxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgYXJncyA9IHBhcnNlQXJncyhEZW5vLmFyZ3MsIHtcbiAgICBzdHJpbmc6IFtcInRva2VuXCIsIFwicmVwb3NpdG9yeVwiLCBcIm5hbWVcIiwgXCJ2ZXJzaW9uXCIsIFwiZGlyZWN0b3J5XCIsIFwibWFwXCIsIFwiYXR0ZW1wdHNcIiwgXCJkZWxheVwiXSxcbiAgICBib29sZWFuOiBbXCJyZWFjdGl2ZVwiLCBcInJlbW92ZVwiLCBcImRyeXJ1blwiLCBcImhlbHBcIl0sXG4gIH0pXG4gIGlmIChhcmdzLmhlbHApIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVXNhZ2U6IGRlbm8gcnVuIC0tYWxsb3ctYWxsIGpzcjpAbGlicy90b29sYm94L3NjcmlwdHMvcHVibGlzaC94IC0tdG9rZW4gPHRva2VuPiAtLXJlcG9zaXRvcnkgPG93bmVyL3JlcG8+IFtvcHRpb25zXVwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCJcIilcbiAgICBjb25zb2xlLmVycm9yKFwiT3B0aW9uczpcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLXRva2VuIDx0b2tlbj4gICAgICAgICAgICBHaXRIdWIgQVBJIHRva2VuXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1yZXBvc2l0b3J5IDxvd25lci9yZXBvPiAgR2l0SHViIHJlcG9zaXRvcnlcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLW5hbWUgW25hbWVdICAgICAgICAgICAgICBQYWNrYWdlIG5hbWUgb24gZGVuby5sYW5kL3ggKGRlZmF1bHRzIHRvIHRoZSB1bnNjb3BlZCBuYW1lIGZyb20gdGhlIGRlbm8uanNvbihjKSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS12ZXJzaW9uIFt2ZXJzaW9uXSAgICAgICAgVmVyc2lvbiB0byBwdWJsaXNoIChkZWZhdWx0cyB0byB0aGUgdmVyc2lvbiBmcm9tIHRoZSBkZW5vLmpzb24oYykgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KVwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCIgIC0tZGlyZWN0b3J5IFtkaXJlY3RvcnldICAgIFN1YmRpcmVjdG9yeSBvZiB0aGUgcmVwb3NpdG9yeSB0byBwdWJsaXNoXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1tYXAgW21hcF0gICAgICAgICAgICAgICAgSW1wb3J0IG1hcCBwYXRoLCB3aGVuIHNwZWNpZmllZCBpbXBvcnRzIGFyZSByZXNvbHZlZCBvbiBhIHRlbXBvcmFyeSBicmFuY2ggd2hpY2ggaXMgcHVibGlzaGVkIGluc3RlYWRcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLXJlYWN0aXZlICAgICAgICAgICAgICAgICBBY3RpdmF0ZSB0aGUgd2ViaG9vayBiZWZvcmUgcHVibGlzaGluZyBhbmQgcmVzdG9yZSBpdHMgc3RhdGUgYWZ0ZXJ3YXJkc1wiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCIgIC0tcmVtb3ZlICAgICAgICAgICAgICAgICAgIFJlbW92ZSB0aGUgdGFnIGFmdGVyIHB1Ymxpc2hpbmdcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLWF0dGVtcHRzIFthdHRlbXB0cz0zMF0gICBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBmb3IgcHVibGlzaGluZyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1kZWxheSBbZGVsYXk9MzAwMDBdICAgICAgRGVsYXkgYmV0d2VlbiBlYWNoIGF0dGVtcHQgKGluIG1pbGxpc2Vjb25kcylcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLWRyeXJ1biAgICAgICAgICAgICAgICAgICBEbyBub3QgYWN0dWFsbHkgcHVibGlzaFwiKVxuICAgIERlbm8uZXhpdCgyKVxuICB9XG4gIGlmICgoIWFyZ3MubmFtZSkgfHwgKCFhcmdzLnZlcnNpb24pKSB7XG4gICAgY29uc3QgeyBuYW1lID0gXCJcIiwgdmVyc2lvbiA9IFwiXCIgfSA9IChhd2FpdCBtYW5pZmVzdChEZW5vLmN3ZCgpKSkgPz8ge31cbiAgICBhcmdzLm5hbWUgfHw9IG5hbWUuc3BsaXQoXCIvXCIpLmF0KC0xKSFcbiAgICBhcmdzLnZlcnNpb24gfHw9IHZlcnNpb25cbiAgfVxuICBjb25zdCB7IHRva2VuID0gXCJcIiwgcmVwb3NpdG9yeSA9IFwiXCIsIG5hbWUgPSBcIlwiLCB2ZXJzaW9uID0gXCJcIiwgZGlyZWN0b3J5LCBtYXAsIHJlYWN0aXZlLCByZW1vdmUsIGRyeXJ1biB9ID0gYXJnc1xuICBhd2FpdCBwdWJsaXNoKHsgdG9rZW4sIHJlcG9zaXRvcnksIG5hbWUsIHZlcnNpb24sIGRpcmVjdG9yeSwgbWFwLCByZWFjdGl2ZSwgcmVtb3ZlLCBkcnlydW4sIGF0dGVtcHRzOiBOdW1iZXIoYXJncy5hdHRlbXB0cykgfHwgdW5kZWZpbmVkLCBkZWxheTogTnVtYmVyKGFyZ3MuZGVsYXkpIHx8IHVuZGVmaW5lZCB9KVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQzs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FFRCxVQUFVO0FBQ1YsU0FBUyxTQUFTLFFBQVEsV0FBVTtBQUNwQyxTQUFTLFVBQVUsUUFBUSxVQUFTO0FBQ3BDLFNBQVMsT0FBTyxFQUFFLE9BQU8sUUFBUSxZQUFXO0FBQzVDLFNBQVMsT0FBTyxRQUFRLG9CQUFtQjtB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
|
package/timezone.d.ts
ADDED
package/timezone.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Supported timezones in the current runtime. */ export const timezones = [
|
|
2
|
+
...new Set([
|
|
3
|
+
...Intl.supportedValuesOf("timeZone"),
|
|
4
|
+
"UTC"
|
|
5
|
+
])
|
|
6
|
+
];
|
|
7
|
+
/** Current timezone in the runtime. */ export const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC90aW1lem9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU3VwcG9ydGVkIHRpbWV6b25lcyBpbiB0aGUgY3VycmVudCBydW50aW1lLiAqL1xuZXhwb3J0IGNvbnN0IHRpbWV6b25lcyA9IFsuLi5uZXcgU2V0KFsuLi5JbnRsLnN1cHBvcnRlZFZhbHVlc09mKFwidGltZVpvbmVcIiksIFwiVVRDXCJdKV0gYXMgc3RyaW5nW11cblxuLyoqIEN1cnJlbnQgdGltZXpvbmUgaW4gdGhlIHJ1bnRpbWUuICovXG5leHBvcnQgY29uc3QgdGltZXpvbmUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgYXMgc3RyaW5nXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0RBQWdELEdBQ2hELE9BQU8sTUFBTSxZQUFZO0tBQUksSUFBSSxJQUFJO09BQUksS0FBSyxpQkFBaUIsQ0FBQztJQUFhO0dBQU07Q0FBRSxDQUFZO0FBRWpHLHFDQUFxQyxHQUNyQyxPQUFPLE1BQU0sV0FBVyxLQUFLLGNBQWMsR0FBRyxlQUFlLEdBQUcsUUFBUSxDQUFVIn0=
|