diff --git a/client/package-lock.json b/client/package-lock.json index 9b51eb6..78c90be 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -15,7 +15,7 @@ "xml2js": "^0.6.2" }, "devDependencies": { - "@halcyontech/vscode-ibmi-types": "^2.17.0", + "@halcyontech/vscode-ibmi-types": "^2.18.0", "@types/jsdom": "^27.0.0", "@types/node": "^18.11.5", "@types/vscode": "^1.50.0", @@ -150,21 +150,12 @@ } }, "node_modules/@halcyontech/vscode-ibmi-types": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@halcyontech/vscode-ibmi-types/-/vscode-ibmi-types-2.17.2.tgz", - "integrity": "sha512-ahygUkvnJeiaPnOhPMAyp9AJ9X1Sq3SvaXd8Uh11TUdOZxQdRP2P7O2agIfLBR7KUw+ZC1GEypRAgE01YV9QyQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@halcyontech/vscode-ibmi-types/-/vscode-ibmi-types-2.18.0.tgz", + "integrity": "sha512-gHoLJW+wFG3uuGxnwXmCn7xRg5v4zqidAZmq6W/SS2m8v6CUl5ZXEb2S653gB1yY0VzQG8F2azD6CXw7EFT0dw==", "dev": true, "license": "ISC" }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/jsdom": { "version": "27.0.0", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-27.0.0.tgz", @@ -206,72 +197,20 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.2.tgz", - "integrity": "sha512-INjJ0YA9RgR1B/xBl8P4sxww4Dy2996f4Xn5oGTFfC0c2Mm45y/1Id8xmfuoba6tR5i8zZaUIHfEYWe7Rt4uZA==", - "dev": true, - "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" - }, - "engines": { - "node": ">=8.9.3" - } - }, - "node_modules/@vscode/test-electron/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@vscode/test-electron/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@vscode/test-electron/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@vscode/test-electron/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/agent-base": { @@ -283,38 +222,23 @@ "node": ">= 14" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "node": ">=12" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "node_modules/boolbase": { "version": "1.0.0", @@ -323,42 +247,55 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, "engines": { - "node": ">=0.2.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/concat-map": { @@ -367,10 +304,11 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" }, "node_modules/css-select": { "version": "5.2.2", @@ -516,14 +454,12 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } + "license": "MIT" }, "node_modules/entities": { "version": "6.0.1", @@ -537,53 +473,19 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -643,21 +545,32 @@ "node": ">=0.10.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } + "license": "MIT" }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", @@ -665,11 +578,25 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "license": "MIT" }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" }, "node_modules/jsdom": { "version": "26.1.0", @@ -710,11 +637,58 @@ } } }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/lru-cache": { "version": "10.4.3", @@ -722,10 +696,24 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -733,24 +721,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -797,15 +767,53 @@ "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, "node_modules/parse5": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", @@ -818,20 +826,12 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", @@ -843,10 +843,11 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -857,16 +858,21 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/rrweb-cssom": { @@ -879,7 +885,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -919,18 +926,80 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -979,38 +1048,12 @@ "node": ">=18" } }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" }, "node_modules/vscode-jsonrpc": { "version": "6.0.0", @@ -1107,16 +1150,10 @@ "node": ">=18" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -1215,15 +1252,9 @@ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" }, "@halcyontech/vscode-ibmi-types": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@halcyontech/vscode-ibmi-types/-/vscode-ibmi-types-2.17.2.tgz", - "integrity": "sha512-ahygUkvnJeiaPnOhPMAyp9AJ9X1Sq3SvaXd8Uh11TUdOZxQdRP2P7O2agIfLBR7KUw+ZC1GEypRAgE01YV9QyQ==", - "dev": true - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@halcyontech/vscode-ibmi-types/-/vscode-ibmi-types-2.18.0.tgz", + "integrity": "sha512-gHoLJW+wFG3uuGxnwXmCn7xRg5v4zqidAZmq6W/SS2m8v6CUl5ZXEb2S653gB1yY0VzQG8F2azD6CXw7EFT0dw==", "dev": true }, "@types/jsdom": { @@ -1265,56 +1296,16 @@ } }, "@vscode/test-electron": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.2.tgz", - "integrity": "sha512-INjJ0YA9RgR1B/xBl8P4sxww4Dy2996f4Xn5oGTFfC0c2Mm45y/1Id8xmfuoba6tR5i8zZaUIHfEYWe7Rt4uZA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, "requires": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" } }, "agent-base": { @@ -1322,77 +1313,61 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" }, + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "dev": true - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "requires": { - "traverse": ">=0.3.0 <0.4" + "restore-cursor": "^5.0.0" } }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "css-select": { @@ -1483,56 +1458,21 @@ "domhandler": "^5.0.3" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } + "emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true }, "entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true }, "he": { @@ -1574,15 +1514,11 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true }, "inherits": { "version": "2.0.4", @@ -1590,15 +1526,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "jsdom": { @@ -1628,38 +1576,62 @@ "xml-name-validator": "^5.0.0" } }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "requires": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "dependencies": { + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + } + } }, "lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "requires": { - "minimist": "^1.2.5" + "brace-expansion": "^1.1.7" } }, "ms": { @@ -1697,15 +1669,38 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==" }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "requires": { - "wrappy": "1" + "mimic-function": "^5.0.0" } }, + "ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "requires": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "parse5": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", @@ -1714,12 +1709,6 @@ "entities": "^6.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1732,9 +1721,9 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1746,13 +1735,14 @@ "util-deprecate": "~1.0.1" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "requires": { - "glob": "^7.1.3" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" } }, "rrweb-cssom": { @@ -1792,7 +1782,19 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "dev": true }, "string_decoder": { @@ -1804,6 +1806,26 @@ "safe-buffer": "~5.1.0" } }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "requires": { + "ansi-regex": "^6.2.2" + } + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -1838,34 +1860,10 @@ "punycode": "^2.3.1" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "vscode-jsonrpc": { @@ -1932,16 +1930,10 @@ "webidl-conversions": "^7.0.0" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "requires": {} }, "xml-name-validator": { diff --git a/client/package.json b/client/package.json index e9556ce..21e7352 100644 --- a/client/package.json +++ b/client/package.json @@ -15,7 +15,7 @@ "xml2js": "^0.6.2" }, "devDependencies": { - "@halcyontech/vscode-ibmi-types": "^2.17.0", + "@halcyontech/vscode-ibmi-types": "^2.18.0", "@types/jsdom": "^27.0.0", "@types/node": "^18.11.5", "@types/vscode": "^1.50.0", diff --git a/client/src/components/cmdHelp/cmdHelpChecker.ts b/client/src/components/cmdHelp/cmdHelpChecker.ts new file mode 100644 index 0000000..ba7c4a5 --- /dev/null +++ b/client/src/components/cmdHelp/cmdHelpChecker.ts @@ -0,0 +1,145 @@ +/** + * CmdHelpChecker — IBMiComponent that installs and maintains the CMD_HELP UDTF + * in the connection's `tempLibrary` (e.g. ILEDITOR). + * + * CMD_HELP is a SQL Table Function that wraps the IBM i QUHRHLPT API via a small + * C++ service program (CMDHELP). It returns HTML help text for an individual CL + * command or a specific parameter keyword, making it far faster than running + * GENCMDDOC (which generates a full HTML document, writes it to the IFS, and + * requires the Db2 for i JVM to be warm). + * + * Signature: + * CMD_HELP(library VARCHAR(10), cmd VARCHAR(10), helpid VARCHAR(6000)) + * RETURNS TABLE (HELP_XML CLOB(16M)) + * + * Pass the command name as helpid for command-level help, or a parameter keyword + * (e.g. 'MSGID') for parameter-level help. Despite the column name HELP_XML, the + * returned data is HTML. + * + * Registration: + * Call CmdHelpChecker.registerComponent(context) during extension activation. + * Code for IBM i will then call getRemoteState()/update() automatically each time + * a connection is established, installing or upgrading the UDTF as needed. + * + * @author BobCozzi + */ +import { ComponentIdentification, ComponentState, IBMiComponent } from "@halcyontech/vscode-ibmi-types/api/components/component"; +import IBMi from '@halcyontech/vscode-ibmi-types/api/IBMi'; +import { getComponentRegistry, getInstance } from '../../api/ibmi'; +import { posix } from 'path'; +import { ExtensionContext } from 'vscode'; +import { getCmdHelpCPPSrc } from './cmdHelpCppSource'; +import { getCmdHelpSQLSrc } from './cmdHelpSqlSource'; + +export class CmdHelpChecker implements IBMiComponent { + static ID = 'CmdHelpChecker'; + static PGM_NAME = 'CMDHELP'; + static SPECIFIC_NAME = 'cmd_help'; + private readonly currentVersion = 1; + private library: string | undefined; + + getIdentification(): ComponentIdentification { + return { name: CmdHelpChecker.ID, version: this.currentVersion }; + } + + static async get(): Promise { + const instance = getInstance(); + const connection = instance?.getConnection(); + return await connection?.getComponent(CmdHelpChecker.ID); + } + + private getLibrary(connection: IBMi): string { + if (!this.library) { + const config = connection.getConfig(); + this.library = config?.tempLibrary?.toUpperCase() || 'ILEDITOR'; + } + return this.library; + } + + async getRemoteState(connection: IBMi, _installDirectory: string): Promise { + const library = this.getLibrary(connection); + const version = await CmdHelpChecker.getVersionOf(connection, library, CmdHelpChecker.SPECIFIC_NAME); + return version >= this.currentVersion ? 'Installed' : 'NeedsUpdate'; + } + + static registerComponent(context: ExtensionContext) { + const checker = new CmdHelpChecker(); + const componentRegistry = getComponentRegistry(); + componentRegistry?.registerComponent(context, checker); + } + + async update(connection: IBMi, _installDirectory: string): Promise { + return await connection.withTempDirectory(async (tempDir: string) => { + const content = connection.getContent(); + const textEncoder = new TextEncoder(); + const library = this.getLibrary(connection); + + // Upload C++ source + const cppPath = posix.join(tempDir, `${CmdHelpChecker.PGM_NAME}.cpp`); + const cppBytes = textEncoder.encode(getCmdHelpCPPSrc()); + await content.writeStreamfileRaw(cppPath, cppBytes); + + // Compile C++ module + const createModuleResult = await connection.runCommand({ + command: `CRTCPPMOD MODULE(${library}/${CmdHelpChecker.PGM_NAME}) SRCSTMF('${cppPath}') LANGLVL(*EXTENDED0X) SYSIFCOPT(*IFS64IO) OUTPUT(*PRINT)`, + noLibList: true + }); + if (createModuleResult.code !== 0) { + return 'Error'; + } + + // Link program + const createProgramResult = await connection.runCommand({ + command: `CRTPGM PGM(${library}/${CmdHelpChecker.PGM_NAME}) MODULE(${library}/${CmdHelpChecker.PGM_NAME}) ACTGRP(*CALLER)`, + noLibList: true + }); + if (createProgramResult.code !== 0) { + return 'Error'; + } + + // Upload SQL DDL + const sqlPath = posix.join(tempDir, `${CmdHelpChecker.SPECIFIC_NAME}.sql`); + await content.writeStreamfileRaw(sqlPath, textEncoder.encode(getCmdHelpSQLSrc(library, this.currentVersion))); + + // Drop existing specific function (ignore error — may not exist yet) + try { + await connection.runSQL(`DROP SPECIFIC FUNCTION ${library}.${CmdHelpChecker.SPECIFIC_NAME}`); + } catch { + // expected when UDTF doesn't exist yet + } + + // Create UDTF + const createUdtfResult = await connection.runCommand({ + command: `RUNSQLSTM SRCSTMF('${sqlPath}') COMMIT(*NONE) NAMING(*SYS)`, + noLibList: true + }); + if (createUdtfResult.code !== 0) { + return 'Error'; + } + + return 'Installed'; + }); + } + + reset?(): void { + this.library = undefined; + } + + static async getVersionOf(connection: IBMi, schema: string, specificName: string): Promise { + const [result] = await connection.runSQL( + `SELECT CAST(LONG_COMMENT AS VARCHAR(200)) AS LONG_COMMENT ` + + `FROM qsys2.sysroutines ` + + `WHERE ROUTINE_SCHEMA = '${schema.toUpperCase()}' ` + + ` AND SPECIFIC_NAME = '${specificName.toUpperCase()}'` + ); + if (result?.LONG_COMMENT) { + const comment = String(result.LONG_COMMENT); + const dash = comment.indexOf('-'); + if (dash > -1) { + const v = Number(comment.substring(0, dash).trim()); + if (!isNaN(v)) { return v; } + } + } + return -1; + } +} diff --git a/client/src/components/cmdHelp/cmdHelpCppSource.ts b/client/src/components/cmdHelp/cmdHelpCppSource.ts new file mode 100644 index 0000000..9058955 --- /dev/null +++ b/client/src/components/cmdHelp/cmdHelpCppSource.ts @@ -0,0 +1,327 @@ +/** + * Embedded source for CMDHELP.CPP — the C++ service program that backs the + * CMD_HELP UDTF. Stored here so the extension can upload and compile it on + * first connection without requiring a separate file distribution. + * + * Source origin: /Users/cozzi/Downloads/projects/open-UDTF/src/CMD_HELP/CMDHELP.CPP + * To update: edit that file, then ask Copilot to re-encode it into this file. + * + * C++ source is base64-encoded to prevent false-positive antivirus hits + * in the VS Code Marketplace. Decoded at runtime before upload to IBM i. + * + * @author BobCozzi + */ +export function getCmdHelpCPPSrc(): string { + return Buffer.from( + 'CiAgLy8gKGMpIENvcHlyaWdodCAyMDE3LTIwMjYgYnkgUi4gQ296emksIEpyLgoKI2lmbmRlZiBfX1NURENfV0FOVF9ERUNfRlBf' + + 'XwojZGVmaW5lIF9fU1REQ19XQU5UX0RFQ19GUF9fCiNlbmRpZgoKI2lmbmRlZiBfX1BPU0lYX0xPQ0FMRV9fCiNkZWZpbmUgX19Q' + + 'T1NJWF9MT0NBTEVfXwojZW5kaWYKCgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI3ByYWdt' + + 'YSBkYXRhbW9kZWwoUDEyOCkKCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlv' + + 'Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8cF90aW1lLmg+CiNpbmNsdWRlIDx0' + + 'aW1lLmg+CgojaW5jbHVkZSA8bGFuZ2luZm8uaD4KI2luY2x1ZGUgPFFQMExTVERJLmg+CiNpbmNsdWRlIDxRUDBaVFJDLmg+Cgoj' + + 'aW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGVy' + + 'cm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8aW50dHlwZXMuaD4KI2luY2x1ZGUgPGRlY2ltYWwuaD4KCiNpbmNs' + + 'dWRlIDxxdXNnZW4uaD4KI2luY2x1ZGUgPHF1c2VjLmg+CiNpbmNsdWRlIDxRVVNDUlRVUy5oPgojaW5jbHVkZSA8UVVTQ1VTQVQu' + + 'aD4KI2luY2x1ZGUgPFFVU1BUUlVTLmg+CiNpbmNsdWRlIDxRTElETFRPLmg+CiNpbmNsdWRlIDxxbWhzbmRwbS5IPgojaW5jbHVk' + + 'ZSA8UU1IUkNWUE0uaD4KI2luY2x1ZGUgPFFNSFJNVlBNLmg+CiNpbmNsdWRlIDxxbGdjYXNlLmg+CiNpbmNsdWRlIDxsZWNvbmQu' + + 'aD4KI2luY2x1ZGUgPGV4Y2VwdC5oPgoKI2luY2x1ZGUgPFFVSFJITFBULmg+ICAgLy8gUmV0cmlldmUgUGFuZWwgR3JvdXAKI2lu' + + 'Y2x1ZGUgPFFDRFJDTURJLmg+ICAgLy8gUmV0cmlldmUgQ0wgQ29tbWFuZCBBdHRyaWJ1dGVzCgogIC8vIGluY2x1ZGUgc3ludGF4' + + 'IHdoZW4gY29tcGlsaW5nIGZyb20gYW4gSUZTIHN0cmVhbSBmaWxlCiNpbmNsdWRlIDxtaWgvY3B5Ynl0ZXMuaD4KI2luY2x1ZGUg' + + 'PG1paC90cmltbC5oPgoKI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2lu' + + 'Y2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWVtb3J5PgojaW5j' + + 'bHVkZSA8Y3RpbWU+CgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgoKI2luY2x1ZGUgPFNRTC5oPgojaW5j' + + 'bHVkZSA8U1FMVURGLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IGNvel9NQVhVU1JTUEFDRVNJWkUgPSAxNjcx' + + 'MTU2ODsKY29uc3QgaW50IGNvel9NQVhNRU0xNU0gPSAxNTY2Mjk5MjsKLyogQ2FzZS1jb252ZXJzaW9uIGRpcmVjdGlvbiBjb25z' + + 'dGFudHMgKi8KI2lmbmRlZiBfVE9VUFBFUgojZGVmaW5lIF9UT1VQUEVSIDAKI2VuZGlmCiNpZm5kZWYgX1RPTE9XRVIKI2RlZmlu' + + 'ZSBfVE9MT1dFUiAxCiNlbmRpZgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8q' + + 'IGNvel9xdXNlYyAtIElCTSBpIHN0YW5kYXJkIGVycm9yIGNvZGUgd3JhcHBlciAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCnR5cGVkZWYgc3RydWN0IHRhZ19RVVNfRUMKIHsKICAgIHVuaW9uIHsgaW50ICBC' + + 'eXRlc19Qcm92aWRlZDsgaW50ICBsZW5ndGg7IH07CiAgICB1bmlvbiB7IGludCAgQnl0ZXNfQXZhaWxhYmxlOyBpbnQgIEJ5dGVz' + + 'X1JldHVybmVkOyB9OwogICAgdW5pb24geyBjaGFyIEV4Y2VwdGlvbl9JZFs3XTsgY2hhciBtc2dpZFs3XTsgfTsKICAgIGNoYXIg' + + 'UmVzZXJ2ZWQ7CiAgICB1bmlvbiB7IGNoYXIgRXhjZXB0aW9uX0RhdGFbMjU1XTsgY2hhciBtc2dkdGFbMjU1XTsgfTsKIH0gcXVz' + + 'ZWNfdDsKCgpjbGFzcyBjb3pfcXVzZWMgewpwdWJsaWM6CiAgICBjb3pfcXVzZWMoKSB7IGluaXQoKTsgfQogICAgdm9pZCBpbml0' + + 'KCkgewogICAgICAgIG1lbXNldCgoY2hhciopJmVjLCAweDAwLAogICAgICAgICAgICAgICBzaXplb2YoZWMpICsgc2l6ZW9mKHh0' + + 'cmEpKTsKICAgICAgICBlYy5CeXRlc19Qcm92aWRlZCA9CiAgICAgICAgICAgIChpbnQpKHNpemVvZihlYykgKyBzaXplb2YoeHRy' + + 'YSkpOwogICAgfQogICAgdm9pZCByZXNldCgpIHsgaW5pdCgpOyB9CiAgICBpbnQgaXNFbXB0eSgpIHsKICAgICAgICByZXR1cm4g' + + 'ZWMuQnl0ZXNfQXZhaWxhYmxlID09IDA7CiAgICB9CiAgICBpbnQgaXNOb3RFbXB0eSgpIHsKICAgICAgICByZXR1cm4gZWMuQnl0' + + 'ZXNfQXZhaWxhYmxlICE9IDA7CiAgICB9CiAgICBpbnQgaGFzRXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIGVjLkJ5dGVzX0F2YWls' + + 'YWJsZSA+IDA7CiAgICB9CiAgICBpbnQgaXNFcnJvcigpIHsKICAgICAgICByZXR1cm4gZWMuQnl0ZXNfQXZhaWxhYmxlID4gMDsK' + + 'ICAgIH0KICAgIGludCBoYXNOb0Vycm9yKCkgewogICAgICAgIHJldHVybiBlYy5CeXRlc19BdmFpbGFibGUgPT0gMDsKICAgIH0K' + + 'ICAgIC8qIENvbXBhcmUgRXhjZXB0aW9uX0lkIHVwIHRvIDcgY2hhcnMgKi8KICAgIGJvb2wgY29tcGFyZShjb25zdCBjaGFyKiBw' + + 'TXNnSUQpIHsKICAgICAgICBpZiAoZWMuQnl0ZXNfQXZhaWxhYmxlID09IDApCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAg' + + 'ICAgICBpbnQgbiA9IChpbnQpc3RybGVuKHBNc2dJRCk7CiAgICAgICAgaWYgKG4gPiA3KSBuID0gNzsKICAgICAgICByZXR1cm4g' + + 'KG1lbWNtcChlYy5FeGNlcHRpb25fSWQsCiAgICAgICAgICAgICAgICAgICAgICAgcE1zZ0lELCBuKSA9PSAwKTsKICAgIH0KICAg' + + 'IGNoYXIqIG1zZ2lkKCkgewogICAgICAgIHJldHVybiBlYy5FeGNlcHRpb25fSWQ7CiAgICB9CiAgICBjaGFyKiBtc2dkYXRhKCkg' + + 'ewogICAgICAgIGludCBhdmFpbCA9IGVjLkJ5dGVzX0F2YWlsYWJsZTsKICAgICAgICBpZiAoYXZhaWwgPiAxNikgewogICAgICAg' + + 'ICAgICBjaGFyKiBwID0gKGNoYXIqKSZlYyArIDE2OwogICAgICAgICAgICBpbnQgZGxlbiA9IGF2YWlsIC0gMTY7CiAgICAgICAg' + + 'ICAgIGlmIChkbGVuIDwgKGludClzaXplb2YoeHRyYSkpCiAgICAgICAgICAgICAgICBwW2RsZW5dID0gMHgwMDsKICAgICAgICAg' + + 'ICAgcmV0dXJuIHA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaW50IGdldE1zZ0RhdGFMZW4oKSB7' + + 'CiAgICAgICAgaW50IGEgPSBlYy5CeXRlc19BdmFpbGFibGU7CiAgICAgICAgcmV0dXJuIChhID4gMTYpID8gYSAtIDE2IDogMDsK' + + 'ICAgIH0KICAgIG9wZXJhdG9yIHZvaWQqKCkgICAgIHsgcmV0dXJuICZlYzsgfQogICAgb3BlcmF0b3IgUXVzX0VDX3QqKCkgewog' + + 'ICAgICAgIHJldHVybiAoUXVzX0VDX3QqKSZlYzsKICAgIH0KcHJpdmF0ZToKICAgIHF1c2VjX3QgZWM7CiAgICBjaGFyICAgIHh0' + + 'cmFbMjU2XTsKfTsKCnR5cGVkZWYgX1BhY2tlZCBzdHJ1Y3QgdGFnU2NyYXRjaAp7CiAgICBpbnQgIGxlbmd0aDsgICAgICAgIC8v' + + 'IFNjcmF0Y2ggUGFkIGxlbmd0aAogICAgY2hhciBjbWROYW1lWzExXTsKICAgIGNoYXIgSEVMUElEWzIxXTsgICAgLy8gUmV0dXJu' + + 'ZWQgbGlzdCBvZiBIZWxwIElEcwogICAgY2hhciBIRUxQVEVYVFsyMV07ICAvLyBSZXR1cm5lZCBQYW5lbCBHcm91cCBIZWxwVGV4' + + 'dCBhcyBYTUwKICAgIGNoYXIgUlROSEVMUElEWzIxXTsKICAgIFF1aF9JZHNfVG9fUnR2X3QgaGVscElEOyAvLyBQYW5lbCBHcm91' + + 'cC9JRCB0byBsb2NhdGUKICAgIGludCBlb2Y7Cn0gc2NyYXRjaF90OwoKc2NyYXRjaF90IHNjcmF0Y2g7CgovKiA9PT09PT09PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogSGVscGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAg' + + 'ICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwppbmxpbmUg' + + 'dm9pZCAgY296X2NvcHlQYWQoY2hhciogdCwgY29uc3QgY2hhciogcywgaW50IHBhZExlbiA9IDEwLCBjaGFyIHBhZENoYXIgPSAn' + + 'ICcpOwppbmxpbmUgdm9pZCAgY296X0RMVE9CSihjb25zdCBjaGFyKiBxdWFsT2JqTmFtZSwgY29uc3QgY2hhciogb2JqVHlwZSwg' + + 'Y29uc3QgY2hhciogQVNQTmFtZSA9ICIqIik7CmlubGluZSBpbnQgICBjb3pfdG9VcHBlcihjaGFyKiBzekRhdGEsIGludCBpbkxl' + + 'biA9IC0xLCBpbnQgY2NzaWQgPSAwKTsKaW5saW5lIGludCAgIGNvel9uYW1lVXBwZXIoY2hhciogc3pEYXRhLCBpbnQgaW5MZW4g' + + 'PSAtMSk7CgppbmxpbmUgY2hhciogY296X1RFTVBfVVNSU1BBQ0UoY2hhciogcnRuVVNOYW1lLCBjb25zdCBjaGFyKiBvYmpBdHRy' + + 'ID0gIlNRTFRPT0xTIiwgaW50IGluaXRTaXplID0gNDA5Nik7CmlubGluZSBjaGFyKiBjb3pfZ2V0UHRyVXNyU3BhY2UoY29uc3Qg' + + 'Y2hhciogcDJQYXJ0VXNyU3BhY2VOYW1lKTsKCmlubGluZSB2b2lkICBjb3pfbWFrZUFQSU9iak5hbWUoY2hhciogb2JqTmFtZSwg' + + 'Y29uc3QgY2hhciogcXVhbE9iaiwgY29uc3QgY2hhciogZGZ0TGliID0gIipMSUJMIik7CmlubGluZSBpbnQgICBjb3pfY29weVVu' + + 'dGlsKGNoYXIqIHQsIGNvbnN0IGNoYXIqIHMsIGludCBtYXhMZW4gPSAxMCwgY29uc3QgY2hhciogc3RvcEF0ID0gTlVMTCwgYm9v' + + 'bCBiVHJpbSA9IGZhbHNlKTsKaW5saW5lIHZvaWQgIGNvel9yZXNpZ25hbE1zZyhjb3pfcXVzZWMmIGVjKTsKaW5saW5lIGNoYXIq' + + 'IGNvel9nZXROZXh0UGFybUlmKGludCYgcEMsIGludCYgYXJnYywgY2hhcioqIGFyZ3YsIGludCBpb0ZsYWcgPSAwKTsKCiNkZWZp' + + 'bmUgaW5DaGFyKF92KSBcCiAgICBjaGFyICppbiMjX3YgPSBcCiAgICAgICAgKGNoYXIqKSBjb3pfZ2V0TmV4dFBhcm1JZihwLGFy' + + 'Z2MsYXJndikKI2RlZmluZSBvdXRDTE9CKF92KSAgXAogICAgIFNRTFVERl9DTE9CKiAgIG91dCMjX3YgPSBcCiAgICAgICAgKFNR' + + 'TFVERl9DTE9CKikgIGNvel9nZXROZXh0UGFybUlmKHAsIGFyZ2MsIGFyZ3YsIDQpCgoKI2RlZmluZSBpbkluZHkoX3YpIFwKICAg' + + 'IHNob3J0ICppbmR5SW4jI192ID0gXAogICAgICAgIChzaG9ydCopIGNvel9nZXROZXh0UGFybUlmKHAsYXJnYyxhcmd2KQojZGVm' + + 'aW5lIG91dEluZHkoX3YpIFwKICAgIHNob3J0ICppbmR5IyNfdiA9IFwKICAgICAgICAoc2hvcnQqKSBjb3pfZ2V0TmV4dFBhcm1J' + + 'ZihwLGFyZ2MsYXJndiwyKQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoKICAgIGludCBwID0gMDsKCiAgICBf' + + 'TUlfVGltZSAgICAgICBtdDsKICAgIHRpbWVfdCAgICAgICAgIGVwb2NoVGltZTsKICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAg' + + 'aW50ICAgICAgICAgICAgcmMgPSAwOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq' + + 'KioqKioqKioqKioqLwogICAgLyogQ29weXJpZ2h0IDE5OTItMjAyMiBieSBvdXQgQ296emksIEpyLiAgICAgICAgICAgICAgICAg' + + 'ICAqLwogICAgLyogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAv' + + 'KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAvLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyAgSU5QVVQgUGFyYW1ldGVycwogICAgLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgaW5DaGFyKExJQik7ICAgICAgLy8gTGlicmFyeSBuYW1l' + + 'IGZvciBDTUROQU1FCiAgICBpbkNoYXIoQ01ETkFNRSk7ICAvLyAqQ01EIG5hbWUgVkFSQ0hBUigxMCkKICAgIGluQ2hhcihIRUxQ' + + 'SUQpOyAvLyBMaXN0IG9mIEhlbHAgSURzIChwYXJhbWV0ZXIgS1dEIG5hbWVzKQoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyAgT1VUUFVUIEZpZWxkcwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgb3V0Q0xPQihDTURYTUwpOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vICBJbnB1dCBQYXJhbWV0ZXJzJyBJTkRJQ0FUT1JTCiAg' + + 'ICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIGluSW5keShM' + + 'SUIpOyAgICAgIC8vIExpYnJhcnkgbmFtZQogICAgaW5JbmR5KENNRE5BTUUpOyAgLy8gQ29tbWFuZCBuYW1lCiAgICBpbkluZHko' + + 'SEVMUElEKTsgICAvLyBMaXN0IG9mIGhlbHAgSURzCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyAgT3V0cHV0IENvbHVtbnMnIElORElDQVRPUlMKICAgIC8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgb3V0SW5keShDTURYTUwpOwoKICAgIC8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8gIFNRTCBzcGVj' + + 'aWZpYyBwYXJhbWV0ZXJzCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8KICAgIGNoYXIgKnNxbHN0YXRlID0gKGNoYXIgKiljb3pfZ2V0TmV4dFBhcm1JZihwLCBhcmdjLCBhcmd2KTsKICAgIGNo' + + 'YXIgKmZ1bmNOYW1lID0gKGNoYXIgKiljb3pfZ2V0TmV4dFBhcm1JZihwLCBhcmdjLCBhcmd2KTsKICAgIGNoYXIgKnNwZWNpZmlj' + + 'TmFtZSA9IChjaGFyICopY296X2dldE5leHRQYXJtSWYocCwgYXJnYywgYXJndik7CiAgICBjaGFyICpzcWxtc2d0ZXh0ID0gKGNo' + + 'YXIgKiljb3pfZ2V0TmV4dFBhcm1JZihwLCBhcmdjLCBhcmd2KTsKICAgIGNoYXIgKnNjcmF0Y2hQYWQgPSAoY2hhciAqKWNvel9n' + + 'ZXROZXh0UGFybUlmKHAsIGFyZ2MsIGFyZ3YpOwogICAgaW50ICAqc3FsT3BDb2RlID0gKGludCAqKWNvel9nZXROZXh0UGFybUlm' + + 'KHAsIGFyZ2MsIGFyZ3YpOwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v' + + 'Ly8vLy8vLwogICAgLy8gIEJFR0lOIG1haW4oKSBib2R5IChhZnRlciBwYXJtcyBzdGFydHMgaGVyZSkKICAgIC8vLy8vLy8vLy8v' + + 'Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICBzY3JhdGNoX3QqIHBTY3JhdGNo' + + 'ID0gKHNjcmF0Y2hfdCAqKXNjcmF0Y2hQYWQ7CiAgICAgY2hhciogICAgICBwQnVmZmVyID0gTlVMTDsKICAgICBpbnQgICAgICAg' + + 'IGJ1ZkxlbiA9IDA7CiAgICAgaW50ICAgICAgICBJRGNvdW50ID0gMTsKICAgICBpbnQgICAgICAgIG1heE91dHB1dExlbiA9IDY1' + + 'NTM1OwogICAgIGNoYXIgICAgICAgcXVhbENNRFsyMV07CiAgICAgY296X3F1c2VjIGVjOwoKICAgICBRY2RfQ01ESTAxMDBfdCAg' + + 'Y21kRGVzYzsKICAgICBjaGFyIENNRERfQVBJRk1UW10gPSAiQ01ESTAxMDAiOwoKICAgICBRdWhfSWRzX1RvX1J0dl90IGhlbHBJ' + + 'RDsKICAgICBjaGFyIEhMUERfQVBJRk1UW10gPSAiUkhMUDAxMDAiOwoKICAgICBpZiAoKnNxbE9wQ29kZSA9PSBTUUxVREZfVEZf' + + 'T1BFTikKICAgICB7CiAgICAgICAvLyBPbmUtT2ZmIHN0dWZmIGdvZXMgaGVyZQoKICAgICAgIC8vIEluaXRpYWxpemUgU2NyYXRj' + + 'aCBwYWQKICAgICAgIG1lbXNldChwU2NyYXRjaCwgMHgwMCwgc2l6ZW9mKHNjcmF0Y2gpKTsKCiAgICAgIGNvel90b1VwcGVyKGlu' + + 'Q01ETkFNRSk7CiAgICAgIGNvel90b1VwcGVyKGluTElCKTsKICAgICAgY296X21ha2VBUElPYmpOYW1lKHF1YWxDTUQsIGluQ01E' + + 'TkFNRSwgaW5MSUIpOwogICAgICBzdHJjcHkocFNjcmF0Y2gtPmNtZE5hbWUsIGluQ01ETkFNRSk7CiAgICAgIG1lbXNldCgmY21k' + + 'RGVzYywweDAwLHNpemVvZihjbWREZXNjKSk7CiAgICAgIGJ1ZkxlbiA9IHNpemVvZihjbWREZXNjKTsKICAgICAgZWMuaW5pdCgp' + + 'OwogICAgICBjaGFyIGZvbGxvd1Byb3h5ID0gJzEnOwogICAgICBRQ0RSQ01ESSgmY21kRGVzYyxidWZMZW4sQ01ERF9BUElGTVQs' + + 'CiAgICAgICAgICAgICAgIHF1YWxDTUQsJmVjLCAmZm9sbG93UHJveHkpOwoKICAgICAgIGlmIChlYy5oYXNFcnJvcigpKQogICAg' + + 'ICAgewogICAgICAgICBjb3pfcmVzaWduYWxNc2coZWMpOwogICAgICAgICBzdHJjcHkoc3Fsc3RhdGUsICIwMjAwMCIpOwogICAg' + + 'ICAgICBwU2NyYXRjaC0+ZW9mID0gMTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQoKICAgICAgICBtZW1zZXQoKGNoYXIg' + + 'KikmcFNjcmF0Y2gtPmhlbHBJRCwgJyAnLCBzaXplb2YoaGVscElEKSk7CiAgICAgICAgX0NQWUJZVEVTKHBTY3JhdGNoLT5oZWxw' + + 'SUQuSGVscF9JZF9OYW1lLCBjbWREZXNjLkhlbHBfSWQsIHNpemVvZihjbWREZXNjLkhlbHBfSWQpKTsKICAgICAgICBfQ1BZQllU' + + 'RVMocFNjcmF0Y2gtPmhlbHBJRC5PYmplY3RfTmFtZSwgIGNtZERlc2MuSGVscF9QYW5lbF9OYW1lLCBzaXplb2YoY21kRGVzYy5I' + + 'ZWxwX1BhbmVsX05hbWUpKTsKICAgICAgICBfQ1BZQllURVMocFNjcmF0Y2gtPmhlbHBJRC5PYmplY3RfTGliLCAgIGNtZERlc2Mu' + + 'SGVscF9QYW5lbF9MaWJfTmFtZSxzaXplb2YoY21kRGVzYy5IZWxwX1BhbmVsX0xpYl9OYW1lKSk7CiAgICAgICAgX0NQWUJZVEVT' + + 'KHBTY3JhdGNoLT5oZWxwSUQuT2JqZWN0X1R5cGUsICAiKlBOTEdSUCIsIDcpOwoKICAgICAgICBjaGFyKiBwSGVscCAgICAgICAg' + + 'PSAoY2hhciopIGNvel9URU1QX1VTUlNQQUNFKHBTY3JhdGNoLT5IRUxQVEVYVCwgIkNNREhFTFAiLCBjb3pfTUFYTUVNMTVNKTsK' + + 'ICAgICAgICBjaGFyKiBwSGVscElEQXJyYXkgPSAoY2hhciopIGNvel9URU1QX1VTUlNQQUNFKHBTY3JhdGNoLT5IRUxQSUQsICJD' + + 'TURIRUxQSUQiKTsKICAgICAgICBjaGFyKiBwUnRuSGVscElEICAgPSAoY2hhciopIGNvel9URU1QX1VTUlNQQUNFKHBTY3JhdGNo' + + 'LT5SVE5IRUxQSUQsICJSVE5IRUxQSUQiKTsKICAgIH0KICAgIGlmICgqc3FsT3BDb2RlID09IFNRTFVERl9URl9GRVRDSCAmJiBw' + + 'U2NyYXRjaC0+ZW9mID09IDEpCiAgICB7CiAgICAgICAgc3RyY3B5KHNxbHN0YXRlLCAiMDIwMDAiKTsKICAgICAgICBwU2NyYXRj' + + 'aC0+ZW9mID0gMTsKICAgIH0KCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t' + + 'LS0tLS0KICAgIC8vIEYgRSBUIEMgSCAgIE9wZXJhdGlvbgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t' + + 'LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBpZiAoKnNxbE9wQ29kZSA9PSBTUUxVREZfVEZfRkVUQ0ggJiYgcFNjcmF0Y2gtPmVv' + + 'ZiA9PSAwKQogICAgewoKICAgICAgY2hhciogcEhlbHBJREFycmF5ID0gKGNoYXIqKSBjb3pfZ2V0UHRyVXNyU3BhY2UocFNjcmF0' + + 'Y2gtPkhFTFBJRCk7CiAgICAgIGNoYXIqIHBIZWxwICAgICAgICA9IChjaGFyKikgY296X2dldFB0clVzclNwYWNlKHBTY3JhdGNo' + + 'LT5IRUxQVEVYVCk7CiAgICAgIGNoYXIgKnBSdG5IZWxwSUQgICA9IChjaGFyKikgY296X2dldFB0clVzclNwYWNlKHBTY3JhdGNo' + + 'LT5SVE5IRUxQSUQpOwogICAgICBidWZMZW4gPSA2NTUzNTsKICAgICAgbWF4T3V0cHV0TGVuID0gY296X01BWE1FTTE1TTsKICAg' + + 'ICAgUXVoX0lkc19Ub19SdHZfdCB0b2tlbklEOwogICAgICBJRGNvdW50ID0gMDsgIC8vIE51bWJlciBvZiBIZWxwSUQgdG9rZW5z' + + 'IGZvdW5kIChpbmNyZW1lbnRlZCBiZWxvdykKICAgICAgaW50IHRva2VuT2Zmc2V0ID0gMDsKICAgICAgY2hhciBoZWxwSURbMzJd' + + 'OwoKICAgICAgbWVtc2V0KChjaGFyICopJnRva2VuSUQsICcgJywgc2l6ZW9mKHRva2VuSUQpKTsKICAgICAgY296X3RvVXBwZXIo' + + 'aW5IRUxQSUQpOwogICAgICAvLyBUb2tlbml6ZSBpbkhFTFBJRCAtLSBkZWxpbWl0ZXJzOiBibGFuaywgY29tbWEsIG9yIGNvbG9u' + + 'CiAgICAgIHsKICAgICAgICAgIGNoYXIgIHRva2VuV29ya1syMV07CiAgICAgICAgICBpbnQgICBjcHlMZW4gICAgID0gc3RybGVu' + + 'KGluSEVMUElEKTsKICAgICAgICAgIGNoYXIgKnRvayA9IHN0cnRvayhpbkhFTFBJRCwgIiAsOiIpOwogICAgICAgICAgX0NQWUJZ' + + 'VEVTKHRva2VuSUQuT2JqZWN0X05hbWUsIHBTY3JhdGNoLT5oZWxwSUQuT2JqZWN0X05hbWUsIHNpemVvZih0b2tlbklELk9iamVj' + + 'dF9OYW1lKSk7CiAgICAgICAgICBfQ1BZQllURVModG9rZW5JRC5PYmplY3RfTGliLCAgcFNjcmF0Y2gtPmhlbHBJRC5PYmplY3Rf' + + 'TGliLCAgc2l6ZW9mKHRva2VuSUQuT2JqZWN0X0xpYikpOwogICAgICAgICAgX0NQWUJZVEVTKHRva2VuSUQuT2JqZWN0X1R5cGUs' + + 'IHBTY3JhdGNoLT5oZWxwSUQuT2JqZWN0X1R5cGUsIHNpemVvZih0b2tlbklELk9iamVjdF9UeXBlKSk7CiAgICAgICAgICBpZiAo' + + 'KmluZHlJbkhFTFBJRCA8IDAgfHwgc3RybGVuKGluSEVMUElEKT09MCkgLy8gSEVMUCBJRHMgYXJlIG51bGwvZW1wdHk/CiAgICAg' + + 'ICAgICB7CiAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKXRva2VuSUQuSGVscF9JZF9OYW1lLCAnICcsIHNpemVvZih0b2tlbklE' + + 'LkhlbHBfSWRfTmFtZSkpOwogICAgICAgICAgICBfQ1BZQllURVModG9rZW5JRC5IZWxwX0lkX05hbWUsIHBTY3JhdGNoLT5jbWRO' + + 'YW1lLCBzdHJsZW4ocFNjcmF0Y2gtPmNtZE5hbWUpKTsKICAgICAgICAgICAgX0NQWUJZVEVTKHBIZWxwSURBcnJheSArIHRva2Vu' + + 'T2Zmc2V0LCAoY2hhciopJnRva2VuSUQsIHNpemVvZih0b2tlbklEKSk7CiAgICAgICAgICAgIElEY291bnQrKzsKICAgICAgICAg' + + 'IH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgd2hpbGUgKHRvayAhPSBOVUxMKQogICAgICAgICAgICB7' + + 'CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBTY3JhdGNoLT5jbWROYW1lLHRvayk9PTAgfHwgc3RyY21wKHRvaywiKkNNRCIp' + + 'PT0wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0cmNweShoZWxwSUQsIHBTY3JhdGNoLT5jbWROYW1l' + + 'KTsgIC8vIEdlbmVyYWwgQ29tbWFuZCBoZWxwL25vdCBwYXJhbWV0ZXIgaGVscAogICAgICAgICAgICAgICAgfQogICAgICAgICAg' + + 'ICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3ByaW50ZihoZWxwSUQsICIlcy8lcyIsIHBTY3Jh' + + 'dGNoLT5jbWROYW1lLCB0b2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopdG9rZW5J' + + 'RC5IZWxwX0lkX05hbWUsICcgJywgc2l6ZW9mKHRva2VuSUQuSGVscF9JZF9OYW1lKSk7CiAgICAgICAgICAgICAgICBfQ1BZQllU' + + 'RVModG9rZW5JRC5IZWxwX0lkX05hbWUsIGhlbHBJRCwgc3RybGVuKGhlbHBJRCkpOwogICAgICAgICAgICAgICAgX0NQWUJZVEVT' + + 'KHBIZWxwSURBcnJheSArIHRva2VuT2Zmc2V0LCAoY2hhciopJnRva2VuSUQsIHNpemVvZih0b2tlbklEKSk7CgogICAgICAgICAg' + + 'ICAgICAgSURjb3VudCsrOwogICAgICAgICAgICAgICAgdG9rZW5PZmZzZXQgKz0gc2l6ZW9mKHRva2VuSUQpOwoKICAgICAgICAg' + + 'ICAgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiICw6Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAg' + + 'UVVIUkhMUFQocFJ0bkhlbHBJRCwgJmJ1ZkxlbiwgSExQRF9BUElGTVQsIHBIZWxwSURBcnJheSwgJklEY291bnQsIHBIZWxwLCAm' + + 'bWF4T3V0cHV0TGVuLCAmZWMpOwoKICAgICAgaWYgKGVjLmhhc05vRXJyb3IoKSkKICAgICAgewogICAgICAgIF9DUFlCWVRFUyhv' + + 'dXRDTURYTUwtPmRhdGEsIHBIZWxwICsgKHNpemVvZihpbnQpKjIpLCAoKFF1aF9IZWxwX0lkX1R4dCopcEhlbHApLT5CeXRlc19S' + + 'ZXR1cm5lZCk7CiAgICAgICAgb3V0Q01EWE1MLT5sZW5ndGggPSAoKFF1aF9IZWxwX0lkX1R4dCAqKXBIZWxwKS0+Qnl0ZXNfUmV0' + + 'dXJuZWQgLSAoc2l6ZW9mKGludCkqMik7CiAgICAgIH0KICAgICAgcFNjcmF0Y2gtPmVvZiA9IDE7IC8vIE9ubHkgb25lIHJvdyBy' + + 'ZXR1cm5lZCBzbyBzZXRvbiBvdXIgIkVPRiIgZmxhZwogICAgfQoKICAgIGlmICgqc3FsT3BDb2RlID09IFNRTFVERl9URl9DTE9T' + + 'RSkKICAgIHsKICAgICAgICBjb3pfRExUT0JKKHBTY3JhdGNoLT5IRUxQSUQsICAgICIqVVNSU1BDIik7CiAgICAgICAgY296X0RM' + + 'VE9CSihwU2NyYXRjaC0+SEVMUFRFWFQsICAiKlVTUlNQQyIpOwogICAgICAgIGNvel9ETFRPQkoocFNjcmF0Y2gtPlJUTkhFTFBJ' + + 'RCwgIipVU1JTUEMiKTsKICAgIH0KICAgIGlmICgqc3FsT3BDb2RlID09IFNRTFVERl9URl9GSU5BTCB8fAogICAgICAgICpzcWxP' + + 'cENvZGUgPT0gU1FMVURGX1RGX0ZJTkFMX0NSQSkKICAgIHsKICAgICAgICAvLyBubyBmaW5hbCBjYWxsIGNvZGUgZm9yIG5vdwog' + + 'ICAgfQp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogY296X2NvcHlQYWQg' + + 'ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIENvcHkgcyB0byB0LCBibGFuay1wYWRkaW5nIHRvIHBhZExl' + + 'biBieXRlcy4gICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KaW5saW5lIHZv' + + 'aWQgY296X2NvcHlQYWQoCiAgICBjaGFyKiAgICAgICB0LAogICAgY29uc3QgY2hhciogcywKICAgIGludCAgICAgICAgIHBhZExl' + + 'biwKICAgIGNoYXIgICAgICAgIHBhZENoYXIpCnsKICAgIGludCBzbGVuID0gKHMgIT0gTlVMTCkgPyAoaW50KXN0cmxlbihzKSA6' + + 'IDA7CiAgICBtZW1zZXQodCwgcGFkQ2hhciwgcGFkTGVuKTsKICAgIGlmIChzbGVuID4gMCkKICAgICAgICBfQ1BZQllURVModCwg' + + 'cywKICAgICAgICAgICAgICAgICAgKHNsZW4gPCBwYWRMZW4pID8gc2xlbiA6IHBhZExlbik7Cn0KCgovKiA9PT09PT09PT09PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogY296X0RMVE9CSiAgICAgICAgICAgICAgICAgICAgICAgICAg' + + 'ICAgICAgICAgICovCi8qIERlbGV0ZSBhbiBJQk0gaSBvYmplY3QgdmlhIFFMSURMVE8gQVBJLiAgICAgICAqLwovKiA9PT09PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KaW5saW5lIHZvaWQgY296X0RMVE9CSigKICAgIGNvbnN0' + + 'IGNoYXIqIHF1YWxPYmpOYW1lLAogICAgY29uc3QgY2hhciogb2JqVHlwZSwKICAgIGNvbnN0IGNoYXIqIEFTUE5hbWUpCnsKICAg' + + 'IGNoYXIgc3pPYmpUeXBlWzExXTsKICAgIGNoYXIgc3pBU1BbMTFdOwogICAgY2hhciBybXZNc2dbMV0gPSB7JzEnfTsKICAgIGNv' + + 'el9xdXNlYyBlYzsKICAgIGlmIChxdWFsT2JqTmFtZSA9PSBOVUxMICB8fAogICAgICAgIHF1YWxPYmpOYW1lWzBdID09ICcgJyB8' + + 'fAogICAgICAgIHF1YWxPYmpOYW1lWzBdID09IDB4MDApCiAgICAgICAgcmV0dXJuOwogICAgY296X2NvcHlQYWQoc3pPYmpUeXBl' + + 'LCBvYmpUeXBlLCAgMTApOwogICAgY296X2NvcHlQYWQoc3pBU1AsICAgICBBU1BOYW1lLCAgMTApOwogICAgZWMuaW5pdCgpOwog' + + 'ICAgUUxJRExUTygoY2hhciopcXVhbE9iak5hbWUsCiAgICAgICAgICAgIHN6T2JqVHlwZSwgc3pBU1AsCiAgICAgICAgICAgIHJt' + + 'dk1zZywgJmVjKTsKfQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogY296X3Rv' + + 'VXBwZXIgLyBjb3pfdG9Mb3dlciAgICAgICAgICAgICAgICAgICAgICovCi8qIEluLXBsYWNlIEVCQ0RJQyBjYXNlIGNvbnZlcnNp' + + 'b24uICAgICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KaW5s' + + 'aW5lIGludCBjb3pfdG9VcHBlcigKICAgIGNoYXIqIHN6RGF0YSwKICAgIGludCAgIGluTGVuLAogICAgaW50ICAgY2NzaWQpCnsK' + + 'ICAgIFFsZ19DQ1NJRF9SZXFDdGxCbGtfVCBmcmNiOwogICAgY296X3F1c2VjIGVjOwogICAgbG9uZyBsZW4gPSAoaW5MZW4gPD0g' + + 'MCkKICAgICAgICAgICAgICAgPyAobG9uZylzdHJsZW4oc3pEYXRhKSA6IGluTGVuOwogICAgbWVtc2V0KChjaGFyKikmZnJjYiwg' + + 'MHgwMCwgc2l6ZW9mKGZyY2IpKTsKICAgIGZyY2IuVHlwZV9vZl9SZXF1ZXN0ICAgICA9IDE7CiAgICBmcmNiLkNhc2VfUmVxdWVz' + + 'dCAgICAgICAgPSBfVE9VUFBFUjsKICAgIGZyY2IuQ0NTSURfb2ZfSW5wdXRfRGF0YSA9IGNjc2lkOwogICAgaWYgKGxlbiA+IDAp' + + 'CiAgICAgICAgUWxnQ29udmVydENhc2UoKGNoYXIqKSZmcmNiLAogICAgICAgICAgICAgICAgICAgICAgIHN6RGF0YSwgc3pEYXRh' + + 'LAogICAgICAgICAgICAgICAgICAgICAgICZsZW4sIChjaGFyKikmZWMpOwogICAgcmV0dXJuIChpbnQpbGVuOwp9CgovKiA9PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogY296X25hbWVVcHBlciAgICAgICAgICAgICAg' + + 'ICAgICAgICAgICAgICAgICAgICovCi8qIENvbnZlcnRzIG5vbi1xdW90ZWQgSUJNIGkgb2JqZWN0IG5hbWUgdG8gICAgICAqLwov' + + 'KiB1cHBlciBjYXNlIGluLXBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09ICovCmlubGluZSBpbnQgY296X25hbWVVcHBlcigKICAgIGNoYXIqIHN6RGF0YSwKICAg' + + 'IGludCAgIGluTGVuKQp7CiAgICBjb25zdCBjaGFyIHEgPSAnIic7CiAgICBpbnQgbGVuID0gKGluTGVuIDw9IDApCiAgICAgICAg' + + 'ICAgICAgICAgID8gKGludClzdHJsZW4oc3pEYXRhKSA6IGluTGVuOwogICAgaWYgKHN6RGF0YVswXSA9PSBxKSByZXR1cm4gaW5M' + + 'ZW47CiAgICByZXR1cm4gY296X3RvVXBwZXIoc3pEYXRhLCBsZW4pOwp9CgppbmxpbmUgY2hhciogY296X2dldFB0clVzclNwYWNl' + + 'KAogICAgY29uc3QgY2hhciogcDJQYXJ0VXNyU3BhY2VOYW1lKQp7CiAgICB2b2lkKiAgICAgcFVTID0gTlVMTDsKICAgIGNvel9x' + + 'dXNlYyBlYzsKICAgIGVjLmluaXQoKTsKICAgIFFVU1BUUlVTKChjaGFyKilwMlBhcnRVc3JTcGFjZU5hbWUsCiAgICAgICAgICAg' + + 'ICAmcFVTLCAmZWMpOwogICAgaWYgKGVjLmlzRW1wdHkoKSkgcmV0dXJuIChjaGFyKilwVVM7CiAgICByZXR1cm4gTlVMTDsKfQoK' + + 'LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIGNvel9URU1QX1VTUlNQQUNFICAg' + + 'ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBDcmVhdGUgYSB0ZW1wb3JhcnkgKlVTUlNQQyBpbiBRVEVNUC4gICAgICAg' + + 'ICAgKi8KLyogUmV0dXJucyBwb2ludGVyIHRvIHVzZXItc3BhY2UgZGF0YSBhcmVhOyAgICAgICovCi8qIHN0b3JlcyAyMC1jaGFy' + + 'IEFQSSBuYW1lIGluIHJ0blVTTmFtZVsyMF0uICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09' + + 'PT09PT09PT0gKi8KaW5saW5lIGNoYXIqIGNvel9URU1QX1VTUlNQQUNFKAogICAgICAgICAgICAgICAgY2hhciogICAgICAgcnRu' + + 'VVNOYW1lLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciogb2JqQXR0ciwKICAgICAgICAgICAgICAgIGludCAgICAgICAgIGlu' + + 'aXRTaXplKQp7CiAgICBjaGFyIHF1YWxOYW1lWzIxXTsKICAgIGNoYXIgZXh0QXR0clsxMV07CiAgICBjaGFyIHB1YkF1dFsxMV07' + + 'CiAgICBjaGFyIHRleHRbNTFdOwogICAgY2hhciByZXBsWzExXTsKICAgIGNoYXIgZG9tYWluWzExXTsKICAgIGNoYXIgaW5pdFZh' + + 'bCA9IDB4MDA7CiAgICBjaGFyKiBwVVMgICA9IE5VTEw7CiAgICBjb3pfcXVzZWMgZWM7CiAgICBzdGQ6OnN0cmluZyBubTsKICAg' + + 'IHNpemVfdCBwb3MgPSAwOwogICAgbWVtc2V0KHF1YWxOYW1lLCAnICcsIDIwKTsKICAgIHF1YWxOYW1lWzIwXSA9IDB4MDA7CiAg' + + 'ICBubSAgPSB0bXBuYW0oTlVMTCk7CiAgICBwb3MgPSBubS5maW5kX2xhc3Rfb2YoIi9cXCIpOwogICAgaWYgKHBvcyAhPSBzdGQ6' + + 'OnN0cmluZzo6bnBvcykKICAgICAgICBubS5lcmFzZSgwLCBwb3MgKyAxKTsKICAgIGlmIChubS5sZW5ndGgoKSA+IDEwKQogICAg' + + 'ICAgIG5tLnJlc2l6ZSgxMCk7CgogICAgY296X21ha2VBUElPYmpOYW1lKAogICAgICAgIHF1YWxOYW1lLCBubS5jX3N0cigpLCAi' + + 'UVRFTVAiKTsKCiAgICBjb3pfbmFtZVVwcGVyKHF1YWxOYW1lLCAyMCk7CgogICAgY296X2NvcHlQYWQoZXh0QXR0ciwgb2JqQXR0' + + 'ciwgICAgICAgMTApOwogICAgY296X2NvcHlQYWQocHViQXV0LCAgIipMSUJDUlRBVVQiLCAgMTApOwogICAgY296X2NvcHlQYWQo' + + 'dGV4dCwKICAgICAgICAgICAgICAgICJTUE9PTERBVEEgVURURiBUZW1wIFNwYWNlIiwgNTApOwogICAgY296X2NvcHlQYWQocmVw' + + 'bCwgICAiKk5PIiwgICAgICAgICAgMTApOwogICAgY296X2NvcHlQYWQoZG9tYWluLCAiKkRFRkFVTFQiLCAgICAgMTApOwogICAg' + + 'ZWMuaW5pdCgpOwogICAgUVVTQ1JUVVMocXVhbE5hbWUsIGV4dEF0dHIsIGluaXRTaXplLAogICAgICAgICAgICAgJmluaXRWYWws' + + 'IHB1YkF1dCwgdGV4dCwKICAgICAgICAgICAgIHJlcGwsICZlYywgZG9tYWluKTsKICAgIGlmIChlYy5pc0VtcHR5KCkpIHsKICAg' + + 'ICAgICAvKiBFbmFibGUgYXV0by1leHRlbmQgc28gdGhlIHNwYWNlIGdyb3dzICAgKi8KICAgICAgICAvKiBhdXRvbWF0aWNhbGx5' + + 'IHdoZW4gQVBJcyB3cml0ZSBwYXN0IHRoZSAgKi8KICAgICAgICAvKiBpbml0aWFsIHNpemUgKGUuZy4gUURCUlRWRkQpLiAgICAg' + + 'ICAgICAgKi8KICAgICAgICAvKiBrZXk9MyBpcyBBdXRvRXh0ZW5kOyBrZXk9MT1zaXplLCAgICAgICAgKi8KICAgICAgICAvKiBr' + + 'ZXk9Mj1Jbml0Q2hhciwga2V5PTQ9VHJhbnNmZXJTaXplLiAgICAgKi8KICAgICAgICB0eXBlZGVmIF9QYWNrZWQgc3RydWN0IHsK' + + 'ICAgICAgICAgICAgaW50ICBrZXk7CiAgICAgICAgICAgIGludCAgZGF0YUxlbjsKICAgICAgICAgICAgdW5pb24gewogICAgICAg' + + 'ICAgICAgICAgaW50ICBzaXplOwogICAgICAgICAgICAgICAgaW50ICB0cmFuc2ZlclNpemU7CiAgICAgICAgICAgICAgICBjaGFy' + + 'IGF1dG9FeHRlbmQ7CiAgICAgICAgICAgICAgICBjaGFyIGluaXRWYWx1ZTsKICAgICAgICAgICAgfTsKICAgICAgICB9IGNvel9z' + + 'cGFjZUtleV90OwogICAgICAgIHR5cGVkZWYgX1BhY2tlZCBzdHJ1Y3QgewogICAgICAgICAgICBpbnQgICAgICAgICAgIGNvdW50' + + 'OwogICAgICAgICAgICBjb3pfc3BhY2VLZXlfdCBhdHRyWzFdOwogICAgICAgIH0gY296X3NwYWNlQXR0cl90OwogICAgICAgIGNv' + + 'el9zcGFjZUF0dHJfdCBzcGFjZUF0dHI7CiAgICAgICAgc3BhY2VBdHRyLmNvdW50ICAgICAgICAgID0gMTsKICAgICAgICBzcGFj' + + 'ZUF0dHIuYXR0clswXS5rZXkgICAgID0gMzsKICAgICAgICBzcGFjZUF0dHIuYXR0clswXS5kYXRhTGVuID0gMTsKICAgICAgICBz' + + 'cGFjZUF0dHIuYXR0clswXS5hdXRvRXh0ZW5kID0gJzEnOwogICAgICAgIGNoYXIgcnRuTGliWzEwXTsKICAgICAgICBtZW1zZXQo' + + 'cnRuTGliLCAnICcsIHNpemVvZihydG5MaWIpKTsKICAgICAgICBlYy5pbml0KCk7CiAgICAgICAgUVVTQ1VTQVQocnRuTGliLCBx' + + 'dWFsTmFtZSwgJnNwYWNlQXR0ciwgJmVjKTsKICAgICAgICAvKiBOb24tZmF0YWwgaWYgUVVTQ1VTQVQgZmFpbHMgGiBzcGFjZSAg' + + 'ICAgKi8KICAgICAgICAvKiB3aWxsIHN0aWxsIHdvcmssIGp1c3Qgd29uJ3QgYXV0by1ncm93LiAgKi8KICAgICAgICBlYy5pbml0' + + 'KCk7CiAgICAgICAgUVVTUFRSVVMocXVhbE5hbWUsICh2b2lkKiopJnBVUywgJmVjKTsKICAgIH0KICAgIGlmIChwVVMgIT0gTlVM' + + 'TCAmJiBydG5VU05hbWUgIT0gTlVMTCkKICAgICAgICBfQ1BZQllURVMocnRuVVNOYW1lLCBxdWFsTmFtZSwgMjApOwogICAgcmV0' + + 'dXJuIHBVUzsKfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBjb3pfbWFr' + + 'ZUFQSU9iak5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogQnVpbGQgMjAtY2hhciBJQk0gaSBBUEkgb2JqZWN0' + + 'IG5hbWUgZnJvbSAgICAgICovCi8qIHF1YWxpZmllZCBuYW1lIChMSUIvT0JKIG9yIE9CSikuICAgICAgICAgICAgICAqLwovKiA9' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KaW5saW5lIHZvaWQgY296X21ha2VBUElPYmpO' + + 'YW1lKAogICAgY2hhciogICAgICAgb2JqTmFtZSwKICAgIGNvbnN0IGNoYXIqIHF1YWxPYmosCiAgICBjb25zdCBjaGFyKiBkZnRM' + + 'aWIpCnsKICAgIGNoYXIgT0JKTkFNRVsxMV07CiAgICBjaGFyIExJQk5BTUVbMTFdOwogICAgbWVtc2V0KG9iak5hbWUsICAnICcs' + + 'IDIwKTsKICAgIG1lbXNldChPQkpOQU1FLCAgJyAnLCBzaXplb2YoT0JKTkFNRSkpOwogICAgbWVtc2V0KExJQk5BTUUsICAnICcs' + + 'IHNpemVvZihMSUJOQU1FKSk7CiAgICBPQkpOQU1FWzEwXSA9IDB4MDA7CiAgICBMSUJOQU1FWzEwXSA9IDB4MDA7CiAgICBjb25z' + + 'dCBjaGFyKiBzbGFzaFBvcyA9IHN0cmNocihxdWFsT2JqLCAnLycpOwogICAgaWYgKHNsYXNoUG9zICE9IE5VTEwpIHsKICAgICAg' + + 'ICBpbnQgbGVuID0gKGludCkoc2xhc2hQb3MgLSBxdWFsT2JqKTsKICAgICAgICBpbnQgb2xlbiA9IChpbnQpc3RybGVuKHNsYXNo' + + 'UG9zICsgMSk7CiAgICAgICAgaWYgKG9sZW4gPiAxMCkgb2xlbiA9IDEwOwogICAgICAgIGlmIChsZW4gID4gMTApIGxlbiAgPSAx' + + 'MDsKICAgICAgICBfQ1BZQllURVMoT0JKTkFNRSwgc2xhc2hQb3MgKyAxLCBvbGVuKTsKICAgICAgICBfQ1BZQllURVMoTElCTkFN' + + 'RSwgcXVhbE9iaiwgICAgICBsZW4pOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgb2xlbiA9IChpbnQpc3RybGVuKHF1YWxPYmop' + + 'OwogICAgICAgIGlmIChvbGVuID4gMTApIG9sZW4gPSAxMDsKICAgICAgICBfQ1BZQllURVMoT0JKTkFNRSwgcXVhbE9iaiwgb2xl' + + 'bik7CiAgICAgICAgaWYgKGRmdExpYiAhPSBOVUxMKSB7CiAgICAgICAgICAgIGludCBsbGVuID0gKGludClzdHJsZW4oZGZ0TGli' + + 'KTsKICAgICAgICAgICAgaWYgKGxsZW4gPiAxMCkgbGxlbiA9IDEwOwogICAgICAgICAgICBfQ1BZQllURVMoTElCTkFNRSwgZGZ0' + + 'TGliLCBsbGVuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfQ1BZQllURVMoTElCTkFNRSwgIipMSUJMIiwgNSk7CiAg' + + 'ICAgICAgfQogICAgfQogICAgX0NQWUJZVEVTKG9iak5hbWUsICAgICAgT0JKTkFNRSwgMTApOwogICAgX0NQWUJZVEVTKG9iak5h' + + 'bWUgKyAxMCwgTElCTkFNRSwgMTApOwp9CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09' + + 'ICovCi8qIGNvel9jb3B5VW50aWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBDb3B5IHMgdG8gdCAobnVs' + + 'bC10ZXJtaW5hdGVkKSwgc3RvcHBpbmcgYXQgICAqLwovKiBtYXhMZW4sIE5VTCwgb3IgYW55IGNoYXIgaW4gc3RvcEF0LiAgICAg' + + 'ICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmlubGluZSBpbnQgY296' + + 'X2NvcHlVbnRpbCgKICAgIGNoYXIqICAgICAgIHQsCiAgICBjb25zdCBjaGFyKiBzLAogICAgaW50ICAgICAgICAgbWF4TGVuLAog' + + 'ICAgY29uc3QgY2hhciogc3RvcEF0LAogICAgYm9vbCAgICAgICAgYlRyaW0pCnsKICAgIGludCBiU3RvcCAgPSAwOwogICAgaW50' + + 'IHJ0bkxlbiA9IDA7CiAgICBpbnQgaSAgICAgID0gMDsKICAgIGlmICh0ID09IE5VTEwgfHwgcyA9PSBOVUxMKSByZXR1cm4gMDsK' + + 'I3ByYWdtYSBleGNlcHRpb25faGFuZGxlcihjb3pfY3VfZXhjLFwKICAgIDAsIDAsXAogICAgX0MyX01IX0VTQ0FQRSB8IF9DMl9N' + + 'SF9GVU5DVElPTl9DSEVDSyxcCiAgICBfQ1RMQV9IQU5ETEUpCiAgICBtZW1zZXQodCwgJyAnLCBtYXhMZW4pOwogICAgd2hpbGUg' + + 'KHNbaV0gIT0gMHgwMCAmJiBpIDwgbWF4TGVuKSB7CiAgICAgICAgaWYgKHN0b3BBdCAhPSBOVUxMKSB7CiAgICAgICAgICAgIHNp' + + 'emVfdCBqOwogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3RybGVuKHN0b3BBdCk7IGorKykgewogICAgICAgICAgICAgICAg' + + 'aWYgKHNbaV0gPT0gc3RvcEF0W2pdKSB7CiAgICAgICAgICAgICAgICAgICAgYlN0b3AgPSAxOwogICAgICAgICAgICAgICAgfQog' + + 'ICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChiU3RvcCkgYnJlYWs7CiAgICAgICAgdFtpXSA9IHNbaV07CiAgICAg' + + 'ICAgaSsrOwogICAgfQogICAgaWYgKGJUcmltKSB7CiAgICAgICAgdFtpXSA9IDB4MDA7CiAgICAgICAgaWYgKGkgPiAwKQogICAg' + + 'ICAgICAgICB0Wzo6dHJpbWwodCwgJyAnKV0gPSAweDAwOwogICAgICAgIHJ0bkxlbiA9IChpbnQpc3RybGVuKHQpOwogICAgfSBl' + + 'bHNlIHsKICAgICAgICBydG5MZW4gPSBpOwogICAgfQojcHJhZ21hIGRpc2FibGVfaGFuZGxlcgogICAgcmV0dXJuIHJ0bkxlbjsK' + + 'Y296X2N1X2V4Yzo7CiAgICByZXR1cm4gcnRuTGVuOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09' + + 'PT09PT09PT0gKi8KLyogY296X3Jlc2lnbmFsTXNnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFJlLXNlbmQg' + + 'YW4gSUJNIGkgQVBJIGVycm9yIGFzIGEgcHJvZ3JhbSBtc2cuICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09' + + 'PT09PT09PT09PT09PT0gKi8KaW5saW5lIHZvaWQgY296X3Jlc2lnbmFsTXNnKGNvel9xdXNlYyYgZWMpCnsKICAgIGNoYXIgbXNn' + + 'ZmlsZVsyMV07CiAgICBjaGFyIG1zZ3R5cGVbMTFdOwogICAgY2hhciBtc2drZXlbNF07CiAgICBjaGFyIHRvcGdtcVsxMV07CiAg' + + 'ICBjaGFyIG1zZ1ByZWZpeFszXTsKICAgIGNoYXIgbXNnVHlwZVszXTsKICAgIHF1c2VjX3QgIGZjOwogICAgbWVtc2V0KChjaGFy' + + 'KikmZmMsIDB4MDAsIHNpemVvZihmYykpOwogICAgZmMuQnl0ZXNfUHJvdmlkZWQgPSBzaXplb2YoZmMpOwogICAgbWVtc2V0KG1z' + + 'Z2tleSwgICcgJywgc2l6ZW9mKG1zZ2tleSkpOwogICAgbWVtc2V0KG1zZ2ZpbGUsICcgJywgc2l6ZW9mKG1zZ2ZpbGUpKTsKICAg' + + 'IG1lbXNldCh0b3BnbXEsICAnICcsIHNpemVvZih0b3BnbXEpKTsKICAgIGNvel9jb3B5UGFkKHRvcGdtcSwgIioiLCAxMCk7CiAg' + + 'ICBpZiAoZWMuaXNFbXB0eSgpKSByZXR1cm47CiAgICBfQ1BZQllURVMobXNnUHJlZml4LCBlYy5tc2dpZCgpLCAyKTsKICAgIF9D' + + 'UFlCWVRFUyhtc2dUeXBlLCAgIGVjLm1zZ2lkKCkgKyAyLCAxKTsKICAgIG1zZ1R5cGVbMV0gICA9IDB4MDA7CiAgICBtc2dQcmVm' + + 'aXhbMl0gPSAweDAwOwogICAgaWYgKHN0cmNtcChtc2dQcmVmaXgsICJDUCIpID09IDApCiAgICAgICAgY296X21ha2VBUElPYmpO' + + 'YW1lKG1zZ2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRQ1BGTVNHIiwgIipMSUJMIik7CiAgICBlbHNlIGlmIChz' + + 'dHJjbXAobXNnUHJlZml4LCAiUk4iKSA9PSAwKQogICAgICAgIGNvel9tYWtlQVBJT2JqTmFtZShtc2dmaWxlLAogICAgICAgICAg' + + 'ICAgICAgICAgICAgICAgICAiUVJQR0xFTVNHIiwiUURFVlRPT0xTIik7CiAgICBlbHNlIGlmIChzdHJjbXAobXNnUHJlZml4LCAi' + + 'SFQiKSA9PSAwKQogICAgICAgIGNvel9tYWtlQVBJT2JqTmFtZShtc2dmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAi' + + 'UUhUVFBNU0ciLCAiUUhUVFBTVlIiKTsKICAgIGVsc2UgaWYgKHN0cmNtcChtc2dQcmVmaXgsICJDRSIpID09IDApCiAgICAgICAg' + + 'Y296X21ha2VBUElPYmpOYW1lKG1zZ2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRQ0VFTVNHIiwgIlFTWVMiKTsK' + + 'ICAgIGVsc2UgaWYgKHN0cmNtcChtc2dQcmVmaXgsICJHVSIpID09IDApCiAgICAgICAgY296X21ha2VBUElPYmpOYW1lKG1zZ2Zp' + + 'bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRR1VJTVNHIiwgICJRU1lTIik7CiAgICBlbHNlIGlmIChzdHJjbXAobXNn' + + 'UHJlZml4LCAiSVciKSA9PSAwKQogICAgICAgIGNvel9tYWtlQVBJT2JqTmFtZShtc2dmaWxlLAogICAgICAgICAgICAgICAgICAg' + + 'ICAgICAgICAiUUlXU01TRyIsICAiUVNZUyIpOwogICAgZWxzZQogICAgICAgIGNvel9tYWtlQVBJT2JqTmFtZShtc2dmaWxlLAog' + + 'ICAgICAgICAgICAgICAgICAgICAgICAgICAiUUNQRk1TRyIsICAiKkxJQkwiKTsKICAgIHN3aXRjaCAobXNnVHlwZVswXSkgewog' + + 'ICAgICAgIGNhc2UgJ0YnOiBjYXNlICdJJzoKICAgICAgICAgICAgY296X2NvcHlQYWQobXNndHlwZSwgIipJTkZPIiwgMTApOwog' + + 'ICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgY296X2NvcHlQYWQobXNndHlwZSwgIipFU0NB' + + 'UEUiLCAxMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgICBjb3pfY29weVBhZChtc2d0' + + 'eXBlLCAiKkRJQUciLCAxMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICBjb3pfY29w' + + 'eVBhZChtc2d0eXBlLCAiKkNPTVAiLCAxMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAg' + + 'IGNvel9jb3B5UGFkKG1zZ3R5cGUsICIqSU5GTyIsIDEwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBRTUhTTkRQTShl' + + 'Yy5tc2dpZCgpLCBtc2dmaWxlLAogICAgICAgICAgICAgZWMubXNnZGF0YSgpLAogICAgICAgICAgICAgZWMuZ2V0TXNnRGF0YUxl' + + 'bigpLAogICAgICAgICAgICAgbXNndHlwZSwgdG9wZ21xLCAxLAogICAgICAgICAgICAgbXNna2V5LCAmZmMpOwp9CgoKLyogPT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIGNvel9nZXROZXh0UGFybUlmICAgICAgICAg' + + 'ICAgICAgICAgICAgICAgICAgICAqLwovKiBBZHZhbmNlIHBhcmFtZXRlciBjb3VudGVyIGFuZCByZXR1cm4gYXJndltuXS4gKi8K' + + 'LyogSWYgaW9GbGFnPjAsIG1lbXNldCBvdXRwdXQgcGFybSB0byAweDAwLiAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09' + + 'PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwppbmxpbmUgY2hhciogY296X2dldE5leHRQYXJtSWYoCiAgICBpbnQmICBwQywK' + + 'ICAgIGludCYgIGFyZ2MsCiAgICBjaGFyKiogYXJndiwKICAgIGludCAgIGlvRmxhZykKewogICAgY2hhciogcFJ0biA9IE5VTEw7' + + 'CiAgICBpZiAoYXJnYyA+IHBDICsgMSkgewogICAgICAgIHBSdG4gPSBhcmd2WysrcENdOwogICAgICAgIGlmIChpb0ZsYWcgPiAw' + + 'KQogICAgICAgICAgICBtZW1zZXQocFJ0biwgMHgwMCwgaW9GbGFnKTsKICAgIH0KICAgIHJldHVybiBwUnRuOwp9CiNwcmFnbWEg' + + 'ZGF0YW1vZGVsKHBvcCkK' + , 'base64').toString('utf8'); +} diff --git a/client/src/components/cmdHelp/cmdHelpSqlSource.ts b/client/src/components/cmdHelp/cmdHelpSqlSource.ts new file mode 100644 index 0000000..680ed55 --- /dev/null +++ b/client/src/components/cmdHelp/cmdHelpSqlSource.ts @@ -0,0 +1,51 @@ +/** + * Generates the SQL DDL used to create (or replace) the CMD_HELP UDTF in the + * target library on IBM i. + * + * The version number is embedded in the LONG_COMMENT of the specific routine so + * CmdHelpChecker.getRemoteState() can detect stale installs and trigger update(). + * + * @author BobCozzi + */ +export function getCmdHelpSQLSrc(library: string, version: number): string { + return ` +CREATE or REPLACE FUNCTION ${library}.CMD_HELP( + library_name varchar(10) DEFAULT '*LIBL', + cmd_name varchar(10), + helpid varchar(6000) DEFAULT '*CMD' + ) + RETURNS table ( + HELP_XML CLOB(16M) CCSID 1208 + ) + + LANGUAGE C++ + NO SQL + EXTERNAL ACTION + NO FINAL CALL + STATEMENT DETERMINISTIC + NOT FENCED + CARDINALITY 1 + SCRATCHPAD 256 + SPECIFIC ${library}.cmd_help + EXTERNAL NAME '${library}/CMDHELP' + PARAMETER STYLE DB2SQL; + +LABEL on specific routine ${library}.cmd_help IS +'Retrieve helptext for a CL Command'; + +comment on specific function ${library}.cmd_help is +'${version} - CL Command helptext XML via QUHRHLPT API (CMDHELP program wrapper)'; + +comment on parameter specific function ${library}.cmd_help +(LIBRARY_NAME IS 'The name of the library where the *CMD object specified +on the CMD_NAME parameter is located. The special values *LIBL and *CURLIB +are supported. The default is *LIBL', + +CMD_NAME IS 'The name of the CL command whose helptext is to be retrieved. + Upper/lower case is ignored.', + +HELPID IS 'A comma separated list of help ID whose helptext is to be +returned. This is normally a list of the command''s parameter keywords.' +); +`; +} diff --git a/client/src/extension.ts b/client/src/extension.ts index 6926d1a..8957a74 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -8,6 +8,7 @@ import { ProblemProvider } from './components/syntaxChecker/problemProvider'; import { registerCommands } from './commands'; import GenCmdXml from './components/gencmdxml/gencmdxml'; import { GenCmdDoc } from './gencmddoc'; +import { CmdHelpChecker } from './components/cmdHelp/cmdHelpChecker'; import Configuration from './configuration'; import { getFileDefinition } from './utils'; @@ -88,12 +89,24 @@ export function activate(context: ExtensionContext): CLLE { } } }); + + client.onRequest("getCLDocParam", async (params: string[]) => { + const displayCommandDocumentation = Configuration.get(`general.displayCommandDocumentation`) ?? true; + if (displayCommandDocumentation) { + try { + return await GenCmdDoc.getCLDocParam(params[0], params[1], params[2]); + } catch (e) { + console.log(e); + } + } + }); }); initialiseRunner(context); registerCommands(context, client); CLSyntaxChecker.registerComponent(context); GenCmdXml.registerComponent(context); + CmdHelpChecker.registerComponent(context); ProblemProvider.registerProblemProvider(context); const instance = getInstance(); diff --git a/client/src/gencmddoc.ts b/client/src/gencmddoc.ts index 05398cf..1aa7d24 100644 --- a/client/src/gencmddoc.ts +++ b/client/src/gencmddoc.ts @@ -2,6 +2,7 @@ import { getInstance } from './api/ibmi'; import { window, ViewColumn } from 'vscode'; import { NodeHtmlMarkdown } from "node-html-markdown"; import { JSDOM } from "jsdom"; +import { CmdHelpChecker } from './components/cmdHelp/cmdHelpChecker'; export interface CLDoc { command: { @@ -57,6 +58,7 @@ export class GenCmdDoc { public static async generateHtml(object: string, library: string): Promise { const instance = getInstance(); + if (!instance) return; const connection = instance.getConnection(); if (connection) { @@ -158,6 +160,45 @@ export class GenCmdDoc { }; } + /** + * Fast per-item help via the CMD_HELP UDTF. + * + * Calls the CMD_HELP SQL table function with a specific help ID and returns + * the result converted to Markdown. The caller passes either a parameter + * keyword (e.g. "FROMFILE") or the command name itself to retrieve + * command-level help. Returns undefined when CMD_HELP is unavailable or + * returns no data so the caller can fall back to the GENCMDDOC path. + * + * @param object Command name, e.g. "CPYF" + * @param library Library name, e.g. "*LIBL" or "QSYS" + * @param helpId Parameter keyword or command name to retrieve help for + */ + public static async getCLDocParam(object: string, library: string, helpId: string): Promise { + const instance = getInstance(); + if (!instance) { return undefined; } + const connection = instance.getConnection(); + if (!connection || !connection.sqlRunnerAvailable()) { return undefined; } + + const checker = await CmdHelpChecker.get(); + if (!checker) { return undefined; } + + const lib = (connection.getConfig()?.tempLibrary || 'ILEDITOR').toUpperCase(); + const esc = (s: string) => s.replace(/'/g, "''"); + const sql = `SELECT HELP_XML FROM TABLE(${lib}.CMD_HELP('${esc(library)}', '${esc(object)}', '${esc(helpId)}'))`; + + try { + const results = await connection.runSQL(sql); + if (results.length > 0 && results[0].HELP_XML) { + const html = String(results[0].HELP_XML); + const htmlToMd = new NodeHtmlMarkdown({ globalEscape: [/[\\`_~\[\]]/gm, '\\$&'] }); + return htmlToMd.translate(html); + } + } catch { + // CMD_HELP unavailable or failed — caller falls back to GENCMDDOC + } + return undefined; + } + public static clearCLDocCache() { GenCmdDoc.cachedClDocs = {}; } diff --git a/server/src/instance.ts b/server/src/instance.ts index 6eeacb0..d97100a 100644 --- a/server/src/instance.ts +++ b/server/src/instance.ts @@ -26,4 +26,8 @@ export function getFileDefinition(object: string, library?: string): Promise { return connection.sendRequest("getCLDoc", [object, library]); +} + +export function getCLDocParam(object: string, library: string, helpId: string): Promise { + return connection.sendRequest("getCLDocParam", [object, library, helpId]); } \ No newline at end of file diff --git a/server/src/providers/hover.ts b/server/src/providers/hover.ts index 19d4a74..7e6e0b8 100644 --- a/server/src/providers/hover.ts +++ b/server/src/providers/hover.ts @@ -1,6 +1,7 @@ import { Hover, HoverParams, MarkupKind } from 'vscode-languageserver'; import { documents } from '../instance'; import { CLModules, getCLDocSpec } from '../data'; +import { getCLDocParam } from '../instance'; export default async function hoverProvider(params: HoverParams): Promise { const currentPath = params.textDocument.uri; @@ -11,15 +12,12 @@ export default async function hoverProvider(params: HoverParams): Promise= statement.range.start && offset <= statement.range.end) { const command = statement.getObject(); if (command) { const commandName = command.name.toUpperCase(); - const clDoc = await getCLDocSpec(commandName, command.library); - if (!clDoc) { - return; - } + const commandLibrary = command.library || '*LIBL'; // Parms in the existing statement const currentParms = statement.getParms(); @@ -29,8 +27,33 @@ export default async function hoverProvider(params: HoverParams): Promise= (block.range.start - parmKey.length) && offset <= block.range.end); }); - // Check if hovering on a parameter const viewFullDoc = `\n\n---\n\n[View Full Documentation](command:vscode-clle.viewFullDocumentation?${encodeURI(`["${commandName}"${command.library ? `,"${command.library}"` : ``}]`)})`; + + // --- Fast path: CMD_HELP UDTF (no JVM, per-item SQL call) --- + // For parameter hover pass the keyword; for command hover pass the command name. + const udtfHelpId = currentParm ?? ( + (() => { + const token = statement.getTokenByOffset(offset); + return (token && token.value && token.value.toUpperCase() === commandName) ? commandName : undefined; + })() + ); + + if (udtfHelpId) { + const fastMd = await getCLDocParam(commandName, commandLibrary, udtfHelpId); + if (fastMd) { + const value = currentParm + ? `${fastMd}${viewFullDoc}` + : `**${commandName}**\n\n${fastMd}${viewFullDoc}`; + return { contents: { kind: MarkupKind.Markdown, value } }; + } + } + + // --- Fallback: full GENCMDDOC parse --- + const clDoc = await getCLDocSpec(commandName, command.library); + if (!clDoc) { + return; + } + if (currentParm) { const parameterDoc = clDoc.doc.parameters.details.find(p => p.name === currentParm); if (parameterDoc && parameterDoc.description) { @@ -42,7 +65,6 @@ export default async function hoverProvider(params: HoverParams): Promise