sliftutils 1.7.32 → 1.7.34
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/builders/extensionBuild.ts +1 -1
- package/bundler/bundleEntry.ts +1 -3
- package/bundler/bundler.ts +2 -4
- package/bundler/sourceMaps.ts +1 -2
- package/examplestorage/browser.tsx +1 -2
- package/examplestorage/exampleserver.ts +1 -2
- package/index.d.ts +134 -102
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +7 -16
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/dns.d.ts +1 -4
- package/misc/https/dns.ts +5 -14
- package/misc/https/hostServer.d.ts +2 -0
- package/misc/https/hostServer.ts +6 -7
- package/misc/https/httpsCerts.ts +4 -10
- package/misc/openrouter.ts +1 -2
- package/package.json +1 -1
- package/render-utils/FullscreenModal.tsx +1 -4
- package/render-utils/GenericFormat.tsx +2 -8
- package/render-utils/Input.tsx +5 -13
- package/render-utils/InputLabel.tsx +4 -6
- package/render-utils/InputPicker.tsx +1 -2
- package/render-utils/URLParam.ts +2 -3
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/render-utils/mobxTyped.ts +2 -3
- package/render-utils/niceStringify.ts +2 -4
- package/storage/ArchivesDisk.ts +4 -14
- package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
- package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
- package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
- package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
- package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
- package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
- package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
- package/storage/BulkDatabase2/blockCache.ts +12 -28
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
- package/storage/BulkDatabase2/mergeLock.ts +7 -26
- package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
- package/storage/BulkDatabase2/streamLog.ts +14 -40
- package/storage/BulkDatabase2/syncClient.ts +8 -24
- package/storage/FileFolderAPI.tsx +28 -75
- package/storage/IArchives.d.ts +3 -3
- package/storage/IArchives.ts +21 -50
- package/storage/IStorage.ts +2 -4
- package/storage/PendingManager.tsx +2 -3
- package/storage/TransactionStorage.ts +11 -24
- package/storage/backblaze.ts +12 -43
- package/storage/dist/ArchivesDisk.ts.cache +7 -17
- package/storage/dist/FileFolderAPI.tsx.cache +25 -63
- package/storage/dist/IArchives.ts.cache +10 -20
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +5 -6
- package/storage/dist/TransactionStorage.ts.cache +14 -27
- package/storage/dist/backblaze.ts.cache +15 -46
- package/storage/dist/embeddingFormats.ts.cache +11 -24
- package/storage/dist/fileSystemPointer.ts.cache +4 -7
- package/storage/dist/remoteFileStorage.ts.cache +17 -36
- package/storage/embeddingFormats.ts +11 -27
- package/storage/fileSystemPointer.ts +2 -7
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
- package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
- package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
- package/storage/proxydatabase/transactionSet.ts +2 -5
- package/storage/remoteFileServer.ts +20 -48
- package/storage/remoteFileStorage.ts +14 -33
- package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
- package/storage/remoteStorage/ArchivesRemote.ts +11 -26
- package/storage/remoteStorage/ArchivesUrl.ts +2 -4
- package/storage/remoteStorage/accessPage.tsx +1 -5
- package/storage/remoteStorage/blobStore.d.ts +5 -13
- package/storage/remoteStorage/blobStore.ts +52 -130
- package/storage/remoteStorage/createArchives.d.ts +22 -14
- package/storage/remoteStorage/createArchives.ts +54 -188
- package/storage/remoteStorage/deployTakeover.d.ts +18 -32
- package/storage/remoteStorage/deployTakeover.ts +70 -384
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
- package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +58 -189
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
- package/storage/remoteStorage/dist/storageClientController.ts.cache +4 -6
- package/storage/remoteStorage/dist/storageController.ts.cache +37 -74
- package/storage/remoteStorage/dist/storageServerState.ts.cache +345 -188
- package/storage/remoteStorage/grantAccessCli.ts +1 -3
- package/storage/remoteStorage/intermediateSources.d.ts +21 -0
- package/storage/remoteStorage/intermediateSources.ts +117 -0
- package/storage/remoteStorage/remoteConfig.ts +33 -20
- package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
- package/storage/remoteStorage/sourceWrapper.ts +19 -41
- package/storage/remoteStorage/storageClientController.ts +1 -3
- package/storage/remoteStorage/storageController.d.ts +7 -6
- package/storage/remoteStorage/storageController.ts +36 -82
- package/storage/remoteStorage/storageServer.ts +20 -34
- package/storage/remoteStorage/storageServerState.d.ts +41 -5
- package/storage/remoteStorage/storageServerState.ts +355 -216
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
/// <reference path="./node-forge-ed25519.d.ts" />
|
|
3
3
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
4
|
if (k2 === undefined) k2 = k;
|
|
@@ -463,4 +463,4 @@ function getOwnNodeIdAllowUndefined() {
|
|
|
463
463
|
}
|
|
464
464
|
exports.getOwnNodeIdAllowUndefined = getOwnNodeIdAllowUndefined;
|
|
465
465
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0RBQWtEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVsRCxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQiwrbkJBQStuQjtBQUMvbkIsc0lBQXNJO0FBRXRJLGlEQUFpRDtBQUVqRCx1RUFBK0Q7QUFDL0Qsa0RBQW9DO0FBR3BDLHlEQUEwRDtBQUUxRCwwREFBK0I7QUFDL0Isb0RBQTRCO0FBQzVCLDZEQUFpRTtBQUNqRSxtRUFBOEY7QUFDOUYsNkRBQWtIO0FBQ2xILG1FQUFnRTtBQUNoRSw2REFBMEU7QUFDMUUscUVBQXVEO0FBQ3ZELHdDQUF1QztBQUV2QyxJQUFBLHNCQUFPLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsSUFBQSxzQkFBTyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRW5ELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUV6QixRQUFBLGtCQUFrQixHQUFHLHNDQUFzQyxDQUFDO0FBRTVELFFBQUEsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO0FBR2pELFNBQVMsZ0JBQWdCLENBQUMsTUFBYztJQUNwQyxPQUFPLElBQUEsb0NBQVcsRUFBc0IsTUFBTSxFQUFFLDBCQUFrQixDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUlELFNBQWdCLGFBQWEsQ0FBQyxJQUFxQjtJQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RCxJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcs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RUFBRSxFQUFFLENBQUMsSUFBQSxjQUFJLEVBQUMsR0FBRyxFQUFFO0lBQzdELElBQUksRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixPQUFPLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVKLFNBQWdCLFlBQVk7SUFDeEIsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxhQUFhLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTkQsb0NBTUM7QUFFRCxTQUFnQiwwQkFBMEI7SUFDdEMsT0FBTywrQkFBYyxDQUFDLGFBQWEsQ0FBQztBQUN4QyxDQUFDO0FBRkQsZ0VBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9ub2RlLWZvcmdlLWVkMjU1MTkuZC50c1wiIC8+XG5cbm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbi8vIE5PVEU6IFdlIGNhbid0IHVzZSBjcnlwdG8uc3VidGxlIChub24tZXh0cmFjdGFibGUgQ3J5cHRvS2V5cykgZm9yIG91ciBrZXlzLCBiZWNhdXNlIHN1YnRsZSBpcyBhc3luY2hyb25vdXMsIGFuZCBldmVyeXRoaW5nIGhlcmUgKGtleSBnZW5lcmF0aW9uLCBjZXJ0IGNyZWF0aW9uLCBzaWduaW5nKSBtdXN0IGJlIGF2YWlsYWJsZSBzeW5jaHJvbm91c2x5LiBUaGUgb25seSByZWFsIGJlbmVmaXQgb2Ygc3VidGxlIGlzIHRoYXQgYSBjcm9zcy1zaXRlIHNjcmlwdGluZyBhdHRhY2sgY2FuJ3QgZXhmaWx0cmF0ZSB0aGUga2V5LiBXaGljaCwgd2hpbGUgbmljZSwgaXMgb2YgbWlub3IgYmVuZWZpdCwgYXMgdGhlIGNyb3NzLXNpdGUgc2NyaXB0IGNhbiBhbHJlYWR5IGRvIHF1aXRlIGEgYml0IG9mIGRhbWFnZSBhbnl3YXkgd2l0aCBhY2Nlc3MuIEFuZCBpZiB0aGF0IGhhcHBlbnMsIHRoZSBmaXJzdCB0aGluZyB0aGUgdXNlciBpcyBwcm9iYWJseSBnb2luZyB0byBkbyBpcyByZXNldCBhbGwgdGhlaXIgY3JlZGVudGlhbHMsIHdoaWNoIHNvbHZlcyB0aGUgY2FzZSBvZiB0aGUga2V5IGJlaW5nIGV4ZmlsdHJhdGVkIGFueXdheSAoYnkgdGVsbGluZyB0aGUgc2VydmVyIHRvIHN0b3AgdHJ1c3RpbmcgYWxsIGlkZW50aXRpZXMpLlxuLy8gTk9URTogV2UgYXJlIGp1c3Qgbm90IGdvaW5nIHRvIHN1cHBvcnQgSFRUUFMgYnJvd3NlciBjZXJ0cy4gT3VyIGNvZGUgaXMgcHVyZWx5IGZvciBpZGVudGlmaWNhdGlvbiwgYW5kIHNvIGl0IG9ubHkgc3VwcG9ydHMgRUQyNTUxOS5cblxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyODAjcGFnZS00MlxuXG5pbXBvcnQgeyBzZXRGbGFnIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL2NvbXBpbGVGbGFnc1wiO1xuaW1wb3J0ICogYXMgZm9yZ2UgZnJvbSBcIm5vZGUtZm9yZ2VcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBmc1N5bmMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBjYWNoZSwgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCBzaGEyNjUgZnJvbSBcImpzLXNoYTI1NlwiO1xuaW1wb3J0IGNyeXB0byBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyB0cnVzdENlcnRpZmljYXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2VydFN0b3JlXCI7XG5pbXBvcnQgeyBtZWFzdXJlQmxvY2ssIG1lYXN1cmVGbmMsIG1lYXN1cmVXcmFwIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvcHJvZmlsaW5nL21lYXN1cmVcIjtcbmltcG9ydCB7IGdldE5vZGVJZERvbWFpbiwgZ2V0Tm9kZUlkRG9tYWluTWF5YmVVbmRlZmluZWQsIGdldE5vZGVJZExvY2F0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbm9kZUNhY2hlXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IHJlc2V0QWxsTm9kZUNhbGxGYWN0b3JpZXMgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IGdldEtleVN0b3JlIH0gZnJvbSBcIi4vcGVyc2lzdGVudExvY2FsU3RvcmFnZVwiO1xuaW1wb3J0IHsgZWxsaXBzaXplIH0gZnJvbSBcIi4uL3N0cmluZ3NcIjtcblxuc2V0RmxhZyhyZXF1aXJlLCBcIm5vZGUtZm9yZ2VcIiwgXCJhbGxvd2NsaWVudFwiLCB0cnVlKTtcbnNldEZsYWcocmVxdWlyZSwgXCJqcy1zaGEyNTZcIiwgXCJhbGxvd2NsaWVudFwiLCB0cnVlKTtcblxuY29uc3QgdGltZUluRGF5ID0gMTAwMCAqIDYwICogNjAgKiAyNDtcblxuZXhwb3J0IGNvbnN0IENBX05PVF9GT1VORF9FUlJPUiA9IFwiMThhYTczMTgtZjg4Zi00ZDJkLWI0MWYtM2RhZjRhNDMzODI3XCI7XG5cbmV4cG9ydCBjb25zdCBpZGVudGl0eVN0b3JhZ2VLZXkgPSBcIm1hY2hpbmVDQV8xNFwiO1xuZXhwb3J0IHR5cGUgSWRlbnRpdHlTdG9yYWdlVHlwZSA9IHsgZG9tYWluOiBzdHJpbmc7IGNlcnRCNjQ6IHN0cmluZzsga2V5QjY0OiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gZ2V0SWRlbnRpdHlTdG9yZShkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRLZXlTdG9yZTxJZGVudGl0eVN0b3JhZ2VUeXBlPihkb21haW4sIGlkZW50aXR5U3RvcmFnZUtleSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWDUwOUtleVBhaXIgeyBkb21haW46IHN0cmluZzsgY2VydDogQnVmZmVyOyBrZXk6IEJ1ZmZlcjsgfVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uTmFtZShjZXJ0OiBCdWZmZXIgfCBzdHJpbmcpIHtcbiAgICBsZXQgc3ViamVjdCA9IG5ldyBjcnlwdG8uWDUwOUNlcnRpZmljYXRlKGNlcnQpLnN1YmplY3Q7XG4gICAgbGV0IHN1YmplY3RLVlBzID0gbmV3IE1hcChzdWJqZWN0LnNwbGl0KFwiLFwiKS5tYXAoeCA9PiB4LnRyaW0oKS5zcGxpdChcIj1cIikpLm1hcCh4ID0+IFt4WzBdLCB4LnNsaWNlKDEpLmpvaW4oXCI9XCIpXSkpO1xuICAgIGxldCBjb21tb25OYW1lID0gc3ViamVjdEtWUHMuZ2V0KFwiQ05cIik7XG4gICAgaWYgKCFjb21tb25OYW1lKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1vbiBuYW1lIGluIHN1YmplY3Q6ICR7c3ViamVjdH1gKTtcbiAgICByZXR1cm4gY29tbW9uTmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVg1MDkoXG4gICAgY29uZmlnOiB7XG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xuICAgICAgICBpc3N1ZXI6IFg1MDlLZXlQYWlyIHwgXCJzZWxmXCI7XG4gICAgICAgIGxpZmVTcGFuOiBudW1iZXI7XG4gICAgICAgIGtleVBhaXI6IHtcbiAgICAgICAgICAgIHB1YmxpY0tleTogZm9yZ2UuRWQyNTUxOVB1YmxpY0tleTtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IGZvcmdlLkVkMjU1MTlQcml2YXRlS2V5O1xuICAgICAgICB9O1xuICAgIH1cbik6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIGNyZWF0ZVg1MDkoKSB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgaXNzdWVyLCBsaWZlU3Bhbiwga2V5UGFpciB9ID0gY29uZmlnO1xuXG4gICAgICAgIGxldCBjZXJ0T2JqID0gZm9yZ2UucGtpLmNyZWF0ZUNlcnRpZmljYXRlKCk7XG4gICAgICAgIGNlcnRPYmoucHVibGljS2V5ID0ga2V5UGFpci5wdWJsaWNLZXkgYXMgdW5rbm93biBhcyBmb3JnZS5wa2kuUHVibGljS2V5O1xuICAgICAgICBjZXJ0T2JqLnNlcmlhbE51bWJlciA9IFwiMDFcIjtcbiAgICAgICAgLy8gR2l2ZSBpdCA1IG1pbnV0ZXMgYmVmb3JlIG5vdy4gSWYgd2UgZ2l2ZSBpdCB0b28gbXVjaCB0aW1lLCBpdCBjYW4gbG9vayBsaWtlIHRoZSBjZXJ0IGlzIHJlYWxseSBvbGQsIHdoaWNoIHdpbGwgdHJpZ2dlciB2YXJpb3VzIHByb2Nlc3NlcyB0byB0cnkgdG8gZ2V0IGEgZnJlc2hlciBvbmUgKGFzIGlmIGl0IGxhc3RzIGZvciAxIGhvdXIsIGJ1dCB3ZSBzZXQgbm90QmVmb3JlIHRvIDEgbW9udGggYWdvLCBpdCBsb29rcyAxIG1vbnRoIG9sZCwgYW5kIHNvIGFsbW9zdCBleHBpcmVkLCB3aGVuIGl0IGlzbid0Li4uKVxuICAgICAgICBjZXJ0T2JqLnZhbGlkaXR5Lm5vdEJlZm9yZSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAxMDAwICogNjAgKiA1KTtcbiAgICAgICAgY2VydE9iai52YWxpZGl0eS5ub3RBZnRlciA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBsaWZlU3Bhbik7XG5cbiAgICAgICAgY29uc3QgY29tbW9uTmFtZUF0dHJzID0gW3sgbmFtZTogXCJjb21tb25OYW1lXCIsIHZhbHVlOiBkb21haW4gfV07XG4gICAgICAgIGNlcnRPYmouc2V0U3ViamVjdChjb21tb25OYW1lQXR0cnMpO1xuXG4gICAgICAgIGlmIChpc3N1ZXIgPT09IFwic2VsZlwiKSB7XG4gICAgICAgICAgICBjZXJ0T2JqLnNldElzc3Vlcihjb21tb25OYW1lQXR0cnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VydE9iai5zZXRJc3N1ZXIoZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbVBlbShpc3N1ZXIuY2VydC50b1N0cmluZygpKS5zdWJqZWN0LmF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgaXNDQSA9IGlzc3VlciA9PT0gXCJzZWxmXCI7XG4gICAgICAgIGlmIChpc0NBKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zLnB1c2goeyBuYW1lOiBcImJhc2ljQ29uc3RyYWludHNcIiwgY0E6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxIb3N0RG9tYWluID0gXCIxMjctMC0wLTEuXCIgKyBkb21haW4uc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgICAgICBleHRlbnNpb25zLnB1c2goLi4uW1xuICAgICAgICAgICAgeyBuYW1lOiBcImtleVVzYWdlXCIsIGtleUNlcnRTaWduOiBpc0NBLCBkaWdpdGFsU2lnbmF0dXJlOiB0cnVlLCBub25SZXB1ZGlhdGlvbjogdHJ1ZSwga2V5RW5jaXBoZXJtZW50OiB0cnVlLCBkYXRhRW5jaXBoZXJtZW50OiB0cnVlIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwic3ViamVjdEtleUlkZW50aWZpZXJcIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic3ViamVjdEFsdE5hbWVcIixcbiAgICAgICAgICAgICAgICBhbHROYW1lczogW1xuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBkb21haW4gfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAyLCB2YWx1ZTogXCIqLlwiICsgZG9tYWluIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogMiwgdmFsdWU6IGxvY2FsSG9zdERvbWFpbiB9LFxuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBObyBsb25nZXIgYWxsb3cgMTI3LjAuMC4xICh7IHR5cGU6IDcsIGlwOiBcIjEyNy4wLjAuMVwiIH0pLCB0byBtYWtlIHRoaXMgbW9yZSBzZWN1cmUuIFdlIG1pZ2h0IGVuYWJsZSB0aGlzIGJlaGF2aW9yIGJlaGluZCBhIGZsYWcsIGZvciBkZXZlbG9wbWVudC5cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gTk9URTogbmFtZUNvbnN0cmFpbnRzIHJlcXVpcmUgb3VyIGZvcmtlZCBub2RlLWZvcmdlIChcIm5vZGUtZm9yZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3QvZm9yZ2UjZTYxODE4MWI0NjliMDdiZGM3MGI5NjhiMDM5MWJlYjhlZjVmZWNkNlwiKS4gQ2hyb21lIGlnbm9yZXMgdGhlbSAoaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTA3MjA4MyksIGJ1dCBvdXIgb3duIHZhbGlkYXRpb24gKHZhbGlkYXRlQ0FDZXJ0L3ZhbGlkYXRlQ2VydGlmaWNhdGUpIGVuZm9yY2VzIHRoZW0uXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJuYW1lQ29uc3RyYWludHNcIixcbiAgICAgICAgICAgICAgICBwZXJtaXR0ZWRTdWJ0cmVlczogW1xuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBmb3JnZS51dGlsLmVuY29kZVV0ZjgoZG9tYWluKSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBmb3JnZS51dGlsLmVuY29kZVV0ZjgobG9jYWxIb3N0RG9tYWluKSB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBjZXJ0T2JqLnNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7XG5cblxuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gc2lnbigpIHtcbiAgICAgICAgICAgIGlmIChpc3N1ZXIgPT09IFwic2VsZlwiKSB7XG4gICAgICAgICAgICAgICAgY2VydE9iai5zaWduKGtleVBhaXIucHJpdmF0ZUtleSBhcyBhbnkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZXJ0T2JqLnNpZ24oZm9yZ2UuZWQyNTUxOS5wcml2YXRlS2V5RnJvbVBlbShpc3N1ZXIua2V5LnRvU3RyaW5nKCkpIGFzIGFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtZWFzdXJlQmxvY2soZnVuY3Rpb24gdG9QZW1zKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgICAgICAgY2VydDogQnVmZmVyLmZyb20oZm9yZ2UucGtpLmNlcnRpZmljYXRlVG9QZW0oY2VydE9iaikpLFxuICAgICAgICAgICAgICAgIGtleTogQnVmZmVyLmZyb20ocHJpdmF0ZUtleVRvUGVtKGtleVBhaXIucHJpdmF0ZUtleSkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUtleVRvUGVtKGtleTogZm9yZ2UuRWQyNTUxOVByaXZhdGVLZXkpIHtcbiAgICByZXR1cm4gZm9yZ2UuZWQyNTUxOS5wcml2YXRlS2V5VG9QZW0oa2V5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNlcnQoUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcikge1xuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVGcm9tUGVtKG5vcm1hbGl6ZUNlcnRUb1BFTShQRU1vckRFUikpO1xufVxuXG5mdW5jdGlvbiBnZXRFRDI1NTE5UHVibGljS2V5KGNlcnRQYXJzZWQ6IGZvcmdlLnBraS5DZXJ0aWZpY2F0ZSk6IGZvcmdlLkVkMjU1MTlQdWJsaWNLZXkge1xuICAgIGxldCBwdWJsaWNLZXkgPSBjZXJ0UGFyc2VkLnB1YmxpY0tleTtcbiAgICBpZiAoIShcInB1YmxpY0tleUJ5dGVzXCIgaW4gcHVibGljS2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgRUQyNTUxOSBjZXJ0aWZpY2F0ZXMgYXJlIHN1cHBvcnRlZCwgdGhlIGNlcnRpZmljYXRlIHB1YmxpYyBrZXkgaXMgbm90IEVEMjU1MTkgKHN1YmplY3Q6ICR7Y2VydFBhcnNlZC5zdWJqZWN0LmdldEZpZWxkKFwiQ05cIik/LnZhbHVlfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHB1YmxpY0tleSBhcyB1bmtub3duIGFzIGZvcmdlLkVkMjU1MTlQdWJsaWNLZXk7XG59XG5cbi8vIEdldHMgYSB1bmlxdWUgdmFsdWUgdG8gcmVwcmVzZW50IHRoZSBwdWJsaWMga2V5XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHVibGljSWRlbnRpZmllcihQRU1vckRFUjogc3RyaW5nIHwgQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZ2V0RUQyNTUxOVB1YmxpY0tleShwYXJzZUNlcnQoUEVNb3JERVIpKS5wdWJsaWNLZXlCeXRlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBzaWduID0gbWVhc3VyZVdyYXAoZnVuY3Rpb24gc2lnbihrZXlQYWlyOiB7IGtleTogc3RyaW5nIHwgQnVmZmVyIH0sIGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGxldCBkYXRhU3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgbGV0IHByaXZhdGVLZXkgPSBmb3JnZS5lZDI1NTE5LnByaXZhdGVLZXlGcm9tUGVtKGtleVBhaXIua2V5LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBwcml2YXRlS2V5LnNpZ24oZGF0YVN0cik7XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeShjZXJ0OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBkYXRhOiB1bmtub3duKSB7XG4gICAgbGV0IGNlcnRPYmogPSBwYXJzZUNlcnQoY2VydCk7XG4gICAgbGV0IHB1YmxpY0tleSA9IGdldEVEMjU1MTlQdWJsaWNLZXkoY2VydE9iaik7XG4gICAgbGV0IGRhdGFTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICBpZiAoIXB1YmxpY0tleS52ZXJpZnkoZGF0YVN0ciwgc2lnbmF0dXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLiBTaWduYXR1cmU6ICR7SlNPTi5zdHJpbmdpZnkoc2lnbmF0dXJlKX0gfCBEYXRhOiAke2VsbGlwc2l6ZShkYXRhU3RyLCAxMDI0KX1gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNlcnRUb1BFTShQRU1vckRFUjogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgICBpZiAoUEVNb3JERVIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXCIpKSB7XG4gICAgICAgIHJldHVybiBQRU1vckRFUi50b1N0cmluZygpO1xuICAgIH1cbiAgICBQRU1vckRFUiA9IFBFTW9yREVSLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIHJldHVybiBcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcblwiICsgUEVNb3JERVIgKyBcIlxcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cIjtcbn1cblxuLy8gQmFzZTMyIChSRkMgNDY0OCwgbG93ZXJjYXNlLCB1bnBhZGRlZCksIGFzIGRvbWFpbiBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgd2hpY2ggcnVsZXMgb3V0IGJhc2U2NC9oZXgtd2l0aC1jYXNlXG5jb25zdCBiYXNlMzJBbHBoYWJldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIjtcbmZ1bmN0aW9uIGVuY29kZUJhc2UzMihieXRlczogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgYml0Q291bnQgPSAwO1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgYnl0ZSBvZiBieXRlcykge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IGJ5dGU7XG4gICAgICAgIGJpdENvdW50ICs9IDg7XG4gICAgICAgIHdoaWxlIChiaXRDb3VudCA+PSA1KSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYmFzZTMyQWxwaGFiZXRbKHZhbHVlID4+PiAoYml0Q291bnQgLSA1KSkgJiAzMV07XG4gICAgICAgICAgICBiaXRDb3VudCAtPSA1O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiaXRDb3VudCA+IDApIHtcbiAgICAgICAgcmVzdWx0ICs9IGJhc2UzMkFscGhhYmV0Wyh2YWx1ZSA8PCAoNSAtIGJpdENvdW50KSkgJiAzMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KHB1YmxpY0tleTogeyBwdWJsaWNLZXlCeXRlczogQnVmZmVyIH0gfCBCdWZmZXIpIHtcbiAgICBsZXQgYnl0ZXM6IEJ1ZmZlcjtcbiAgICBpZiAoXCJwdWJsaWNLZXlCeXRlc1wiIGluIHB1YmxpY0tleSkge1xuICAgICAgICBieXRlcyA9IHB1YmxpY0tleS5wdWJsaWNLZXlCeXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBieXRlcyA9IHB1YmxpY0tleTtcbiAgICB9XG4gICAgcmV0dXJuIFwiYlwiICsgZW5jb2RlQmFzZTMyKEJ1ZmZlci5mcm9tKHNoYTI2NS5zaGEyNTYuYXJyYXkoQnVmZmVyLmZyb20oYnl0ZXMpKSkpLnNsaWNlKDAsIDIwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ0FDZXJ0KGRvbWFpbjogc3RyaW5nLCBjZXJ0OiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBsZXQgY2VydFBhcnNlZCA9IHBhcnNlQ2VydChjZXJ0KTtcblxuICAgIGxldCBzdWJqZWN0ID0gY2VydFBhcnNlZC5zdWJqZWN0LmdldEZpZWxkKFwiQ05cIikudmFsdWUgYXMgc3RyaW5nO1xuICAgIGxldCBsb2NhbGhvc3REb21haW4gPSBcIjEyNy0wLTAtMS5cIiArIHN1YmplY3Quc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgIGxldCBkb21haW5QYXJ0cyA9IHN1YmplY3Quc3BsaXQoXCIuXCIpLnJldmVyc2UoKTtcblxuICAgIGxldCByb290RG9tYWluUGFyc2VkID0gW2RvbWFpblBhcnRzLnNoaWZ0KCksIGRvbWFpblBhcnRzLnNoaWZ0KCldLnJldmVyc2UoKS5qb2luKFwiLlwiKTtcbiAgICBpZiAocm9vdERvbWFpblBhcnNlZCAhPT0gZG9tYWluKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBvdXIgdHJ1c3Qgc3RvcmUgY29udGFpbnMgbW9yZSB0aGVuIGp1c3QgT1VSIGNlcnRpZmljYXRlcywgc28gaWYgd2UgYWxsb3cgYW55IGRvbWFpbnMgdGhlbiByZWFsIGRvbWFpbnMgY2FuIGltcGVyc29uYXRlIGFueW9uZSEgSXQgaGFzIHRvIGJlIE9VUiBkb21haW4gdG8gYmUgdHJ1c3RlZCFcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSByb290IGRvbWFpbiBzaG91bGQgYmUgJHtkb21haW59LCBidXQgaXMgJHtyb290RG9tYWluUGFyc2VkfWApO1xuICAgIH1cbiAgICAvLyBUT0RPOiBNYXliZSBqdXN0IHNraXAgaWYgaXQgaXNuJ3QgYSBoYXNoIHN0cmluZz9cbiAgICBpZiAoZG9tYWluUGFydHNbMF0gPT09IFwibm9wcm94eVwiKSB7XG4gICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgbGV0IGNlcnRFeHBlY3RlZFB1YmxpY0tleVBhcnQgPSAoZG9tYWluUGFydHMuc2hpZnQoKSB8fCBcIlwiKS5zcGxpdChcIi1cIikuc2xpY2UoLTEpWzBdO1xuICAgIGxldCBjZXJ0QWN0dWFsUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGdldEVEMjU1MTlQdWJsaWNLZXkoY2VydFBhcnNlZCkpO1xuICAgIGlmIChjZXJ0RXhwZWN0ZWRQdWJsaWNLZXlQYXJ0ICE9PSBjZXJ0QWN0dWFsUHVibGljS2V5UGFydCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIHB1YmxpYyBrZXkgaW4gdGhlIHVybCBpcyAke2NlcnRFeHBlY3RlZFB1YmxpY0tleVBhcnR9LCBidXQgaW4gdGhlIGNlcnQgaXMgJHtjZXJ0QWN0dWFsUHVibGljS2V5UGFydH1gKTtcbiAgICB9XG5cbiAgICAvLyBBTFNPLCByZXF1aXJlIG5hbWUgY29uc3RyYWludHMgdG8gYmUgcHJlc2VudCwgYW5kIHRvIHJlc3RyaWN0IHRvIHRoZSBcIkNOXCJcbiAgICBsZXQgbmFtZUNvbnN0cmFpbnRzID0gY2VydFBhcnNlZC5nZXRFeHRlbnNpb24oXCJuYW1lQ29uc3RyYWludHNcIikgYXMgYW55O1xuICAgIGlmICghbmFtZUNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgbXVzdCBoYXZlIG5hbWVDb25zdHJhaW50c2ApO1xuICAgIH1cbiAgICBsZXQgc3VidHJlZXMgPSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXM7XG4gICAgaWYgKCFzdWJ0cmVlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIG11c3QgaGF2ZSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXNgKTtcbiAgICB9XG4gICAgbGV0IHN1YnRyZWVWYWx1ZXMgPSBzdWJ0cmVlcy5tYXAoKHg6IGFueSkgPT4geC52YWx1ZSk7XG4gICAgLy8gSWdub3JlIGxvY2FsaG9zdERvbWFpbiwgYXMgaXQgY2FuIGFsd2F5cyBzYWZlbHkgYmUgYWxsb3dlZCAodGhlIHNhbWUgbWFjaGluZSBpcyBhbHdheXMgYWxsb3dlZCkuXG4gICAgc3VidHJlZVZhbHVlcyA9IHN1YnRyZWVWYWx1ZXMuZmlsdGVyKCh4OiBzdHJpbmcpID0+IHggIT09IGxvY2FsaG9zdERvbWFpbik7XG4gICAgaWYgKHN1YnRyZWVWYWx1ZXMubGVuZ3RoICE9PSAxIHx8IHN1YnRyZWVWYWx1ZXNbMF0gIT09IHN1YmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgYSBzaW5nbGUgY29uc3RyYWluZWQgZG9tYWluIChoYWQgJHtKU09OLnN0cmluZ2lmeShzdWJ0cmVlVmFsdWVzKX0pYCk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVBbHROYW1lcyhjZXJ0UGFyc2VkLCBzdWJqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2VydGlmaWNhdGUoZG9tYWluOiBzdHJpbmcsIGNlcnQ6IEJ1ZmZlciB8IHN0cmluZywgaXNzdWVyQ2VydDogQnVmZmVyIHwgc3RyaW5nKSB7XG4gICAgdmFsaWRhdGVDQUNlcnQoZG9tYWluLCBpc3N1ZXJDZXJ0KTtcblxuICAgIGxldCBjZXJ0UGFyc2VkID0gcGFyc2VDZXJ0KGNlcnQpO1xuICAgIGxldCBzdWJqZWN0ID0gY2VydFBhcnNlZC5zdWJqZWN0LmdldEZpZWxkKFwiQ05cIikudmFsdWUgYXMgc3RyaW5nO1xuICAgIGxldCBsb2NhbGhvc3REb21haW4gPSBcIjEyNy0wLTAtMS5cIiArIHN1YmplY3Quc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgIGxldCBkb21haW5QYXJ0cyA9IHN1YmplY3Quc3BsaXQoXCIuXCIpLnJldmVyc2UoKTtcblxuICAgIGxldCByb290RG9tYWluUGFyc2VkID0gW2RvbWFpblBhcnRzLnNoaWZ0KCksIGRvbWFpblBhcnRzLnNoaWZ0KCldLnJldmVyc2UoKS5qb2luKFwiLlwiKTtcbiAgICBpZiAocm9vdERvbWFpblBhcnNlZCAhPT0gZG9tYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgcm9vdCBkb21haW4gc2hvdWxkIGJlICR7ZG9tYWlufSwgYnV0IGlzICR7cm9vdERvbWFpblBhcnNlZH1gKTtcbiAgICB9XG4gICAgLy8gVE9ETzogTWF5YmUganVzdCBza2lwIGlmIGl0IGlzbid0IGEgaGFzaCBzdHJpbmc/XG4gICAgaWYgKGRvbWFpblBhcnRzWzBdID09PSBcIm5vcHJveHlcIikge1xuICAgICAgICBkb21haW5QYXJ0cy5zaGlmdCgpO1xuICAgIH1cblxuICAgIGxldCBpc3N1ZXJDZXJ0UGFyc2VkID0gcGFyc2VDZXJ0KGlzc3VlckNlcnQpO1xuXG4gICAgbGV0IGlzc3VlckV4cGVjdGVkUHVibGljS2V5UGFydCA9IGRvbWFpblBhcnRzLnNoaWZ0KCkgfHwgXCJcIjtcbiAgICBsZXQgaXNzdWVyQWN0dWFsUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGdldEVEMjU1MTlQdWJsaWNLZXkoaXNzdWVyQ2VydFBhcnNlZCkpO1xuICAgIGlmIChpc3N1ZXJFeHBlY3RlZFB1YmxpY0tleVBhcnQgIT09IGlzc3VlckFjdHVhbFB1YmxpY0tleVBhcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJc3N1ZXIgcHVibGljIGtleSBpbiB0aGUgdXJsIGlzICR7aXNzdWVyRXhwZWN0ZWRQdWJsaWNLZXlQYXJ0fSwgYnV0IGluIHRoZSBjZXJ0IGlzICR7aXNzdWVyQWN0dWFsUHVibGljS2V5UGFydH1gKTtcbiAgICB9XG5cbiAgICAvLyBUYWtlIHRoZSBsYXN0IHBhcnRcbiAgICBsZXQgY2VydEV4cGVjdGVkUHVibGljS2V5UGFydCA9IGRvbWFpblBhcnRzLnNoaWZ0KCkgfHwgXCJcIjtcbiAgICBsZXQgY2VydEFjdHVhbFB1YmxpY0tleVBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShnZXRFRDI1NTE5UHVibGljS2V5KGNlcnRQYXJzZWQpKTtcbiAgICBpZiAoY2VydEV4cGVjdGVkUHVibGljS2V5UGFydCAhPT0gY2VydEFjdHVhbFB1YmxpY0tleVBhcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBwdWJsaWMga2V5IGluIHRoZSB1cmwgaXMgJHtjZXJ0RXhwZWN0ZWRQdWJsaWNLZXlQYXJ0fSwgYnV0IGluIHRoZSBjZXJ0IGlzICR7Y2VydEFjdHVhbFB1YmxpY0tleVBhcnR9YCk7XG4gICAgfVxuXG5cbiAgICBsZXQgbmFtZUNvbnN0cmFpbnRzID0gaXNzdWVyQ2VydFBhcnNlZC5nZXRFeHRlbnNpb24oXCJuYW1lQ29uc3RyYWludHNcIikgYXMgYW55O1xuICAgIGlmICghbmFtZUNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ0EgbXVzdCBoYXZlIG5hbWVDb25zdHJhaW50c2ApO1xuICAgIH1cbiAgICBsZXQgc3VidHJlZXMgPSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXM7XG4gICAgaWYgKCFzdWJ0cmVlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENBIG11c3QgaGF2ZSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXNgKTtcbiAgICB9XG4gICAgbGV0IHN1YnRyZWVWYWx1ZXMgPSBzdWJ0cmVlcy5tYXAoKHg6IGFueSkgPT4geC52YWx1ZSk7XG4gICAgLy8gSWdub3JlIGxvY2FsaG9zdERvbWFpbiwgYXMgaXQgY2FuIGFsd2F5cyBzYWZlbHkgYmUgYWxsb3dlZCAodGhlIHNhbWUgbWFjaGluZSBpcyBhbHdheXMgYWxsb3dlZCkuXG4gICAgc3VidHJlZVZhbHVlcyA9IHN1YnRyZWVWYWx1ZXMuZmlsdGVyKCh4OiBzdHJpbmcpID0+IHggIT09IGxvY2FsaG9zdERvbWFpbik7XG4gICAgaWYgKHN1YnRyZWVWYWx1ZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ0EgbXVzdCBoYXZlIGEgc2luZ2xlIGNvbnN0cmFpbmVkIGRvbWFpbiAoaGFkICR7SlNPTi5zdHJpbmdpZnkoc3VidHJlZVZhbHVlcyl9KWApO1xuICAgIH1cblxuICAgIGxldCBzdWJ0cmVlID0gc3VidHJlZVZhbHVlc1swXTtcbiAgICBpZiAoc3VidHJlZSAhPT0gc3ViamVjdCAmJiAhc3ViamVjdC5lbmRzV2l0aChcIi5cIiArIHN1YnRyZWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgbXVzdCBiZSBhIHN1YnRyZWUgb2YgdGhlIENBIChDQTogJHtzdWJ0cmVlfSwgY2VydDogJHtzdWJqZWN0fSlgKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUFsdE5hbWVzKGNlcnRQYXJzZWQsIHN1YmplY3QpO1xuXG4gICAgLy8gVmVyaWZ5IGlzc3VlciBBQ1RVQUxMWSBzaWduZWQgY2VydFBhcnNlZFxuICAgIGlmICghaXNzdWVyQ2VydFBhcnNlZC52ZXJpZnkoY2VydFBhcnNlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJc3N1ZXIgZGlkIG5vdCBzaWduIGNlcnRpZmljYXRlYCk7XG4gICAgfVxufVxuXG4vLyBSZXF1aXJlIGFsdCBuYW1lcyB0byBiZSBlaXRoZXIgZXF1YWwgdG8gXCJDTlwiLCBvciBhIHN1YnRyZWUgb2YgXCJDTlwiXG5mdW5jdGlvbiB2YWxpZGF0ZUFsdE5hbWVzKGNlcnRQYXJzZWQ6IGZvcmdlLnBraS5DZXJ0aWZpY2F0ZSwgc3ViamVjdDogc3RyaW5nKSB7XG4gICAgbGV0IGxvY2FsaG9zdERvbWFpbiA9IFwiMTI3LTAtMC0xLlwiICsgc3ViamVjdC5zcGxpdChcIi5cIikuc2xpY2UoLTIpLmpvaW4oXCIuXCIpO1xuXG4gICAgbGV0IGFsdE5hbWVzT2JqID0gY2VydFBhcnNlZC5nZXRFeHRlbnNpb24oXCJzdWJqZWN0QWx0TmFtZVwiKSBhcyBhbnk7XG4gICAgbGV0IGFsdE5hbWVzID0gYWx0TmFtZXNPYmo/LmFsdE5hbWVzLm1hcCgoeDogYW55KSA9PiB4LnZhbHVlKTtcbiAgICAvLyBBbGxvdyBsb2NhbGhvc3REb21haW4sIGFzIGl0IGNhbiBhbHdheXMgc2FmZWx5IGJlIGFsbG93ZWRcbiAgICBhbHROYW1lcyA9IGFsdE5hbWVzLmZpbHRlcigoeDogc3RyaW5nKSA9PiB4ICE9PSBsb2NhbGhvc3REb21haW4pO1xuICAgIGlmIChcbiAgICAgICAgYWx0TmFtZXMuc29tZSgoeDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICB4ID09PSBzdWJqZWN0XG4gICAgICAgICAgICAgICAgfHwgeC5lbmRzV2l0aChcIi5cIiArIHN1YmplY3QpXG4gICAgICAgICAgICAgICAgLy8gTk9URTogV2UgZG9uJ3QgYWxsb3cgMTI3LjAuMC4xICh8fCB4ID09PSBCdWZmZXIuZnJvbShbMTI3LCAwLCAwLCAxXSkudG9TdHJpbmcoKSksIGJlY2F1c2UgaXQgaXMgc28gZWFzeSB0byBwdWJsaXNoIGEgMTI3LjAuMC4xIEEgcmVjb3JkLCBhbmQgZXZlbiB0byBnZW5lcmF0ZSBhIHJlYWwgY2VydCwgc28gd2Ugc2hvdWxkIGp1c3QgZG8gdGhhdCwgYW5kIGtlZXAgaXQgc2VjdXJlLiBJZiB3ZSBuZWVkIHRoaXMgZm9yIGRldmVsb3BtZW50IHdlIGNhbiBwdXQgaXQgYmVoaW5kIGEgZmxhZywgc28gbm9uLWRldmVsb3BtZW50IGluc3RhbmNlcyBhcmUgc3RpbGwgc2VjdXJlLlxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhbHQgbmFtZXMuIE11c3QgYmUgc3VidHJlZXMgb2YgdGhlIHN1YmplY3QgKENOKSAke0pTT04uc3RyaW5naWZ5KHN1YmplY3QpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkoYWx0TmFtZXMpfWApO1xuICAgIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVLZXlQYWlyKCkge1xuICAgIHJldHVybiBtZWFzdXJlQmxvY2soZnVuY3Rpb24gZ2VuZXJhdGVLZXlQYWlyKCkge1xuICAgICAgICAvLyBOT1RFOiBXZSB1c2UgRUQyNTUxOSBiZWNhdXNlIGl0IGNhbiBnZW5lcmF0ZSBrZXlzIGFib3V0IDEwWCBmYXN0ZXIgdGhhbiBSU0EgKHdoaWNoIGlzIHN0aWxsIHNsb3csIH42bXMgb24gbXkgbWFjaGluZSwgc28gd2UgREVGSU5JVEVMWSBkb24ndCB3YW50IGl0IHRvIGJlIDEwWCBzbG93ZXIhKSAtIGh0dHBzOi8vc2VjdXJpdHkuc3RhY2tleGNoYW5nZS5jb20vYS8yMzY5NDMvMjgyMzY3XG4gICAgICAgIHJldHVybiBmb3JnZS5lZDI1NTE5LmdlbmVyYXRlS2V5UGFpcigpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0Q0EoZG9tYWluOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXlQYWlyID0gZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgbGV0IGNhUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGtleVBhaXIucHVibGljS2V5KTtcbiAgICBsZXQgZnVsbERvbWFpbiA9IGAke2NhUHVibGljS2V5UGFydH0uJHtkb21haW59YDtcbiAgICByZXR1cm4gY3JlYXRlWDUwOSh7IGRvbWFpbjogZnVsbERvbWFpbiwgaXNzdWVyOiBcInNlbGZcIiwga2V5UGFpciwgbGlmZVNwYW46IHRpbWVJbkRheSAqIDM2NSAqIDIwIH0pO1xufVxuXG5sZXQgaWRlbnRpdHlDQSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4gbGF6eSgoKTogWDUwOUtleVBhaXIgPT4ge1xuICAgIGxldCBpZGVudGl0eUNBQ2FjaGVkID0gZ2V0SWRlbnRpdHlTdG9yZShkb21haW4pO1xuICAgIGxldCBjYUNhY2hlZCA9IGlkZW50aXR5Q0FDYWNoZWQuZ2V0KCk7XG4gICAgaWYgKCFjYUNhY2hlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGluZyBuZXcgaWRlbnRpdHkgQ0FgKTtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IGdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAgICBsZXQgY2FQdWJsaWNLZXlQYXJ0ID0gZ2V0RG9tYWluUGFydEZyb21QdWJsaWNLZXkoa2V5UGFpci5wdWJsaWNLZXkpO1xuICAgICAgICBsZXQgZnVsbERvbWFpbiA9IGAke2NhUHVibGljS2V5UGFydH0uJHtkb21haW59YDtcblxuICAgICAgICBsZXQgdmFsdWUgPSBjcmVhdGVYNTA5KHsgZG9tYWluOiBmdWxsRG9tYWluLCBpc3N1ZXI6IFwic2VsZlwiLCBrZXlQYWlyLCBsaWZlU3BhbjogdGltZUluRGF5ICogMzY1ICogMjAgfSk7XG5cbiAgICAgICAgY2FDYWNoZWQgPSB7XG4gICAgICAgICAgICBkb21haW46IHZhbHVlLmRvbWFpbixcbiAgICAgICAgICAgIGNlcnRCNjQ6IHZhbHVlLmNlcnQudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgICAgICBrZXlCNjQ6IHZhbHVlLmtleS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWRlbnRpdHlDQUNhY2hlZC5zZXQoY2FDYWNoZWQpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICBkb21haW46IGNhQ2FjaGVkLmRvbWFpbixcbiAgICAgICAgY2VydDogQnVmZmVyLmZyb20oY2FDYWNoZWQuY2VydEI2NCwgXCJiYXNlNjRcIiksXG4gICAgICAgIGtleTogQnVmZmVyLmZyb20oY2FDYWNoZWQua2V5QjY0LCBcImJhc2U2NFwiKSxcbiAgICB9O1xuICAgIHRydXN0Q2VydGlmaWNhdGUocmVzdWx0LmNlcnQudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0pKTtcblxuLy8gSU1QT1JUQU5UISBXZSBkbyBub3QgZW1iZWQgYW55IGRlYnVnIGluZm8gaW4gdGhpcyBkb21haW4uIElmIHdlIGRpZCwgaXQgd291bGQgYmUgdXNlZnVsLCBidXQuLi4gcG90ZW50YWxseSBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHksIGFzIGlmIHRoZSBkZWJ1ZyBpbmZvIChzdWNoIGFzIGEgcHJlZml4KSBpcyB1c2VkIHRvIGlkZW50aWZ5IHdoYXQgYSBjZXJ0aWZpY2F0ZSBpcyBmb3IsIGl0IHdvdWxkIGJlIGVhc3kgZm9yIGFuIGF0dGFjayB0byBmb3JnZSB0aGlzIChhcyB0aGUgZGVidWcgaW5mbyB3b24ndCBiZSBzZWN1cmVkKS4gU28gaXQgaXMgbXVjaCBiZXR0ZXIgdG8ga2VlcCB0aGUgY2VydGlmaWNhdGUgb3BhcXVlLCBhbmQgdGhlbiByZXF1aXJlIGFueSBtZXRhZGF0YSB0byBiZSBhY3R1YWxseSB2ZXR0ZWQgKGFuZCBob3BlZnVsbHkgc3RvcmVkIGluIGEgVUksIHNob3dpbmcgSVAsIHRpbWUsIGV0YykuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2VydEZyb21DQShjb25maWc6IHtcbiAgICBDQUtleVBhaXI6IFg1MDlLZXlQYWlyO1xufSk6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIGNyZWF0ZUNlcnRGcm9tQ0EoKSB7XG4gICAgICAgIGxldCB7IENBS2V5UGFpciB9ID0gY29uZmlnO1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICAgIGxldCBkb21haW5LZXlQYXJ0ID0gZ2V0RG9tYWluUGFydEZyb21QdWJsaWNLZXkoa2V5UGFpci5wdWJsaWNLZXkpO1xuICAgICAgICBsZXQgZnVsbERvbWFpbiA9IGAke2RvbWFpbktleVBhcnR9LiR7Y29uZmlnLkNBS2V5UGFpci5kb21haW59YDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVg1MDkoe1xuICAgICAgICAgICAgZG9tYWluOiBmdWxsRG9tYWluLFxuICAgICAgICAgICAgaXNzdWVyOiBDQUtleVBhaXIsXG4gICAgICAgICAgICBrZXlQYWlyLFxuICAgICAgICAgICAgbGlmZVNwYW46IHRpbWVJbkRheSAqIDM2NSAqIDEwLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hY2hpbmVJZChkb21haW5OYW1lT3JOb2RlSWQ6IHN0cmluZywgZG9tYWluOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGVjb2RlTm9kZUlkQXNzZXJ0KGRvbWFpbk5hbWVPck5vZGVJZCwgZG9tYWluLCBcImFsbG93TWlzc2luZ1RocmVhZElkXCIpLm1hY2hpbmVJZDtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZUlkUGFydHMgPSB7XG4gICAgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBkb21haW46IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU5vZGVJZChub2RlSWQ6IHN0cmluZywgZG9tYWluOiBzdHJpbmcsIGFsbG93TWlzc2luZ1RocmVhZElkPzogXCJhbGxvd01pc3NpbmdUaHJlYWRJZFwiKTogTm9kZUlkUGFydHMgfCB1bmRlZmluZWQge1xuICAgIGxldCBsb2NhdGlvbk9iaiA9IGdldE5vZGVJZExvY2F0aW9uKG5vZGVJZCk7XG4gICAgaWYgKCFsb2NhdGlvbk9iaikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcGFydHMgPSBsb2NhdGlvbk9iai5hZGRyZXNzLnNwbGl0KFwiLlwiKTtcbiAgICAvLyBOT1RFOiBXZSBoYXZlIHRvIG9ubHkgYWxsb3cgbG9jYWxob3N0IGRvbWFpbnMgb24gb3VyIG93biBkb21haW4sIGFzIHRoZSB1bmRlcmx5aW5nIGRvbWFpbiBnZXRzIHN0cmlwcGVkIHdoZW4gd2UncmUgbG9va2luZyBhdCB0aGUgbWFjaGluZUlkLiBTbyBpZiB3ZSBhbGxvd2VkIGxvY2FsaG9zdCBkb21haW5zIG9uIG90aGVyIGRvbWFpbnMsIGEgc2VydmVyIGNvdWxkIHRyaWNrIHVzIGludG8gY29ubmVjdGluZyB0byBpdCwgYW5kIHRoZW4gb25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgaXQgY291bGQgdGFsayBiYWNrIGFuZCB3ZSB3b3VsZCB0aGluayBpdCBoYXMgYSBsb2NhbGhvc3QgbWFjaGluZUlkLCB3aGljaCBpcyBpbXBsaWNpdGx5IHRydXN0ZWQsIHdoaWNoIHdvdWxkIHRoZW4gZ2l2ZSBpdCBhY2Nlc3MgdG8gZXZlcnl0aGluZy5cbiAgICBpZiAobG9jYXRpb25PYmouYWRkcmVzcyA9PT0gYDEyNy0wLTAtMS4ke2RvbWFpbn1gICYmIG5vZGVJZC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRocmVhZElkOiBcIlwiLFxuICAgICAgICAgICAgbWFjaGluZUlkOiBwYXJ0cy5hdCgtMykgfHwgXCJcIixcbiAgICAgICAgICAgIGRvbWFpbjogcGFydHMuc2xpY2UoLTIpLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgcG9ydDogbG9jYXRpb25PYmoucG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbGV0IGlzVmFsaWQgPSBwYXJ0cy5sZW5ndGggPj0gNCB8fCBhbGxvd01pc3NpbmdUaHJlYWRJZCAmJiBwYXJ0cy5sZW5ndGggPT09IDM7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRocmVhZElkOiBwYXJ0cy5hdCgtNCkgfHwgXCJcIixcbiAgICAgICAgbWFjaGluZUlkOiBwYXJ0cy5hdCgtMykgfHwgXCJcIixcbiAgICAgICAgZG9tYWluOiBwYXJ0cy5zbGljZSgtMikuam9pbihcIi5cIikgfHwgXCJcIixcbiAgICAgICAgcG9ydDogbG9jYXRpb25PYmoucG9ydCxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU5vZGVJZEFzc2VydChub2RlSWQ6IHN0cmluZywgZG9tYWluOiBzdHJpbmcsIGFsbG93TWlzc2luZ1RocmVhZElkPzogXCJhbGxvd01pc3NpbmdUaHJlYWRJZFwiKTogTm9kZUlkUGFydHMge1xuICAgIGxldCByZXN1bHQgPSBkZWNvZGVOb2RlSWQobm9kZUlkLCBkb21haW4sIGFsbG93TWlzc2luZ1RocmVhZElkKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbm9kZUlkOiAke0pTT04uc3RyaW5naWZ5KG5vZGVJZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlTm9kZUlkKHBhcnRzOiBOb2RlSWRQYXJ0cykge1xuICAgIHJldHVybiBgJHtwYXJ0cy50aHJlYWRJZH0uJHtwYXJ0cy5tYWNoaW5lSWR9LiR7cGFydHMuZG9tYWlufToke3BhcnRzLnBvcnR9YDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldElkZW50aXR5Q0FSYXcoZG9tYWluOiBzdHJpbmcsIGpzb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eUNBQ2FjaGVkID0gZ2V0SWRlbnRpdHlTdG9yZShkb21haW4pO1xuICAgIGxldCBvYmogPSBKU09OLnBhcnNlKGpzb24pIGFzIHtcbiAgICAgICAgZG9tYWluOiBzdHJpbmc7XG4gICAgICAgIGNlcnRCNjQ6IHN0cmluZztcbiAgICAgICAga2V5QjY0OiBzdHJpbmc7XG4gICAgfTtcbiAgICBsZXQgY2EgPSB7XG4gICAgICAgIGRvbWFpbjogb2JqLmRvbWFpbixcbiAgICAgICAgY2VydDogQnVmZmVyLmZyb20ob2JqLmNlcnRCNjQsIFwiYmFzZTY0XCIpLFxuICAgICAgICBrZXk6IEJ1ZmZlci5mcm9tKG9iai5rZXlCNjQsIFwiYmFzZTY0XCIpLFxuICAgIH07XG4gICAgdHJ1c3RDZXJ0aWZpY2F0ZShjYS5jZXJ0LnRvU3RyaW5nKCkpO1xuICAgIGlkZW50aXR5Q0EoZG9tYWluKS5zZXQoY2EpO1xuICAgIGdldFRocmVhZEtleUNlcnRCYXNlKGRvbWFpbikucmVzZXQoKTtcbiAgICBpZGVudGl0eUNBQ2FjaGVkLnNldChvYmopO1xuICAgIHJlc2V0QWxsTm9kZUNhbGxGYWN0b3JpZXMoKTtcbn1cblxuLy8gTk9URTogVGhlIGlkZW50aXR5IENBIGlzIGF2YWlsYWJsZSBzeW5jaHJvbm91c2x5IChzdG9yYWdlIGlzIGZzL2xvY2FsU3RvcmFnZSwgYm90aCBzeW5jaHJvbm91cyksIHNvIHRoaXMgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggc3RhcnR1cCBjb2RlIHRoYXQgYXdhaXRzIGl0LlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRJZGVudGl0eUNBKGRvbWFpbjogc3RyaW5nKSB7XG4gICAgaWRlbnRpdHlDQShkb21haW4pKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRlbnRpdHlDQShkb21haW46IHN0cmluZyk6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gaWRlbnRpdHlDQShkb21haW4pKCk7XG59XG5cbi8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGEgZGF0YWJhc2UsIHNvIGl0IGlzIGVhc3kgZm9yIHVzIHRvIHRydXN0IENBcyBjcm9zcyBtYWNoaW5lLCBhbmQgZXZlbiBoYXZlIG11bHRpcGxlIHVzZXJzLCBldGMsIGV0Yy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVudGl0eUNBUHJvbWlzZShkb21haW46IHN0cmluZyk6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gaWRlbnRpdHlDQShkb21haW4pKCk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE93bk1hY2hpbmVJZChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRNYWNoaW5lSWQoZ2V0SWRlbnRpdHlDQShkb21haW4pLmRvbWFpbiwgZG9tYWluKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPd25UaHJlYWRJZChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBkZWNvZGVOb2RlSWRBc3NlcnQoZ2V0VGhyZWFkS2V5Q2VydChkb21haW4pLmRvbWFpbiwgZG9tYWluKS50aHJlYWRJZDtcbn1cblxuLyoqIFBhcnQgb2YgdGhlIG1hY2hpbmVJZCBjb21lcyBmcm9tIHRoZSBwdWJsaWNLZXksIHNvIHdlIGNhbiB1c2UgaXQgdG8gdmVyaWZ5ICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5TWFjaGluZUlkRm9yUHVibGljS2V5KGNvbmZpZzoge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIHB1YmxpY0tleTogQnVmZmVyO1xufSk6IGJvb2xlYW4ge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgcHVibGljS2V5IH0gPSBjb25maWc7XG4gICAgbGV0IGRvbWFpblBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIC8vIG1hY2hpbmVJZCBpcyB0aGUgYmFyZSBrZXktaGFzaCBsYWJlbCwgYnV0IGFsc28gYWNjZXB0IGxlZ2FjeSBcImhhc2guZG9tYWluLnRsZFwiIGZvcm1zXG4gICAgcmV0dXJuIG1hY2hpbmVJZC5zcGxpdChcIi5cIilbMF0gPT09IGRvbWFpblBhcnQ7XG59XG5cbi8vIE5PVEU6IFdlIGRvbid0IGhhdmUgYSBjYWNoZSBwZXIgQ0EsIGFzLi4uIHRoZSBDQSBzaG91bGQgYmUgc2V0IGZpcnN0XG4vLyBUT0RPOiBNYXliZSB0aHJvdyBpZiB0aGV5IHRyeSB0byBjaGFuZ2UgdGhlIENBIGFmdGVyIHRoZXkgZ2VuZXJhdGUgYW55IGNlcnRpZmljYXRlcz9cbi8vIFRPRE86IFJlZ2VuZXJhdGUgY2VydGlmaWNhdGVzIGFmdGVyIGVub3VnaCB0aW1lIChhcyB0aHJlYWQgY2VydHMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgc2hvcnQgbGl2ZWQsIHNvIGl0IGlzIHBsYXVzaWJsZSBmb3IgdGhlbSB0byBleHBpcmUpLiBXZSB3aWxsIGFsc28gbmVlZCB0byBwcm92aWRlIGEgY2FsbGJhY2sgc28gdGhhdCB1c2VycyBvZiB0aGUgY2VydCBjYW4gdXBkYXRlIHRoZSBjZXJ0IHRoZXkgYXJlIHVzaW5nIGFzIHdlbGwuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhyZWFkS2V5Q2VydChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRUaHJlYWRLZXlDZXJ0QmFzZShkb21haW4pKCk7XG59XG5jb25zdCBnZXRUaHJlYWRLZXlDZXJ0QmFzZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4gbGF6eSgoKSA9PiB7XG4gICAgbGV0IGNhID0gZ2V0SWRlbnRpdHlDQShkb21haW4pO1xuICAgIHJldHVybiBjcmVhdGVDZXJ0RnJvbUNBKHsgQ0FLZXlQYWlyOiBjYSB9KTtcbn0pKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE93bk5vZGVJZCgpOiBzdHJpbmcge1xuICAgIGxldCBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5tb3VudGVkTm9kZUlkO1xuICAgIGlmICghbm9kZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtdXN0IGJlIG1vdW50ZWQgYmVmb3JlIG5vZGVJZCBpcyBhY2Nlc3NlZGApO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZUlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duTm9kZUlkQWxsb3dVbmRlZmluZWQoKSB7XG4gICAgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLm1vdW50ZWROb2RlSWQ7XG59Il19
|
|
466
|
-
/* _JS_SOURCE_HASH = "
|
|
466
|
+
/* _JS_SOURCE_HASH = "73999cf2a77f1126ddf8afa0f7f391e81df1d4be734a228aa16f0af606c50da3"; */
|
|
@@ -13,10 +13,7 @@ const DNS_TTLSeconds = {
|
|
|
13
13
|
};
|
|
14
14
|
const DNS_REFRESH_STALE_AFTER = misc_1.timeInDay;
|
|
15
15
|
// We stamp our own "last asserted" time into the record's comment, because Cloudflare's
|
|
16
|
-
// modified_on can only be moved by an actual content change - and re-asserting an already
|
|
17
|
-
// correct record has no content change to make (a create errors with 81058, a no-op edit
|
|
18
|
-
// doesn't bump the timestamp). Reading freshness from text we control sidesteps that entirely,
|
|
19
|
-
// and lets us refresh a stale-but-correct record in place instead of deleting and recreating it.
|
|
16
|
+
// modified_on can only be moved by an actual content change - and re-asserting an already correct record has no content change to make (a create errors with 81058, a no-op edit doesn't bump the timestamp). Reading freshness from text we control sidesteps that entirely, and lets us refresh a stale-but-correct record in place instead of deleting and recreating it.
|
|
20
17
|
const FRESHNESS_REGEX = /<set on:[^>]*>/;
|
|
21
18
|
/** Strips any prior freshness tag and appends a new one, preserving other comment text. */
|
|
22
19
|
function stampFreshness(comment) {
|
|
@@ -62,16 +59,12 @@ async function getRecordsRaw(type, key) {
|
|
|
62
59
|
key = key.slice(0, -1);
|
|
63
60
|
let zoneId = await (0, exports.getZoneId)(getRootDomain(key));
|
|
64
61
|
let results = await (0, cloudflareHelpers_1.cloudflareGETCall)(`/zones/${zoneId}/dns_records`);
|
|
65
|
-
// DNS names are case-insensitive and Cloudflare returns them lowercased, so a mixed-case key
|
|
66
|
-
// (e.g. a machine id subdomain) would never match an exact-case compare - match lowercased.
|
|
62
|
+
// DNS names are case-insensitive and Cloudflare returns them lowercased, so a mixed-case key (e.g. a machine id subdomain) would never match an exact-case compare - match lowercased.
|
|
67
63
|
let keyLower = key.toLowerCase();
|
|
68
64
|
return results.filter(x => x.type === type && x.name.toLowerCase() === keyLower);
|
|
69
65
|
}
|
|
70
66
|
exports.getRecordsRaw = getRecordsRaw;
|
|
71
|
-
/** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database
|
|
72
|
-
* transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs
|
|
73
|
-
* aren't usable in our setup, and because it lets "remove others + assert target" happen
|
|
74
|
-
* without a window where the name resolves to nothing. */
|
|
67
|
+
/** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs aren't usable in our setup, and because it lets "remove others + assert target" happen without a window where the name resolves to nothing. */
|
|
75
68
|
async function batchRecords(zoneId, batch) {
|
|
76
69
|
let payload = {};
|
|
77
70
|
if (batch.deletes && batch.deletes.length > 0)
|
|
@@ -122,12 +115,10 @@ async function setRecord(type, key, value, proxied, staleAfter = DNS_REFRESH_STA
|
|
|
122
115
|
let prevValues = await getRecordsRaw(type, key);
|
|
123
116
|
let existing = prevValues.find(x => x.content === value);
|
|
124
117
|
let others = prevValues.filter(x => x.content !== value);
|
|
125
|
-
// Already correct and recently asserted - a prior run also cleaned up the other records,
|
|
126
|
-
// so there is nothing left to do.
|
|
118
|
+
// Already correct and recently asserted - a prior run also cleaned up the other records, so there is nothing left to do.
|
|
127
119
|
if (existing && Date.now() - freshnessTime(existing.comment) < staleAfter)
|
|
128
120
|
return;
|
|
129
|
-
// A single atomic batch: drop the wrong records, and either refresh the existing record's
|
|
130
|
-
// comment in place or create it - so the name is never left resolving to nothing.
|
|
121
|
+
// A single atomic batch: drop the wrong records, and either refresh the existing record's comment in place or create it - so the name is never left resolving to nothing.
|
|
131
122
|
let ttl = DNS_TTLSeconds[type] || 60;
|
|
132
123
|
let comment = stampFreshness(existing === null || existing === void 0 ? void 0 : existing.comment);
|
|
133
124
|
console.log((0, logColors_1.magenta)(`Setting ${type} record for ${key} to ${value} (previously had ${JSON.stringify(prevValues.map(x => x.content))})`));
|
|
@@ -174,5 +165,5 @@ async function addRecord(type, key, value, proxied, staleAfter = DNS_REFRESH_STA
|
|
|
174
165
|
console.log(`Done waiting for DNS to update.`);
|
|
175
166
|
}
|
|
176
167
|
exports.addRecord = addRecord;
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUEwRDtBQUMxRCwyREFBcUQ7QUFDckQsbUVBQWdFO0FBQ2hFLG1EQUE2RDtBQUM3RCx3RUFBbUU7QUFDbkUsMkRBQWdIO0FBRWhILE1BQU0sY0FBYyxHQUFHO0lBQ25CLEtBQUssRUFBRSxFQUFFO0lBQ1QsR0FBRyxFQUFFLEVBQUU7Q0FDVixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxnQkFBUyxDQUFDO0FBRTFDLHdGQUF3RjtBQUN4RiwyRkFBMkY7QUFDM0YsMEZBQTBGO0FBQzFGLGdHQUFnRztBQUNoRyxrR0FBa0c7QUFDbEcsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFFekMsMkZBQTJGO0FBQzNGLFNBQVMsY0FBYyxDQUFDLE9BQWdCO0lBQ3BDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztJQUNqRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM3QyxDQUFDO0FBQ0Qsc0ZBQXNGO0FBQ3RGLFNBQWdCLGFBQWEsQ0FBQyxPQUFnQjtJQUMxQyxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDckIsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxD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QUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvSCxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDdkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7S0FDN0csQ0FBQyxDQUFDO0lBQ0gsSUFBSSxRQUFRO1FBQUUsT0FBTztJQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQzlELEtBQUssSUFBSSxPQUFPLEdBQUcsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUEsZ0JBQUssRUFBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQXRCRCw4QkFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYWNoZSwgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgaXNOb2RlLCB0aW1lSW5EYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IGNsb3VkZmxhcmVDYWxsLCBjbG91ZGZsYXJlR0VUQ2FsbCwgY2xvdWRmbGFyZVBPU1RDYWxsLCBnZXRDbG91ZGZsYXJlQ3JlZHMgfSBmcm9tIFwiLi9jbG91ZGZsYXJlSGVscGVyc1wiO1xuXG5jb25zdCBETlNfVFRMU2Vjb25kcyA9IHtcbiAgICBcIlRYVFwiOiA2MCxcbiAgICBcIkFcIjogNjAsXG59O1xuXG5jb25zdCBETlNfUkVGUkVTSF9TVEFMRV9BRlRFUiA9IHRpbWVJbkRheTtcblxuLy8gV2Ugc3RhbXAgb3VyIG93biBcImxhc3QgYXNzZXJ0ZWRcIiB0aW1lIGludG8gdGhlIHJlY29yZCdzIGNvbW1lbnQsIGJlY2F1c2UgQ2xvdWRmbGFyZSdzXG4vLyAgbW9kaWZpZWRfb24gY2FuIG9ubHkgYmUgbW92ZWQgYnkgYW4gYWN0dWFsIGNvbnRlbnQgY2hhbmdlIC0gYW5kIHJlLWFzc2VydGluZyBhbiBhbHJlYWR5XG4vLyAgY29ycmVjdCByZWNvcmQgaGFzIG5vIGNvbnRlbnQgY2hhbmdlIHRvIG1ha2UgKGEgY3JlYXRlIGVycm9ycyB3aXRoIDgxMDU4LCBhIG5vLW9wIGVkaXRcbi8vICBkb2Vzbid0IGJ1bXAgdGhlIHRpbWVzdGFtcCkuIFJlYWRpbmcgZnJlc2huZXNzIGZyb20gdGV4dCB3ZSBjb250cm9sIHNpZGVzdGVwcyB0aGF0IGVudGlyZWx5LFxuLy8gIGFuZCBsZXRzIHVzIHJlZnJlc2ggYSBzdGFsZS1idXQtY29ycmVjdCByZWNvcmQgaW4gcGxhY2UgaW5zdGVhZCBvZiBkZWxldGluZyBhbmQgcmVjcmVhdGluZyBpdC5cbmNvbnN0IEZSRVNITkVTU19SRUdFWCA9IC88c2V0IG9uOltePl0qPi87XG5cbi8qKiBTdHJpcHMgYW55IHByaW9yIGZyZXNobmVzcyB0YWcgYW5kIGFwcGVuZHMgYSBuZXcgb25lLCBwcmVzZXJ2aW5nIG90aGVyIGNvbW1lbnQgdGV4dC4gKi9cbmZ1bmN0aW9uIHN0YW1wRnJlc2huZXNzKGNvbW1lbnQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBiYXNlID0gKGNvbW1lbnQgPz8gXCJcIikucmVwbGFjZShGUkVTSE5FU1NfUkVHRVgsIFwiXCIpLnRyaW0oKTtcbiAgICBsZXQgc3RhbXAgPSBgPHNldCBvbjogJHtuZXcgRGF0ZSgpLnRvU3RyaW5nKCl9PmA7XG4gICAgcmV0dXJuIGJhc2UgPyBgJHtiYXNlfSAke3N0YW1wfWAgOiBzdGFtcDtcbn1cbi8qKiBQYXJzZXMgb3VyIHRhZyBiYWNrIG91dDsgMCAoaS5lLiBhbHdheXMgc3RhbGUpIHdoZW4gaXQncyBhYnNlbnQgb3IgdW5wYXJzZWFibGUuICovXG5leHBvcnQgZnVuY3Rpb24gZnJlc2huZXNzVGltZShjb21tZW50Pzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgbWF0Y2ggPSBGUkVTSE5FU1NfUkVHRVguZXhlYyhjb21tZW50ID8/IFwiXCIpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiAwO1xuICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFswXS5yZXBsYWNlKFwiPHNldCBvbjpcIiwgXCJcIikucmVwbGFjZShcIj5cIiwgXCJcIikudHJpbSgpKS5nZXRUaW1lKCkgfHwgMDtcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0ROU1dyaXRlUGVybWlzc2lvbnMgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWlzTm9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ2V0Q2xvdWRmbGFyZUNyZWRzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBnZXRab25lSWQgPSBjYWNoZShhc3luYyAocm9vdERvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBsZXQgem9uZXMgPSBhd2FpdCBjbG91ZGZsYXJlR0VUQ2FsbDx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10+KFwiL3pvbmVzXCIsIHt9KTtcbiAgICBsZXQgc2VsZWN0ZWQgPSB6b25lcy5maW5kKHggPT4geC5uYW1lID09PSByb290RG9tYWluKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgem9uZSBmb3IgJHtyb290RG9tYWlufS4gRm91bmQgJHt6b25lcy5tYXAoeCA9PiB4Lm5hbWUpLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkLmlkO1xufSk7XG5cbmZ1bmN0aW9uIGdldFJvb3REb21haW4oa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5LnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWNvcmRzUmF3KHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgem9uZUlkID0gYXdhaXQgZ2V0Wm9uZUlkKGdldFJvb3REb21haW4oa2V5KSk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjbG91ZGZsYXJlR0VUQ2FsbDx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgICAgIHByb3hpZWQ6IGJvb2xlYW47XG4gICAgICAgIG1vZGlmaWVkX29uOiBzdHJpbmc7XG4gICAgICAgIC8vIE9taXR0ZWQgYnkgQ2xvdWRmbGFyZSB3aGVuIHRoZSByZWNvcmQgaGFzIG5vIGNvbW1lbnQuXG4gICAgICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgfVtdPihgL3pvbmVzLyR7em9uZUlkfS9kbnNfcmVjb3Jkc2ApO1xuICAgIC8vIEROUyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgQ2xvdWRmbGFyZSByZXR1cm5zIHRoZW0gbG93ZXJjYXNlZCwgc28gYSBtaXhlZC1jYXNlIGtleVxuICAgIC8vICAoZS5nLiBhIG1hY2hpbmUgaWQgc3ViZG9tYWluKSB3b3VsZCBuZXZlciBtYXRjaCBhbiBleGFjdC1jYXNlIGNvbXBhcmUgLSBtYXRjaCBsb3dlcmNhc2VkLlxuICAgIGxldCBrZXlMb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcih4ID0+IHgudHlwZSA9PT0gdHlwZSAmJiB4Lm5hbWUudG9Mb3dlckNhc2UoKSA9PT0ga2V5TG93ZXIpO1xufVxuXG4vKiogQ2xvdWRmbGFyZSdzIGJhdGNoIGVuZHBvaW50IGFwcGxpZXMgZGVsZXRlcywgdGhlbiBwYXRjaGVzLCB0aGVuIHBvc3RzIGluIGEgc2luZ2xlIGRhdGFiYXNlXG4gKiAgIHRyYW5zYWN0aW9uLiBXZSByb3V0ZSBlZGl0cyAocGF0Y2hlcykgdGhyb3VnaCBoZXJlIGJlY2F1c2UgdGhlIHN0YW5kYWxvbmUgUEFUQ0gvUFVUIHZlcmJzXG4gKiAgIGFyZW4ndCB1c2FibGUgaW4gb3VyIHNldHVwLCBhbmQgYmVjYXVzZSBpdCBsZXRzIFwicmVtb3ZlIG90aGVycyArIGFzc2VydCB0YXJnZXRcIiBoYXBwZW5cbiAqICAgd2l0aG91dCBhIHdpbmRvdyB3aGVyZSB0aGUgbmFtZSByZXNvbHZlcyB0byBub3RoaW5nLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJhdGNoUmVjb3Jkcyh6b25lSWQ6IHN0cmluZywgYmF0Y2g6IHtcbiAgICBkZWxldGVzPzogeyBpZDogc3RyaW5nIH1bXTtcbiAgICBwYXRjaGVzPzogeyBpZDogc3RyaW5nOyBjb21tZW50Pzogc3RyaW5nIH1bXTtcbiAgICBwb3N0cz86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZzsgdHRsOiBudW1iZXI7IHByb3hpZWQ6IGJvb2xlYW47IGNvbW1lbnQ/OiBzdHJpbmcgfVtdO1xufSkge1xuICAgIGxldCBwYXlsb2FkOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9O1xuICAgIGlmIChiYXRjaC5kZWxldGVzICYmIGJhdGNoLmRlbGV0ZXMubGVuZ3RoID4gMCkgcGF5bG9hZC5kZWxldGVzID0gYmF0Y2guZGVsZXRlcztcbiAgICBpZiAoYmF0Y2gucGF0Y2hlcyAmJiBiYXRjaC5wYXRjaGVzLmxlbmd0aCA+IDApIHBheWxvYWQucGF0Y2hlcyA9IGJhdGNoLnBhdGNoZXM7XG4gICAgaWYgKGJhdGNoLnBvc3RzICYmIGJhdGNoLnBvc3RzLmxlbmd0aCA+IDApIHBheWxvYWQucG9zdHMgPSBiYXRjaC5wb3N0cztcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbG91ZGZsYXJlUE9TVENhbGwoYC96b25lcy8ke3pvbmVJZH0vZG5zX3JlY29yZHMvYmF0Y2hgLCBwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB1cGRhdGluZyBETlMgcmVjb3JkczpgLCB7IGVycm9yOiBlcnJvciwgYmF0Y2ggfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgdXBkYXRpbmcgRE5TIHJlY29yZHMuICR7SlNPTi5zdHJpbmdpZnkoYmF0Y2gpfS4gRXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlY29yZHModHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIGxldCByYXcgPSBhd2FpdCBnZXRSZWNvcmRzUmF3KHR5cGUsIGtleSk7XG4gICAgcmV0dXJuIHJhdy5tYXAoeCA9PiB4LmNvbnRlbnQpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJlY29yZCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi5cIikpIGtleSA9IGtleS5zbGljZSgwLCAtMSk7XG4gICAgbGV0IHpvbmVJZCA9IGF3YWl0IGdldFpvbmVJZChnZXRSb290RG9tYWluKGtleSkpO1xuICAgIGxldCBwcmV2VmFsdWVzID0gYXdhaXQgZ2V0UmVjb3Jkc1Jhdyh0eXBlLCBrZXkpO1xuICAgIHByZXZWYWx1ZXMgPSBwcmV2VmFsdWVzLmZpbHRlcih4ID0+IHguY29udGVudCA9PT0gdmFsdWUpO1xuICAgIGlmIChwcmV2VmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoIVNvY2tldEZ1bmN0aW9uLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE5vIG5lZWQgdG8gZGVsZXRlIHJlY29yZCwgaXQgd2FzIG5vdCBmb3VuZC4gJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IHZhbHVlIHdhcyBub3QgaW4gJHt0eXBlfSBmb3IgJHtrZXl9LCB2YWx1ZXMgJHtKU09OLnN0cmluZ2lmeShwcmV2VmFsdWVzLm1hcCh4ID0+IHguY29udGVudCkpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgcmVjb3JkcyBvZiAke3R5cGV9IGZvciAke2tleX0sIHZhbHVlcyAke0pTT04uc3RyaW5naWZ5KHByZXZWYWx1ZXMubWFwKHggPT4geC5jb250ZW50KSl9YCk7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgcHJldlZhbHVlcykge1xuICAgICAgICBhd2FpdCBjbG91ZGZsYXJlQ2FsbChgL3pvbmVzLyR7em9uZUlkfS9kbnNfcmVjb3Jkcy8ke3ZhbHVlLmlkfWAsIEJ1ZmZlci5mcm9tKFtdKSwgXCJERUxFVEVcIik7XG4gICAgfVxufVxuLyoqIFJlbW92ZXMgYWxsIGV4aXN0aW5nIHJlY29yZHMgKHVubGVzcyB0aGUgcmVjb3JkIGlzIGFscmVhZHkgcHJlc2VudCBhbmQgZnJlc2gpICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UmVjb3JkKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHByb3hpZWQ/OiBcInByb3hpZWRcIiwgc3RhbGVBZnRlciA9IEROU19SRUZSRVNIX1NUQUxFX0FGVEVSKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi5cIikpIGtleSA9IGtleS5zbGljZSgwLCAtMSk7XG4gICAgbGV0IHpvbmVJZCA9IGF3YWl0IGdldFpvbmVJZChnZXRSb290RG9tYWluKGtleSkpO1xuICAgIGxldCBwcmV2VmFsdWVzID0gYXdhaXQgZ2V0UmVjb3Jkc1Jhdyh0eXBlLCBrZXkpO1xuICAgIGxldCBleGlzdGluZyA9IHByZXZWYWx1ZXMuZmluZCh4ID0+IHguY29udGVudCA9PT0gdmFsdWUpO1xuICAgIGxldCBvdGhlcnMgPSBwcmV2VmFsdWVzLmZpbHRlcih4ID0+IHguY29udGVudCAhPT0gdmFsdWUpO1xuXG4gICAgLy8gQWxyZWFkeSBjb3JyZWN0IGFuZCByZWNlbnRseSBhc3NlcnRlZCAtIGEgcHJpb3IgcnVuIGFsc28gY2xlYW5lZCB1cCB0aGUgb3RoZXIgcmVjb3JkcyxcbiAgICAvLyAgc28gdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGRvLlxuICAgIGlmIChleGlzdGluZyAmJiBEYXRlLm5vdygpIC0gZnJlc2huZXNzVGltZShleGlzdGluZy5jb21tZW50KSA8IHN0YWxlQWZ0ZXIpIHJldHVybjtcblxuICAgIC8vIEEgc2luZ2xlIGF0b21pYyBiYXRjaDogZHJvcCB0aGUgd3JvbmcgcmVjb3JkcywgYW5kIGVpdGhlciByZWZyZXNoIHRoZSBleGlzdGluZyByZWNvcmQnc1xuICAgIC8vICBjb21tZW50IGluIHBsYWNlIG9yIGNyZWF0ZSBpdCAtIHNvIHRoZSBuYW1lIGlzIG5ldmVyIGxlZnQgcmVzb2x2aW5nIHRvIG5vdGhpbmcuXG4gICAgbGV0IHR0bCA9IEROU19UVExTZWNvbmRzW3R5cGUgYXMgXCJBXCJdIHx8IDYwO1xuICAgIGxldCBjb21tZW50ID0gc3RhbXBGcmVzaG5lc3MoZXhpc3Rpbmc/LmNvbW1lbnQpO1xuICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYFNldHRpbmcgJHt0eXBlfSByZWNvcmQgZm9yICR7a2V5fSB0byAke3ZhbHVlfSAocHJldmlvdXNseSBoYWQgJHtKU09OLnN0cmluZ2lmeShwcmV2VmFsdWVzLm1hcCh4ID0+IHguY29udGVudCkpfSlgKSk7XG4gICAgYXdhaXQgYmF0Y2hSZWNvcmRzKHpvbmVJZCwge1xuICAgICAgICBkZWxldGVzOiBvdGhlcnMubWFwKHggPT4gKHsgaWQ6IHguaWQgfSkpLFxuICAgICAgICBwYXRjaGVzOiBleGlzdGluZyA/IFt7IGlkOiBleGlzdGluZy5pZCwgY29tbWVudCB9XSA6IFtdLFxuICAgICAgICBwb3N0czogZXhpc3RpbmcgPyBbXSA6IFt7IHR5cGUsIG5hbWU6IGtleSwgY29udGVudDogdmFsdWUsIHR0bCwgcHJveGllZDogcHJveGllZCA9PT0gXCJwcm94aWVkXCIsIGNvbW1lbnQgfV0sXG4gICAgfSk7XG4gICAgLy8gT25seSBhIGJyYW5kIG5ldyByZWNvcmQgbmVlZHMgdG8gcHJvcGFnYXRlOyBhbiBpbi1wbGFjZSBjb21tZW50IHJlZnJlc2ggZG9lc24ndCBjaGFuZ2UgdGhlIGFuc3dlci5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXYWl0aW5nICR7dHRsfSBzZWNvbmRzIGZvciBETlMgdG8gcHJvcGFnYXRlLi4uYCk7XG4gICAgICAgIGZvciAobGV0IHR0bExlZnQgPSB0dGw7IHR0bExlZnQgPiAwOyB0dGxMZWZ0LS0pIHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dHRsTGVmdH0gc2Vjb25kcyBsZWZ0Li4uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYERvbmUgd2FpdGluZyBmb3IgRE5TIHRvIHVwZGF0ZS5gKTtcbiAgICB9XG59XG4vKiogS2VlcHMgZXhpc3RpbmcgcmVjb3JkcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFJlY29yZCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBwcm94aWVkPzogXCJwcm94aWVkXCIsIHN0YWxlQWZ0ZXIgPSBETlNfUkVGUkVTSF9TVEFMRV9BRlRFUikge1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIGxldCB6b25lSWQgPSBhd2FpdCBnZXRab25lSWQoZ2V0Um9vdERvbWFpbihrZXkpKTtcbiAgICBsZXQgcHJldlZhbHVlcyA9IGF3YWl0IGdldFJlY29yZHNSYXcodHlwZSwga2V5KTtcbiAgICBsZXQgZXhpc3RpbmcgPSBwcmV2VmFsdWVzLmZpbmQoeCA9PiB4LmNvbnRlbnQgPT09IHZhbHVlKTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgRGF0ZS5ub3coKSAtIGZyZXNobmVzc1RpbWUoZXhpc3RpbmcuY29tbWVudCkgPCBzdGFsZUFmdGVyKSByZXR1cm47XG5cbiAgICAvLyBTYW1lIHNpbmdsZS1iYXRjaCBmbG93IGFzIHNldFJlY29yZCwgbWludXMgdGhlIGRlbGV0ZXMgKHdlIGtlZXAgc2libGluZyByZWNvcmRzIGhlcmUpLlxuICAgIGxldCB0dGwgPSBETlNfVFRMU2Vjb25kc1t0eXBlIGFzIFwiQVwiXSB8fCA2MDtcbiAgICBsZXQgY29tbWVudCA9IHN0YW1wRnJlc2huZXNzKGV4aXN0aW5nPy5jb21tZW50KTtcbiAgICBjb25zb2xlLmxvZyhgQWRkaW5nICR7dHlwZX0gcmVjb3JkIGZvciAke2tleX0gdG8gJHt2YWx1ZX0gKHByZXZpb3VzbHkgaGFkICR7SlNPTi5zdHJpbmdpZnkocHJldlZhbHVlcy5tYXAoeCA9PiB4LmNvbnRlbnQpKX0pYCk7XG4gICAgYXdhaXQgYmF0Y2hSZWNvcmRzKHpvbmVJZCwge1xuICAgICAgICBwYXRjaGVzOiBleGlzdGluZyA/IFt7IGlkOiBleGlzdGluZy5pZCwgY29tbWVudCB9XSA6IFtdLFxuICAgICAgICBwb3N0czogZXhpc3RpbmcgPyBbXSA6IFt7IHR5cGUsIG5hbWU6IGtleSwgY29udGVudDogdmFsdWUsIHR0bCwgcHJveGllZDogcHJveGllZCA9PT0gXCJwcm94aWVkXCIsIGNvbW1lbnQgfV0sXG4gICAgfSk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm47XG4gICAgY29uc29sZS5sb2coYFdhaXRpbmcgJHt0dGx9IHNlY29uZHMgZm9yIEROUyB0byBwcm9wYWdhdGUuLi5gKTtcbiAgICBmb3IgKGxldCB0dGxMZWZ0ID0gdHRsOyB0dGxMZWZ0ID4gMDsgdHRsTGVmdC0tKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHt0dGxMZWZ0fSBzZWNvbmRzIGxlZnQuLi5gKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYERvbmUgd2FpdGluZyBmb3IgRE5TIHRvIHVwZGF0ZS5gKTtcbn1cbiJdfQ==
|
|
178
|
-
/* _JS_SOURCE_HASH = "
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUEwRDtBQUMxRCwyREFBcUQ7QUFDckQsbUVBQWdFO0FBQ2hFLG1EQUE2RDtBQUM3RCx3RUFBbUU7QUFDbkUsMkRBQWdIO0FBRWhILE1BQU0sY0FBYyxHQUFHO0lBQ25CLEtBQUssRUFBRSxFQUFFO0lBQ1QsR0FBRyxFQUFFLEVBQUU7Q0FDVixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxnQkFBUyxDQUFDO0FBRTFDLHdGQUF3RjtBQUN4Riw4V0FBOFc7QUFDOVcsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFFekMsMkZBQTJGO0FBQzNGLFNBQVMsY0FBYyxDQUFDLE9BQWdCO0lBQ3BDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztJQUNqRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM3QyxDQUFDO0FBQ0Qsc0ZBQXNGO0FBQ3RGLFNBQWdCLGFBQWEsQ0FBQyxPQUFnQjtJQUMxQyxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDckIsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMs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LENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3ZELEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEtBQUssU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0tBQzdHLENBQUMsQ0FBQztJQUNILElBQUksUUFBUTtRQUFFLE9BQU87SUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxLQUFLLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFBLGdCQUFLLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sa0JBQWtCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUF0QkQsOEJBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IGlzTm9kZSwgdGltZUluRGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgeyBjbG91ZGZsYXJlQ2FsbCwgY2xvdWRmbGFyZUdFVENhbGwsIGNsb3VkZmxhcmVQT1NUQ2FsbCwgZ2V0Q2xvdWRmbGFyZUNyZWRzIH0gZnJvbSBcIi4vY2xvdWRmbGFyZUhlbHBlcnNcIjtcblxuY29uc3QgRE5TX1RUTFNlY29uZHMgPSB7XG4gICAgXCJUWFRcIjogNjAsXG4gICAgXCJBXCI6IDYwLFxufTtcblxuY29uc3QgRE5TX1JFRlJFU0hfU1RBTEVfQUZURVIgPSB0aW1lSW5EYXk7XG5cbi8vIFdlIHN0YW1wIG91ciBvd24gXCJsYXN0IGFzc2VydGVkXCIgdGltZSBpbnRvIHRoZSByZWNvcmQncyBjb21tZW50LCBiZWNhdXNlIENsb3VkZmxhcmUnc1xuLy8gIG1vZGlmaWVkX29uIGNhbiBvbmx5IGJlIG1vdmVkIGJ5IGFuIGFjdHVhbCBjb250ZW50IGNoYW5nZSAtIGFuZCByZS1hc3NlcnRpbmcgYW4gYWxyZWFkeSBjb3JyZWN0IHJlY29yZCBoYXMgbm8gY29udGVudCBjaGFuZ2UgdG8gbWFrZSAoYSBjcmVhdGUgZXJyb3JzIHdpdGggODEwNTgsIGEgbm8tb3AgZWRpdCBkb2Vzbid0IGJ1bXAgdGhlIHRpbWVzdGFtcCkuIFJlYWRpbmcgZnJlc2huZXNzIGZyb20gdGV4dCB3ZSBjb250cm9sIHNpZGVzdGVwcyB0aGF0IGVudGlyZWx5LCBhbmQgbGV0cyB1cyByZWZyZXNoIGEgc3RhbGUtYnV0LWNvcnJlY3QgcmVjb3JkIGluIHBsYWNlIGluc3RlYWQgb2YgZGVsZXRpbmcgYW5kIHJlY3JlYXRpbmcgaXQuXG5jb25zdCBGUkVTSE5FU1NfUkVHRVggPSAvPHNldCBvbjpbXj5dKj4vO1xuXG4vKiogU3RyaXBzIGFueSBwcmlvciBmcmVzaG5lc3MgdGFnIGFuZCBhcHBlbmRzIGEgbmV3IG9uZSwgcHJlc2VydmluZyBvdGhlciBjb21tZW50IHRleHQuICovXG5mdW5jdGlvbiBzdGFtcEZyZXNobmVzcyhjb21tZW50Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZSA9IChjb21tZW50ID8/IFwiXCIpLnJlcGxhY2UoRlJFU0hORVNTX1JFR0VYLCBcIlwiKS50cmltKCk7XG4gICAgbGV0IHN0YW1wID0gYDxzZXQgb246ICR7bmV3IERhdGUoKS50b1N0cmluZygpfT5gO1xuICAgIHJldHVybiBiYXNlID8gYCR7YmFzZX0gJHtzdGFtcH1gIDogc3RhbXA7XG59XG4vKiogUGFyc2VzIG91ciB0YWcgYmFjayBvdXQ7IDAgKGkuZS4gYWx3YXlzIHN0YWxlKSB3aGVuIGl0J3MgYWJzZW50IG9yIHVucGFyc2VhYmxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZXNobmVzc1RpbWUoY29tbWVudD86IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IG1hdGNoID0gRlJFU0hORVNTX1JFR0VYLmV4ZWMoY29tbWVudCA/PyBcIlwiKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDtcbiAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbMF0ucmVwbGFjZShcIjxzZXQgb246XCIsIFwiXCIpLnJlcGxhY2UoXCI+XCIsIFwiXCIpLnRyaW0oKSkuZ2V0VGltZSgpIHx8IDA7XG59XG5cbmV4cG9ydCBjb25zdCBoYXNETlNXcml0ZVBlcm1pc3Npb25zID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFpc05vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdldENsb3VkZmxhcmVDcmVkcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Wm9uZUlkID0gY2FjaGUoYXN5bmMgKHJvb3REb21haW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgbGV0IHpvbmVzID0gYXdhaXQgY2xvdWRmbGFyZUdFVENhbGw8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdPihcIi96b25lc1wiLCB7fSk7XG4gICAgbGV0IHNlbGVjdGVkID0gem9uZXMuZmluZCh4ID0+IHgubmFtZSA9PT0gcm9vdERvbWFpbik7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHpvbmUgZm9yICR7cm9vdERvbWFpbn0uIEZvdW5kICR7em9uZXMubWFwKHggPT4geC5uYW1lKS5qb2luKFwiLCBcIil9YCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZC5pZDtcbn0pO1xuXG5mdW5jdGlvbiBnZXRSb290RG9tYWluKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi5cIikpIHtcbiAgICAgICAga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleS5zcGxpdChcIi5cIikuc2xpY2UoLTIpLmpvaW4oXCIuXCIpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3Jkc1Jhdyh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi5cIikpIGtleSA9IGtleS5zbGljZSgwLCAtMSk7XG4gICAgbGV0IHpvbmVJZCA9IGF3YWl0IGdldFpvbmVJZChnZXRSb290RG9tYWluKGtleSkpO1xuICAgIGxldCByZXN1bHRzID0gYXdhaXQgY2xvdWRmbGFyZUdFVENhbGw8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudDogc3RyaW5nO1xuICAgICAgICBwcm94aWVkOiBib29sZWFuO1xuICAgICAgICBtb2RpZmllZF9vbjogc3RyaW5nO1xuICAgICAgICAvLyBPbWl0dGVkIGJ5IENsb3VkZmxhcmUgd2hlbiB0aGUgcmVjb3JkIGhhcyBubyBjb21tZW50LlxuICAgICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIH1bXT4oYC96b25lcy8ke3pvbmVJZH0vZG5zX3JlY29yZHNgKTtcbiAgICAvLyBETlMgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIENsb3VkZmxhcmUgcmV0dXJucyB0aGVtIGxvd2VyY2FzZWQsIHNvIGEgbWl4ZWQtY2FzZSBrZXkgKGUuZy4gYSBtYWNoaW5lIGlkIHN1YmRvbWFpbikgd291bGQgbmV2ZXIgbWF0Y2ggYW4gZXhhY3QtY2FzZSBjb21wYXJlIC0gbWF0Y2ggbG93ZXJjYXNlZC5cbiAgICBsZXQga2V5TG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIoeCA9PiB4LnR5cGUgPT09IHR5cGUgJiYgeC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGtleUxvd2VyKTtcbn1cblxuLyoqIENsb3VkZmxhcmUncyBiYXRjaCBlbmRwb2ludCBhcHBsaWVzIGRlbGV0ZXMsIHRoZW4gcGF0Y2hlcywgdGhlbiBwb3N0cyBpbiBhIHNpbmdsZSBkYXRhYmFzZSB0cmFuc2FjdGlvbi4gV2Ugcm91dGUgZWRpdHMgKHBhdGNoZXMpIHRocm91Z2ggaGVyZSBiZWNhdXNlIHRoZSBzdGFuZGFsb25lIFBBVENIL1BVVCB2ZXJicyBhcmVuJ3QgdXNhYmxlIGluIG91ciBzZXR1cCwgYW5kIGJlY2F1c2UgaXQgbGV0cyBcInJlbW92ZSBvdGhlcnMgKyBhc3NlcnQgdGFyZ2V0XCIgaGFwcGVuIHdpdGhvdXQgYSB3aW5kb3cgd2hlcmUgdGhlIG5hbWUgcmVzb2x2ZXMgdG8gbm90aGluZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaFJlY29yZHMoem9uZUlkOiBzdHJpbmcsIGJhdGNoOiB7XG4gICAgZGVsZXRlcz86IHsgaWQ6IHN0cmluZyB9W107XG4gICAgcGF0Y2hlcz86IHsgaWQ6IHN0cmluZzsgY29tbWVudD86IHN0cmluZyB9W107XG4gICAgcG9zdHM/OiB7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmc7IHR0bDogbnVtYmVyOyBwcm94aWVkOiBib29sZWFuOyBjb21tZW50Pzogc3RyaW5nIH1bXTtcbn0pIHtcbiAgICBsZXQgcGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcbiAgICBpZiAoYmF0Y2guZGVsZXRlcyAmJiBiYXRjaC5kZWxldGVzLmxlbmd0aCA+IDApIHBheWxvYWQuZGVsZXRlcyA9IGJhdGNoLmRlbGV0ZXM7XG4gICAgaWYgKGJhdGNoLnBhdGNoZXMgJiYgYmF0Y2gucGF0Y2hlcy5sZW5ndGggPiAwKSBwYXlsb2FkLnBhdGNoZXMgPSBiYXRjaC5wYXRjaGVzO1xuICAgIGlmIChiYXRjaC5wb3N0cyAmJiBiYXRjaC5wb3N0cy5sZW5ndGggPiAwKSBwYXlsb2FkLnBvc3RzID0gYmF0Y2gucG9zdHM7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xvdWRmbGFyZVBPU1RDYWxsKGAvem9uZXMvJHt6b25lSWR9L2Ruc19yZWNvcmRzL2JhdGNoYCwgcGF5bG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdXBkYXRpbmcgRE5TIHJlY29yZHM6YCwgeyBlcnJvcjogZXJyb3IsIGJhdGNoIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHVwZGF0aW5nIEROUyByZWNvcmRzLiAke0pTT04uc3RyaW5naWZ5KGJhdGNoKX0uIEVycm9yOiAke2Vycm9yfWApO1xuICAgIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWNvcmRzKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgcmF3ID0gYXdhaXQgZ2V0UmVjb3Jkc1Jhdyh0eXBlLCBrZXkpO1xuICAgIHJldHVybiByYXcubWFwKHggPT4geC5jb250ZW50KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVSZWNvcmQodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIGxldCB6b25lSWQgPSBhd2FpdCBnZXRab25lSWQoZ2V0Um9vdERvbWFpbihrZXkpKTtcbiAgICBsZXQgcHJldlZhbHVlcyA9IGF3YWl0IGdldFJlY29yZHNSYXcodHlwZSwga2V5KTtcbiAgICBwcmV2VmFsdWVzID0gcHJldlZhbHVlcy5maWx0ZXIoeCA9PiB4LmNvbnRlbnQgPT09IHZhbHVlKTtcbiAgICBpZiAocHJldlZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKCFTb2NrZXRGdW5jdGlvbi5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBObyBuZWVkIHRvIGRlbGV0ZSByZWNvcmQsIGl0IHdhcyBub3QgZm91bmQuICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSB2YWx1ZSB3YXMgbm90IGluICR7dHlwZX0gZm9yICR7a2V5fSwgdmFsdWVzICR7SlNPTi5zdHJpbmdpZnkocHJldlZhbHVlcy5tYXAoeCA9PiB4LmNvbnRlbnQpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFJlbW92aW5nIHJlY29yZHMgb2YgJHt0eXBlfSBmb3IgJHtrZXl9LCB2YWx1ZXMgJHtKU09OLnN0cmluZ2lmeShwcmV2VmFsdWVzLm1hcCh4ID0+IHguY29udGVudCkpfWApO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHByZXZWYWx1ZXMpIHtcbiAgICAgICAgYXdhaXQgY2xvdWRmbGFyZUNhbGwoYC96b25lcy8ke3pvbmVJZH0vZG5zX3JlY29yZHMvJHt2YWx1ZS5pZH1gLCBCdWZmZXIuZnJvbShbXSksIFwiREVMRVRFXCIpO1xuICAgIH1cbn1cbi8qKiBSZW1vdmVzIGFsbCBleGlzdGluZyByZWNvcmRzICh1bmxlc3MgdGhlIHJlY29yZCBpcyBhbHJlYWR5IHByZXNlbnQgYW5kIGZyZXNoKSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFJlY29yZCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBwcm94aWVkPzogXCJwcm94aWVkXCIsIHN0YWxlQWZ0ZXIgPSBETlNfUkVGUkVTSF9TVEFMRV9BRlRFUikge1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIGxldCB6b25lSWQgPSBhd2FpdCBnZXRab25lSWQoZ2V0Um9vdERvbWFpbihrZXkpKTtcbiAgICBsZXQgcHJldlZhbHVlcyA9IGF3YWl0IGdldFJlY29yZHNSYXcodHlwZSwga2V5KTtcbiAgICBsZXQgZXhpc3RpbmcgPSBwcmV2VmFsdWVzLmZpbmQoeCA9PiB4LmNvbnRlbnQgPT09IHZhbHVlKTtcbiAgICBsZXQgb3RoZXJzID0gcHJldlZhbHVlcy5maWx0ZXIoeCA9PiB4LmNvbnRlbnQgIT09IHZhbHVlKTtcblxuICAgIC8vIEFscmVhZHkgY29ycmVjdCBhbmQgcmVjZW50bHkgYXNzZXJ0ZWQgLSBhIHByaW9yIHJ1biBhbHNvIGNsZWFuZWQgdXAgdGhlIG90aGVyIHJlY29yZHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkby5cbiAgICBpZiAoZXhpc3RpbmcgJiYgRGF0ZS5ub3coKSAtIGZyZXNobmVzc1RpbWUoZXhpc3RpbmcuY29tbWVudCkgPCBzdGFsZUFmdGVyKSByZXR1cm47XG5cbiAgICAvLyBBIHNpbmdsZSBhdG9taWMgYmF0Y2g6IGRyb3AgdGhlIHdyb25nIHJlY29yZHMsIGFuZCBlaXRoZXIgcmVmcmVzaCB0aGUgZXhpc3RpbmcgcmVjb3JkJ3MgY29tbWVudCBpbiBwbGFjZSBvciBjcmVhdGUgaXQgLSBzbyB0aGUgbmFtZSBpcyBuZXZlciBsZWZ0IHJlc29sdmluZyB0byBub3RoaW5nLlxuICAgIGxldCB0dGwgPSBETlNfVFRMU2Vjb25kc1t0eXBlIGFzIFwiQVwiXSB8fCA2MDtcbiAgICBsZXQgY29tbWVudCA9IHN0YW1wRnJlc2huZXNzKGV4aXN0aW5nPy5jb21tZW50KTtcbiAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBTZXR0aW5nICR7dHlwZX0gcmVjb3JkIGZvciAke2tleX0gdG8gJHt2YWx1ZX0gKHByZXZpb3VzbHkgaGFkICR7SlNPTi5zdHJpbmdpZnkocHJldlZhbHVlcy5tYXAoeCA9PiB4LmNvbnRlbnQpKX0pYCkpO1xuICAgIGF3YWl0IGJhdGNoUmVjb3Jkcyh6b25lSWQsIHtcbiAgICAgICAgZGVsZXRlczogb3RoZXJzLm1hcCh4ID0+ICh7IGlkOiB4LmlkIH0pKSxcbiAgICAgICAgcGF0Y2hlczogZXhpc3RpbmcgPyBbeyBpZDogZXhpc3RpbmcuaWQsIGNvbW1lbnQgfV0gOiBbXSxcbiAgICAgICAgcG9zdHM6IGV4aXN0aW5nID8gW10gOiBbeyB0eXBlLCBuYW1lOiBrZXksIGNvbnRlbnQ6IHZhbHVlLCB0dGwsIHByb3hpZWQ6IHByb3hpZWQgPT09IFwicHJveGllZFwiLCBjb21tZW50IH1dLFxuICAgIH0pO1xuICAgIC8vIE9ubHkgYSBicmFuZCBuZXcgcmVjb3JkIG5lZWRzIHRvIHByb3BhZ2F0ZTsgYW4gaW4tcGxhY2UgY29tbWVudCByZWZyZXNoIGRvZXNuJ3QgY2hhbmdlIHRoZSBhbnN3ZXIuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgV2FpdGluZyAke3R0bH0gc2Vjb25kcyBmb3IgRE5TIHRvIHByb3BhZ2F0ZS4uLmApO1xuICAgICAgICBmb3IgKGxldCB0dGxMZWZ0ID0gdHRsOyB0dGxMZWZ0ID4gMDsgdHRsTGVmdC0tKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3R0bExlZnR9IHNlY29uZHMgbGVmdC4uLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBEb25lIHdhaXRpbmcgZm9yIEROUyB0byB1cGRhdGUuYCk7XG4gICAgfVxufVxuLyoqIEtlZXBzIGV4aXN0aW5nIHJlY29yZHMgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRSZWNvcmQodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgcHJveGllZD86IFwicHJveGllZFwiLCBzdGFsZUFmdGVyID0gRE5TX1JFRlJFU0hfU1RBTEVfQUZURVIpIHtcbiAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgem9uZUlkID0gYXdhaXQgZ2V0Wm9uZUlkKGdldFJvb3REb21haW4oa2V5KSk7XG4gICAgbGV0IHByZXZWYWx1ZXMgPSBhd2FpdCBnZXRSZWNvcmRzUmF3KHR5cGUsIGtleSk7XG4gICAgbGV0IGV4aXN0aW5nID0gcHJldlZhbHVlcy5maW5kKHggPT4geC5jb250ZW50ID09PSB2YWx1ZSk7XG4gICAgaWYgKGV4aXN0aW5nICYmIERhdGUubm93KCkgLSBmcmVzaG5lc3NUaW1lKGV4aXN0aW5nLmNvbW1lbnQpIDwgc3RhbGVBZnRlcikgcmV0dXJuO1xuXG4gICAgLy8gU2FtZSBzaW5nbGUtYmF0Y2ggZmxvdyBhcyBzZXRSZWNvcmQsIG1pbnVzIHRoZSBkZWxldGVzICh3ZSBrZWVwIHNpYmxpbmcgcmVjb3JkcyBoZXJlKS5cbiAgICBsZXQgdHRsID0gRE5TX1RUTFNlY29uZHNbdHlwZSBhcyBcIkFcIl0gfHwgNjA7XG4gICAgbGV0IGNvbW1lbnQgPSBzdGFtcEZyZXNobmVzcyhleGlzdGluZz8uY29tbWVudCk7XG4gICAgY29uc29sZS5sb2coYEFkZGluZyAke3R5cGV9IHJlY29yZCBmb3IgJHtrZXl9IHRvICR7dmFsdWV9IChwcmV2aW91c2x5IGhhZCAke0pTT04uc3RyaW5naWZ5KHByZXZWYWx1ZXMubWFwKHggPT4geC5jb250ZW50KSl9KWApO1xuICAgIGF3YWl0IGJhdGNoUmVjb3Jkcyh6b25lSWQsIHtcbiAgICAgICAgcGF0Y2hlczogZXhpc3RpbmcgPyBbeyBpZDogZXhpc3RpbmcuaWQsIGNvbW1lbnQgfV0gOiBbXSxcbiAgICAgICAgcG9zdHM6IGV4aXN0aW5nID8gW10gOiBbeyB0eXBlLCBuYW1lOiBrZXksIGNvbnRlbnQ6IHZhbHVlLCB0dGwsIHByb3hpZWQ6IHByb3hpZWQgPT09IFwicHJveGllZFwiLCBjb21tZW50IH1dLFxuICAgIH0pO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKGBXYWl0aW5nICR7dHRsfSBzZWNvbmRzIGZvciBETlMgdG8gcHJvcGFnYXRlLi4uYCk7XG4gICAgZm9yIChsZXQgdHRsTGVmdCA9IHR0bDsgdHRsTGVmdCA+IDA7IHR0bExlZnQtLSkge1xuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7dHRsTGVmdH0gc2Vjb25kcyBsZWZ0Li4uYCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBEb25lIHdhaXRpbmcgZm9yIEROUyB0byB1cGRhdGUuYCk7XG59XG4iXX0=
|
|
169
|
+
/* _JS_SOURCE_HASH = "cdc70b4acd8101703333fe1f72ed365fbeb32bd04759e62272143b3286939aa8"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -43,4 +43,4 @@ function getKeyStore(appName, key) {
|
|
|
43
43
|
}
|
|
44
44
|
exports.getKeyStore = getKeyStore;
|
|
45
45
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVudExvY2FsU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcnNpc3RlbnRMb2NhbFN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQWtEO0FBQ2xELDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFHcEIsU0FBZ0IsV0FBVyxDQUFJLE9BQWUsRUFBRSxHQUFXO0lBSXZELElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLEdBQUcsWUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsRSxPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUM7b0JBQUMsUUFBUSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQWU7Z0JBQ2YsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBZTtnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleVN0b3JlPFQ+KGFwcE5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiB7XG4gICAgZ2V0KCk6IFQgfCB1bmRlZmluZWQ7XG4gICAgc2V0KHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQ7XG59IHtcbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgbGV0IHBhdGggPSBvcy5ob21lZGlyKCkgKyBgL2tleXN0b3JlXyR7YXBwTmFtZX1fYCArIGtleSArIFwiLmpzb25cIjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0cnkgeyBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7IH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50cykgYXMgVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghanNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKSBhcyBUO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==
|
|
46
|
-
/* _JS_SOURCE_HASH = "
|
|
46
|
+
/* _JS_SOURCE_HASH = "8dbb6e85cddc509f3a2d47c212d8b6724bab2edb3f699dc38d338974908760cb"; */
|
package/misc/https/dns.d.ts
CHANGED
|
@@ -22,10 +22,7 @@ export declare function getRecordsRaw(type: string, key: string): Promise<{
|
|
|
22
22
|
modified_on: string;
|
|
23
23
|
comment?: string | undefined;
|
|
24
24
|
}[]>;
|
|
25
|
-
/** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database
|
|
26
|
-
* transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs
|
|
27
|
-
* aren't usable in our setup, and because it lets "remove others + assert target" happen
|
|
28
|
-
* without a window where the name resolves to nothing. */
|
|
25
|
+
/** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs aren't usable in our setup, and because it lets "remove others + assert target" happen without a window where the name resolves to nothing. */
|
|
29
26
|
export declare function batchRecords(zoneId: string, batch: {
|
|
30
27
|
deletes?: {
|
|
31
28
|
id: string;
|
package/misc/https/dns.ts
CHANGED
|
@@ -13,10 +13,7 @@ const DNS_TTLSeconds = {
|
|
|
13
13
|
const DNS_REFRESH_STALE_AFTER = timeInDay;
|
|
14
14
|
|
|
15
15
|
// We stamp our own "last asserted" time into the record's comment, because Cloudflare's
|
|
16
|
-
// modified_on can only be moved by an actual content change - and re-asserting an already
|
|
17
|
-
// correct record has no content change to make (a create errors with 81058, a no-op edit
|
|
18
|
-
// doesn't bump the timestamp). Reading freshness from text we control sidesteps that entirely,
|
|
19
|
-
// and lets us refresh a stale-but-correct record in place instead of deleting and recreating it.
|
|
16
|
+
// modified_on can only be moved by an actual content change - and re-asserting an already correct record has no content change to make (a create errors with 81058, a no-op edit doesn't bump the timestamp). Reading freshness from text we control sidesteps that entirely, and lets us refresh a stale-but-correct record in place instead of deleting and recreating it.
|
|
20
17
|
const FRESHNESS_REGEX = /<set on:[^>]*>/;
|
|
21
18
|
|
|
22
19
|
/** Strips any prior freshness tag and appends a new one, preserving other comment text. */
|
|
@@ -71,16 +68,12 @@ export async function getRecordsRaw(type: string, key: string) {
|
|
|
71
68
|
// Omitted by Cloudflare when the record has no comment.
|
|
72
69
|
comment?: string;
|
|
73
70
|
}[]>(`/zones/${zoneId}/dns_records`);
|
|
74
|
-
// DNS names are case-insensitive and Cloudflare returns them lowercased, so a mixed-case key
|
|
75
|
-
// (e.g. a machine id subdomain) would never match an exact-case compare - match lowercased.
|
|
71
|
+
// DNS names are case-insensitive and Cloudflare returns them lowercased, so a mixed-case key (e.g. a machine id subdomain) would never match an exact-case compare - match lowercased.
|
|
76
72
|
let keyLower = key.toLowerCase();
|
|
77
73
|
return results.filter(x => x.type === type && x.name.toLowerCase() === keyLower);
|
|
78
74
|
}
|
|
79
75
|
|
|
80
|
-
/** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database
|
|
81
|
-
* transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs
|
|
82
|
-
* aren't usable in our setup, and because it lets "remove others + assert target" happen
|
|
83
|
-
* without a window where the name resolves to nothing. */
|
|
76
|
+
/** Cloudflare's batch endpoint applies deletes, then patches, then posts in a single database transaction. We route edits (patches) through here because the standalone PATCH/PUT verbs aren't usable in our setup, and because it lets "remove others + assert target" happen without a window where the name resolves to nothing. */
|
|
84
77
|
export async function batchRecords(zoneId: string, batch: {
|
|
85
78
|
deletes?: { id: string }[];
|
|
86
79
|
patches?: { id: string; comment?: string }[];
|
|
@@ -127,12 +120,10 @@ export async function setRecord(type: string, key: string, value: string, proxie
|
|
|
127
120
|
let existing = prevValues.find(x => x.content === value);
|
|
128
121
|
let others = prevValues.filter(x => x.content !== value);
|
|
129
122
|
|
|
130
|
-
// Already correct and recently asserted - a prior run also cleaned up the other records,
|
|
131
|
-
// so there is nothing left to do.
|
|
123
|
+
// Already correct and recently asserted - a prior run also cleaned up the other records, so there is nothing left to do.
|
|
132
124
|
if (existing && Date.now() - freshnessTime(existing.comment) < staleAfter) return;
|
|
133
125
|
|
|
134
|
-
// A single atomic batch: drop the wrong records, and either refresh the existing record's
|
|
135
|
-
// comment in place or create it - so the name is never left resolving to nothing.
|
|
126
|
+
// A single atomic batch: drop the wrong records, and either refresh the existing record's comment in place or create it - so the name is never left resolving to nothing.
|
|
136
127
|
let ttl = DNS_TTLSeconds[type as "A"] || 60;
|
|
137
128
|
let comment = stampFreshness(existing?.comment);
|
|
138
129
|
console.log(magenta(`Setting ${type} record for ${key} to ${value} (previously had ${JSON.stringify(prevValues.map(x => x.content))})`));
|
|
@@ -10,6 +10,8 @@ export type HostServerConfig = {
|
|
|
10
10
|
portFallback?: {
|
|
11
11
|
/** Delay until the next main-port acquisition attempt (tightened around the predecessor's scheduled death) */
|
|
12
12
|
getAcquireDelay: () => number;
|
|
13
|
+
/** Called when the main port turned out to be busy, before we act as its successor in any way. Throwing aborts startup - a busy port with no deploy in progress means something else holds it, which is not a state to keep running in. */
|
|
14
|
+
onPortInUse?: () => Promise<void>;
|
|
13
15
|
/** Reports every port we become reachable on (the alternate at mount, the main port once relayed) */
|
|
14
16
|
onListening: (port: number, isMainPort: boolean) => void;
|
|
15
17
|
};
|
package/misc/https/hostServer.ts
CHANGED
|
@@ -34,6 +34,8 @@ export type HostServerConfig = {
|
|
|
34
34
|
portFallback?: {
|
|
35
35
|
/** Delay until the next main-port acquisition attempt (tightened around the predecessor's scheduled death) */
|
|
36
36
|
getAcquireDelay: () => number;
|
|
37
|
+
/** Called when the main port turned out to be busy, before we act as its successor in any way. Throwing aborts startup - a busy port with no deploy in progress means something else holds it, which is not a state to keep running in. */
|
|
38
|
+
onPortInUse?: () => Promise<void>;
|
|
37
39
|
/** Reports every port we become reachable on (the alternate at mount, the main port once relayed) */
|
|
38
40
|
onListening: (port: number, isMainPort: boolean) => void;
|
|
39
41
|
};
|
|
@@ -60,8 +62,7 @@ export async function hostServer(config: HostServerConfig): Promise<string> {
|
|
|
60
62
|
}
|
|
61
63
|
});
|
|
62
64
|
|
|
63
|
-
// With portFallback, a busy port is not an error: the underlying server scans for a free port
|
|
64
|
-
// instead (useAvailablePortIfPortInUse), and the nodeId tells us which port we actually got
|
|
65
|
+
// With portFallback, a busy port is not an error: the underlying server scans for a free port instead (useAvailablePortIfPortInUse), and the nodeId tells us which port we actually got
|
|
65
66
|
let nodeId = await SocketFunction.mount({
|
|
66
67
|
public: true,
|
|
67
68
|
autoForwardPort: true,
|
|
@@ -91,6 +92,7 @@ export async function hostServer(config: HostServerConfig): Promise<string> {
|
|
|
91
92
|
let fallback = config.portFallback;
|
|
92
93
|
if (fallback && servingPort !== port) {
|
|
93
94
|
console.log(magenta(`Port ${port} is in use (presumably by our predecessor); serving on alternate port ${servingPort} until it frees`));
|
|
95
|
+
await fallback.onPortInUse?.();
|
|
94
96
|
void runMainPortAcquireLoop(domain, port, servingPort, fallback);
|
|
95
97
|
}
|
|
96
98
|
fallback?.onListening(servingPort, servingPort === port);
|
|
@@ -98,9 +100,7 @@ export async function hostServer(config: HostServerConfig): Promise<string> {
|
|
|
98
100
|
return nodeId;
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
// SocketFunction can only mount once per process, so "taking over" the main port is a raw TCP
|
|
102
|
-
// relay forwarding to our real listener - TLS/SNI passes straight through, and clients address
|
|
103
|
-
// servers by ip domain (wildcard negotiation), so the extra hop is invisible.
|
|
103
|
+
// SocketFunction can only mount once per process, so "taking over" the main port is a raw TCP relay forwarding to our real listener - TLS/SNI passes straight through, and clients address servers by ip domain (wildcard negotiation), so the extra hop is invisible.
|
|
104
104
|
async function runMainPortAcquireLoop(domain: string, mainPort: number, servingPort: number, fallback: NonNullable<HostServerConfig["portFallback"]>): Promise<void> {
|
|
105
105
|
while (true) {
|
|
106
106
|
await delay(fallback.getAcquireDelay());
|
|
@@ -121,8 +121,7 @@ async function runMainPortAcquireLoop(domain: string, mainPort: number, servingP
|
|
|
121
121
|
});
|
|
122
122
|
if (acquired) {
|
|
123
123
|
console.log(magenta(`Acquired main port ${mainPort} for https://${domain} (relaying to our listener on ${servingPort})`));
|
|
124
|
-
// The mount only forwarded OUR serving port; the main port needs its own mapping (the
|
|
125
|
-
// predecessor's mapping pointed at the same machine+port, but dies with it)
|
|
124
|
+
// The mount only forwarded OUR serving port; the main port needs its own mapping (the predecessor's mapping pointed at the same machine+port, but dies with it)
|
|
126
125
|
await forwardPort({ externalPort: mainPort, internalPort: mainPort });
|
|
127
126
|
fallback.onListening(mainPort, true);
|
|
128
127
|
return;
|
package/misc/https/httpsCerts.ts
CHANGED
|
@@ -64,16 +64,10 @@ export const getHTTPSCert = cache(async (domain: string): Promise<{ key: string;
|
|
|
64
64
|
let altDomains: string[] = [];
|
|
65
65
|
|
|
66
66
|
// altDomains.push("noproxy." + domain);
|
|
67
|
-
// // NOTE: Allowing local access is just an optimization, not to avoid having to forward ports
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
// NOTE: I forget why we were not allowing wildcard domains. I think it was to prevent
|
|
72
|
-
// any HTTPS domains from impersonating servers. But... servers have two levels, so that isn't
|
|
73
|
-
// an issue. And even if they didn't they store their public key in their domain, so you
|
|
74
|
-
// can't really impersonate them anyways...
|
|
75
|
-
// - AND, we need this for IP type A records, which... we need to pick the server we want
|
|
76
|
-
// to connect to.
|
|
67
|
+
// // NOTE: Allowing local access is just an optimization, not to avoid having to forward ports // (unless you type 127-0-0-1.domain into the browser... then I guess you don't have to forward ports?) altDomains.push("127-0-0-1." + domain);
|
|
68
|
+
|
|
69
|
+
// NOTE: I forget why we were not allowing wildcard domains. I think it was to prevent any HTTPS domains from impersonating servers. But... servers have two levels, so that isn't an issue. And even if they didn't they store their public key in their domain, so you can't really impersonate them anyways...
|
|
70
|
+
// - AND, we need this for IP type A records, which... we need to pick the server we want to connect to.
|
|
77
71
|
altDomains.push("*." + domain);
|
|
78
72
|
|
|
79
73
|
try {
|
package/misc/openrouter.ts
CHANGED
|
@@ -111,8 +111,7 @@ export async function openRouterCallBase(config: {
|
|
|
111
111
|
|
|
112
112
|
try {
|
|
113
113
|
return await retryFunctional(async () => {
|
|
114
|
-
// httpsRequest routes through socket-function's DNS cache and throws on any non-2xx (with the
|
|
115
|
-
// response body in the message), which retryFunctional then retries.
|
|
114
|
+
// httpsRequest routes through socket-function's DNS cache and throws on any non-2xx (with the response body in the message), which retryFunctional then retries.
|
|
116
115
|
let responseBody = await httpsRequest(
|
|
117
116
|
"https://openrouter.ai/api/v1/chat/completions",
|
|
118
117
|
Buffer.from(JSON.stringify({
|
package/package.json
CHANGED
|
@@ -48,10 +48,7 @@ export class FullscreenModal extends preact.Component<{
|
|
|
48
48
|
cursor: "pointer",
|
|
49
49
|
...this.props.outerStyle,
|
|
50
50
|
}}
|
|
51
|
-
// Close on mouse DOWN on the backdrop, not click — otherwise a drag that starts
|
|
52
|
-
// inside the modal (e.g. selecting text) and releases out on the backdrop fires a
|
|
53
|
-
// click on the backdrop and wrongly closes it. currentTarget === target means the
|
|
54
|
-
// press began on the backdrop itself, not bubbled up from the modal content.
|
|
51
|
+
// Close on mouse DOWN on the backdrop, not click — otherwise a drag that starts inside the modal (e.g. selecting text) and releases out on the backdrop fires a click on the backdrop and wrongly closes it. currentTarget === target means the press began on the backdrop itself, not bubbled up from the modal content.
|
|
55
52
|
onMouseDown={e => {
|
|
56
53
|
if (e.currentTarget === e.target) {
|
|
57
54
|
if (parentState) parentState.open = false;
|
|
@@ -94,11 +94,7 @@ let formatters: { [formatter in StringFormatters]: (value: unknown) => preact.Co
|
|
|
94
94
|
},
|
|
95
95
|
guess: (value) => {
|
|
96
96
|
if (typeof value === "number") {
|
|
97
|
-
// NOTE: These special values don't represent real values, and if they are shown
|
|
98
|
-
// to the user, it is a mistake anyways. So instead of showing a large number
|
|
99
|
-
// that is not meaningful to the user, we show a string, so they the issue
|
|
100
|
-
// is not the system having a large number, but the system not changing
|
|
101
|
-
// the default value.
|
|
97
|
+
// NOTE: These special values don't represent real values, and if they are shown to the user, it is a mistake anyways. So instead of showing a large number that is not meaningful to the user, we show a string, so they the issue is not the system having a large number, but the system not changing the default value.
|
|
102
98
|
if (value === Number.MAX_SAFE_INTEGER) {
|
|
103
99
|
return "Number.MAX_SAFE_INTEGER";
|
|
104
100
|
}
|
|
@@ -111,9 +107,7 @@ let formatters: { [formatter in StringFormatters]: (value: unknown) => preact.Co
|
|
|
111
107
|
if (value === Number.MIN_VALUE) {
|
|
112
108
|
return "Number.MIN_VALUE";
|
|
113
109
|
}
|
|
114
|
-
// Infinity should be somewhat understood by the user, if they are even a little
|
|
115
|
-
// bit literate. Of course, the value is likely a bug, but at least the consequences
|
|
116
|
-
// may be inferrable (the threshold is +Infinity, so it will never be reached, etc).
|
|
110
|
+
// Infinity should be somewhat understood by the user, if they are even a little bit literate. Of course, the value is likely a bug, but at least the consequences may be inferrable (the threshold is +Infinity, so it will never be reached, etc).
|
|
117
111
|
if (value === Number.POSITIVE_INFINITY) {
|
|
118
112
|
return "+Infinity";
|
|
119
113
|
}
|
package/render-utils/Input.tsx
CHANGED
|
@@ -46,8 +46,7 @@ export type InputProps = (
|
|
|
46
46
|
forceInputValueUpdatesWhenFocused?: boolean;
|
|
47
47
|
|
|
48
48
|
// NOTE: We trigger onChange (and onChangeValue) whenever
|
|
49
|
-
// e.ctrlKey && (e.code.startsWith("Key") || e.code === "Enter") || e.code === "Enter" && e.shiftKey
|
|
50
|
-
// This is because ctrl usually means a hotkey, and hotkeys usually want committed values.
|
|
49
|
+
// e.ctrlKey && (e.code.startsWith("Key") || e.code === "Enter") || e.code === "Enter" && e.shiftKey This is because ctrl usually means a hotkey, and hotkeys usually want committed values.
|
|
51
50
|
onChangeValue?: (value: string) => void;
|
|
52
51
|
}
|
|
53
52
|
);
|
|
@@ -104,9 +103,7 @@ export class Input extends preact.Component<InputProps> {
|
|
|
104
103
|
};
|
|
105
104
|
}
|
|
106
105
|
|
|
107
|
-
// IMPORTANT! When focused, preserve the input value, otherwise typing is annoying.
|
|
108
|
-
// This doesn't usually happen, but can if background tasks are updating the UI
|
|
109
|
-
// while the user is typing.
|
|
106
|
+
// IMPORTANT! When focused, preserve the input value, otherwise typing is annoying. This doesn't usually happen, but can if background tasks are updating the UI while the user is typing.
|
|
110
107
|
|
|
111
108
|
|
|
112
109
|
let attributes: preact.JSX.HTMLAttributes<HTMLInputElement> = {
|
|
@@ -230,10 +227,7 @@ export class Input extends preact.Component<InputProps> {
|
|
|
230
227
|
}
|
|
231
228
|
}
|
|
232
229
|
let { noEnterKeyBlur, onInput, onChange } = props;
|
|
233
|
-
// Detach from the synced function, to prevent double calls. This is important, as apparently .blur()
|
|
234
|
-
// synchronously triggers onChange, BUT, only if the input is changing the first time. Which means
|
|
235
|
-
// if this function reruns, it won't trigger the change again. Detaching it causes any triggered
|
|
236
|
-
// functions to become root synced functions, which will allow them to correctly run the sync loop.
|
|
230
|
+
// Detach from the synced function, to prevent double calls. This is important, as apparently .blur() synchronously triggers onChange, BUT, only if the input is changing the first time. Which means if this function reruns, it won't trigger the change again. Detaching it causes any triggered functions to become root synced functions, which will allow them to correctly run the sync loop.
|
|
237
231
|
void Promise.resolve().finally(() => {
|
|
238
232
|
if (e.defaultPrevented) return;
|
|
239
233
|
if (e.code === "Escape") {
|
|
@@ -307,8 +301,7 @@ export class Input extends preact.Component<InputProps> {
|
|
|
307
301
|
} else if (hot) {
|
|
308
302
|
attributes.onInput = attributes.onChange;
|
|
309
303
|
} else {
|
|
310
|
-
// We use onChange from onBlur, so don't use the onChange handler, as preact will hook this up
|
|
311
|
-
// with onInput, which will cause it to trigger as if the component is hot!
|
|
304
|
+
// We use onChange from onBlur, so don't use the onChange handler, as preact will hook this up with onInput, which will cause it to trigger as if the component is hot!
|
|
312
305
|
delete attributes.onChange;
|
|
313
306
|
}
|
|
314
307
|
if (textarea) {
|
|
@@ -344,8 +337,7 @@ function niceNumberStringify(valueIn: number) {
|
|
|
344
337
|
if (value.endsWith(".")) {
|
|
345
338
|
value = value.slice(0, -1);
|
|
346
339
|
}
|
|
347
|
-
// NOTE: Interestingly enough... because we remove all trailing 9s, it means if the last number is not 9,
|
|
348
|
-
// so... we can do this hack to round up
|
|
340
|
+
// NOTE: Interestingly enough... because we remove all trailing 9s, it means if the last number is not 9, so... we can do this hack to round up
|
|
349
341
|
value = value.slice(0, -1) + (parseInt(value.slice(-1)) + 1);
|
|
350
342
|
return value;
|
|
351
343
|
}
|
|
@@ -42,8 +42,7 @@ export type InputProps = (
|
|
|
42
42
|
forceInputValueUpdatesWhenFocused?: boolean;
|
|
43
43
|
|
|
44
44
|
// NOTE: We trigger onChange (and onChangeValue) whenever
|
|
45
|
-
// e.ctrlKey && (e.code.startsWith("Key") || e.code === "Enter") || e.code === "Enter" && e.shiftKey
|
|
46
|
-
// This is because ctrl usually means a hotkey, and hotkeys usually want committed values.
|
|
45
|
+
// e.ctrlKey && (e.code.startsWith("Key") || e.code === "Enter") || e.code === "Enter" && e.shiftKey This is because ctrl usually means a hotkey, and hotkeys usually want committed values.
|
|
47
46
|
onChangeValue?: (value: string) => void;
|
|
48
47
|
}
|
|
49
48
|
)
|
|
@@ -129,8 +128,7 @@ export class InputLabel extends preact.Component<InputLabelProps> {
|
|
|
129
128
|
props.textarea = false;
|
|
130
129
|
props.number = false;
|
|
131
130
|
props.forceInputValueUpdatesWhenFocused = true;
|
|
132
|
-
// NOTE: When using forceInputValueUpdatesWhenFocused we need hot, otherwise the user's updates
|
|
133
|
-
// won't be visible.
|
|
131
|
+
// NOTE: When using forceInputValueUpdatesWhenFocused we need hot, otherwise the user's updates won't be visible.
|
|
134
132
|
props.hot = true;
|
|
135
133
|
if (isJSNumber(value)) {
|
|
136
134
|
value = formatDateTimeForInput(+value);
|
|
@@ -254,8 +252,8 @@ export class InputLabel extends preact.Component<InputLabelProps> {
|
|
|
254
252
|
<span
|
|
255
253
|
className={
|
|
256
254
|
css.whiteSpace("pre-wrap")
|
|
257
|
-
|
|
258
|
-
|
|
255
|
+
// .opacity(0)
|
|
256
|
+
// .pointerEvents("none")
|
|
259
257
|
+ (props.editClass)
|
|
260
258
|
+ " " + (props.class || props.className)
|
|
261
259
|
}
|