From e8cd17a97d8c58fffcbac05394b3ee2b3c72d384 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Thu, 11 Mar 2021 10:27:09 -0700 Subject: [PATCH] Squashed 'lib/vscode/' changes from 622cb03f7e0..fd6f3bce670 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fd6f3bce670 chore: bump electron@11.3.0 (#118680) 305bf142199 Remove icon from input row in ports view (#118649) b5af426d34c Properly dispose everything in tunnel view cells (#118546) f299ec03c2a Fix extra port icon (#118529) 62dbffbfe91 Merge pull request #118177 from microsoft/joh/bump-version 062c67a3210 Merge pull request #118491 from microsoft/env-var-recovery e11b6a730c9 Fix #117903 (#118492) e7936a3e885 prevent env var relaunch from extension owned terminals 3be37a725d6 Merge pull request #118438 from microsoft/tyriar/1_54_117990 d461d2fd311 Merge pull request #118265 from microsoft/connor4312/candidate/js-debug-1.54.5 88b4d3f9a4e Merge pull request #118448 from microsoft/tyriar/1_54_118321 c48a57b6988 Merge pull request #118437 from microsoft/tyriar/1_54_117956 d68ab8fc717 Don't force create a terminal on no reconnect f9e6b352d1c Recover on pty host reconnect b31f6e1afea Don't force kill ptys on Windows on window exit bd655647d79 fixes #118214 (#118425) 3a6b7f7cbdc editors - fix mergeAllGroups (#118268) (#118406) 06c5e24837e FileSystemProvider extension: throwing a FileSystemError in readFile does not report to user (#118173) 61feeef2289 Renaming a folder adds it to history (fix #118080) (#118174) dd74fb1d885 debug: update js-debug 362f7e441ff Pick up TS 4.2.3 (#118261) 6b7199812b4 Don't assume uncompleted category exists (#118250) 21ea885f455 Merge pull request #118167 from microsoft/connor4312/candidate/js-debug-1.54.4 de16aa4bae0 bump version to future 1.54.2 87ff6fb52f1 debug: update js-debug f30a9b73e8f bump version (#118144) a25525922cd update distro (#118129) 42e27fe5cdc Merge pull request #117982 from microsoft/roblou/settingsOpenEditor ac575425edc Ensure EditorOptions subclass is passed to openEditor Fix #117952 911868fa126 refs #117960 (#117976) 62c69b32bf7 Merge pull request #117972 from microsoft/tyriar/r_1_54_remote_reconnect 564f3917935 Fix remote terminal reconnect e7989863202 fixes #117924 (#117925) c4d7a739c9b Terminal cannot input (#117915) 5266d3cc7f3 Merge pull request #117898 from microsoft/tyriar/r1_54_remote_reconnect 6f0e457db3f Fix emmet update extensions path issue (#117797) 66c7b551727 Implement shouldPersist for all terminals processes ae03e39735b Only show `infer return type` refactoring when refactorings are requested (#117800) e590188f171 fix #117792. fc7005d93f1 delete comment that is covered by #117088 3dd2d431a01 re #117449. add default color in code. be9c3901da5 Disable overrides in settings and keybindings (#117770) ea3f3878887 Fix Forward a Port context menu action d3b97f07fcf Fix ugly name for Focus on Ports View command Fixes microsoft/vscode-remote-release#4564 c1f5d07efdc Use button instead of + for forwarding a port Fixes #117589 c57c05ea364 fixes #117746 aa9f3842964 more fixes for #115840 909e129d6f5 no explicit call of setFocus/Selection outside of notebook cell list. 554341f99fa re #117725. setfocus uses wrong handle for selections. 3290f9a73ba fix #117725. 3eea629b602 Scope down querying getting started service to only cases where it'd affect the outcome d13b1a1ac56 Update marked to 2.0.0 (#117714) 403851e4be6 force async to resolve in exp service 94447bd20e9 Use button foreground on hover 3a6957333b1 call saveMemento in exp service 1e25d0c49bd Add details about what to do if createSession fails, fixes #117409 1cd0c337672 chore: add crash id for windows and mac arm64 9e83108e8ab Adjust bottom cell margin cda3b7e157f Tweak cell toolbar position 6d63655a758 Adjust top cell toolbar position (fixes #117676) 3bfba9fa221 chore: bump distro 5b6dd28057d Fixes #115861 9ba671094c1 Revert "Fix webview focus issues that prevent cut/copy/paste when opening files with a quick pick (#116899)" e5096a31692 Exclude z-author-verified from issues to verify in endgame notebook 14243220e50 Bump distro 75b26c1e5e4 debug: update js-debug ae186be4703 cancel disconnect runner on attach 57c918802b8 Fix up types, make `done` always boolean Fix #117336 3516df762dd Fixes #116305: Add fake consumer of `IMarkerDecorationsService` to instantiate it b91b917e9ae Revert "Add shadow to custom hovers" dc04badf34a check if enablePersistentSessions before updating remote or local state ebdf30f0887 leaks across notebook/contrib, fixes https://github.com/microsoft/vscode/issues/117687 dbd510ec91d Fix #113643 08073134158 fixes #116083 86fc2ba85f9 Fix #115425 54b88057c48 list: fix #116788 ca065c29280 Preview in Editor button showing in web Fixes microsoft/vscode-remote-release#4557 e6e61368ff5 fixes #114933 a5c6a900647 Fix #117612 2e63ec65ed4 fixes #116883 059e5798a24 notebook updates 44afa91ef6f also support when in viewsWelcome, https://github.com/microsoft/vscode/issues/9303 1b83aa0bceb Merge pull request #117472 from microsoft/alex/improve-connection-timeout-case 83ee8419e57 fix https://github.com/microsoft/vscode/issues/117640 abf2f3f6c83 node-debug@1.44.17 1f7ab5005ee upgrade to final version of DAP 1.45 9efc326b9bb fix https://github.com/microsoft/vscode/issues/117594 b85eb124d86 update milestone 6ade3e32968 Fix #117504 59c31364c70 Revert "Revert "chore: bump electron@11.3.0"" 93c941bef89 Adjust markdown bottom cell toolbar (fixes #117626) aabd93ed35f fix #117367 Co-authored by: Eric Amodio d37f3ffa392 Merge pull request #117645 from microsoft/merogge/hidden-term 105e8eec285 Revert "chore: bump electron@11.3.0" 51b93e40269 Fix #115320 805e7f281c3 fix #82587. 1582402b61e Fix occasional non-restored terminal buffer/title 1ba3ea20d68 Fix #117345 1a1178165db Actually use the tasExperimentService 6d0ce95af4c fix #116713 a708ba7a587 Update authentication provider doc strings, fixes #117409, fixes #117411, fixes #117414 d83895acf79 clear terminal layout info on window close (#117496) 8de95c02dbe Check to see if widget has been disposed of while actions are resolving f4065074e71 fix #115209. 05d3593f91e fix #114936. 7f481d2fcc6 Make added, removed, changed, optional in auth session change event, fixes #117469 2852916b59d Pass scope directly when signing in to other account, fixes #117510 12f68ec7758 Fix unclear row focus in settings editor Fix #117527 73432445e56 Fix markdown cell going into edit mode when clicking a link Fix #109679 377ce5a59e1 Add feature flag for opeing to first incomplete section Closes #117533 c413a1c7aed fix build. 778e21ed452 Fix #117597 663159f2fa7 fix selection after multi cell cut e62f7e8a458 Cancel disconnect timer on attach 3b06d2d1f33 fix #117458 f1d434309a8 Revert to link styling fixes #117539 caff7f4dcbd Fix #117336 07340c27f59 fix #117449. 22af2a11415 asFileUri -> asBrowserUri Fixes #117592 acfdb2d7ac2 Fix #115895 90cc8b14687 Only record layout info for shouldPersist terminals 213757cd5b1 fix #114031 faccfff275e Make terminal test less strict 8042e9b5d56 Pass should persist to pty service 80ea6efb4a1 Add shadow to custom hovers fc61668a51e shared process - further delay spawning 20503c4da96 #114031 fix error 53fc5f7bb59 fixes #117256 eba4c1bc1ea debug: document context keys c9042f49856 Adds force option to defaultLayout d3b777f46c9 fixes #117348 48d47c8715c support when suggestions for keybindings and views as well, fyi @bpasero 0f6eda5348b fix splitview glitch c1409aff832 fixes #117205 c783c26590e fixes #117391 8c98454f292 fixes #117478 fda43de2e5e untitle.hint: default should be hidden for this milestone 93bdc6cb71b fixes #117480 8d9b2e65bd9 more tests for https://github.com/microsoft/vscode/issues/117273 a63be52fdef Fix strange port label Fixes #117591 ff4bacb0ee7 Merge pull request #117535 from microsoft/term-disconnect-runner 134623067a2 Enable output based port detection on Mac and update default value of port source setting on non-linux Fixes microsoft/vscode-remote-release#4530 a799375663c fix https://github.com/microsoft/vscode/issues/117456 e7150f1fd3b add skipped test for https://github.com/microsoft/vscode/issues/117273 0d0cb2afdbd Inform pty host of detaches 90af0b9e3b7 Update enablePersistentSessions docs 3139dc7f927 Consider enablePersistentSessions when shutting down 1763c171a33 Merge remote-tracking branch 'origin/main' into term-disconnect-runner 4e467af0d9a Shutdown terminal immediately on last listener remove b3b60ff1162 icon contribution: make consistent with icon themes (fixes #117492, for #114942) 57c6bad938b fix #117549 198dbb7a71e Simplify handling of pty host ID after restart 51a40b29e00 Fix #117566 3f987d64f0d fix compilation f6f723e461f Save old cell paddingn in ports table f6e68f4b4e5 #117391 get view by id 5e16cc37c6b Make input box fill whole Port cell Fixes #117386 c47da720f35 Fit input box height in Port table Fixes #117385 01cfa2f8352 shared process - spawn it when first connection kicks in (#117422) 3f868139394 Tweaked open issues query aecbf77878c Improve titles of some port actions Fixes #117389 40ea1c99f8b Populate input with port number for Set Label Fixes #117390 bf65bc620be Use del to close port on Mac Fixes microsoft/vscode-remote-release#4534 5bc7c69ff66 perf - make it clear that shared process connection is after workbench ready (for now) 6e76d2520a9 web - remember last used workspace for extension debug 09a093d0d89 calm down integration tests 763e089ae54 :chore: consistent event names 7ffc518372b Notifications and feedback should not be visible at the same time (fix #101376) 6c179b9abea Pick up TS 4.2 final a8c82939a7a Reducing padding for markdown cells c13b21f7f8c editorType => viewType (fix #117451) 4e1234963a1 Fix #117340 4aa87166310 Update z-index for notebook left focus border (fixes #117528) 520188808c6 chore: pick up latest electron v11.3.0 075c5811b9d fix #117503 8e8c6a07dfe re #117451. 5713f288011 testing: don't go to source location when expanding/collapsing nodes c5edf95dc6f testing: show hidden tests if reveal is requested for a hidden test c2e66ea5697 testing: show retired test glyph margins as dimmed f66e523dc3a testing: fix overflowing lines causing misalignment in peek 816040208dd testing: make auto run hover indicate current state 1550171b26f [getting Started] LogService: info => trace Closes #117443 91abaaa0cfc debug: bump js-debug edd66c7c132 dedupe identical inline values; fixes #117419 80a1d7982ac Use grab cursor for rendered markdown cells 79b14947e7a Polish sign out dialog, fixes #117473 67261dc97fa fix typo in sorting; fixes #117375 fb3719c43e6 Focus editor when switching to notebook cell 45e71f054b6 Add completion for 'onAuthenticationRequest' activation event, fixes #117421 5c200bcc082 Improve handling of connection timeout limits a5a8392079e Use registered auth providers instead of declared for getting label, fixes #117463 6fa58b5a863 Show provider label instead of id in sign in prompt, fixes #117461 1647961f7d9 Don't confirm on exit on reload 041e4d9b1f5 fix smoke tests with stable build (fix #117420) 763bfde29aa Remove proposed API check for registerAuthenticationProvider, fixes #117427 ece247a4f75 Don't clear accounts badge on cancel, fixes #117357 85cff833c28 testing: fix potential leak of projection instance edc4abbc534 testing: fix MainThreadTesting disposable fishiness d5a62bbe063 Fix Ports view context menu when no item focused Fixes #117393 2d6cc94a7cf Remove + action from Ports view title Fixes #117402 c1488d86c53 Better row aria label in Ports view Fixes #117404 cb3a048f5af leak of not used monaco editor in cell template 28a40e373cb fix #117300. c2571352471 Removes extra command e8351c2c2a5 Add better narration for + row in port table c1fb9152a12 Better grouping on Ports context menu Fixes #117410 dda96b69bfc Remove debug logs 9c8882d8b7e Improve fix for #117246 9ecd3fc3022 Fix case with notification about un-forwarded port Fixes #117246 ded52df565e enforce segments in contributed icon names (for #114942) 9d1e8fa608a window - log crash reason too 4ee5bfc4b11 untitle hint: add telemetry from 13caeee4920 Document context keys 91f4ebc32d1 Remove code added to diagnose test only (#117244) 7222dfcffb5 exempt AuthenticationProvider from provider-naming rule 39b45dd9c0f Bumps version of github-browser e4364e5f5da fix #117254 d2b24cd57b7 check if configuration is disposed bd74308b5ab Revert "Merge pull request #117069 from microsoft/roblou/refactorKernel" 4673316a396 Fix #117284: Get started content becomes hidden on click 6312db1e01c Fix #115041: Path to untitled file from search editor is wrong d54923b7f8e Add manual override for getting started treatment opt-in b1831abf66d Fix folding of custom rendered markdown cells b3a33306fb4 Add markdown emoji for testing in notebooks b22f8f11698 Fix virtual file system resource loading inside webviews 69c0ce82f8b Add logging to better understrand getting started experiment rollout. c159b34535c Merge pull request #117069 from microsoft/roblou/refactorKernel ba3bd11ac7f fix kernel cache and add unit test for kernel reg. 1fd9f9eb286 Update test for api eff172b7dd9 testing: better documentation in .d.ts 9cd0f2e8a4e testing: fixes if no document hierarchy is provided e4a082af7f1 chore: bump electron@11.3.0 4ae248a0134 Remove leftover "runnable" ce45b0d004e Infer cell "runnable" from notebook kernel state Fix #106747 65711c63dac Begin eliminating cell runnable metadata #106747 b9f20c79cbd Move kernel/execution code out of NotebookEditorWidget for testability 6a9f8ac7582 Rename markdown math extension to notebook-markdown-extensions 6a6b9a5cc89 Possible fix for #115918 a1f638e838b Changes welcome views lifecycle to Restored 08eac1a22dd Merge pull request #117204 from microsoft/rebornix/nb-selections 67ded110200 Add authentication provider registration to stable API, closes #88309 b6377b8e71d Handle promise cancelled for codeActionModel 2b44e04c101 Merge pull request #117292 from microsoft/tyriar/combined_id a8451610bf1 Allow issue service to display a bug report window when remote extension host is crashed (#116896) ffae9a4baf9 Encode pty host id into terminal id 3214b95098a :lipstick: 4f25f18bd77 selection handles are only used in edits. 5428ab54c98 fold element should focus the cell. 413963c489f Remove editorOpenWith (#116856) cdd7066f009 Allow Markdown-Rendering Without Providing an Env-Parameter (#117041) 5e067109a3c reduce use of handles when possible. 1cc57241cfe Update Codicons - Update debug angles - Update `new-file` icon object - Add `debug-rerun` 9703977dab6 update workspace trust status bar visibility a776fe9af7f feat: allow excluding tests from runs 967497247a9 fix #117087 5b943120a12 fix focus/selection after cell deletion 3dde0402069 fix #115740 e33dda9e461 Update warning icon color to meet CC (refs #115799) 6d41b4e1ce7 embed primary into selections. 9a104a34ada Update `breakpointCurrentStackframeForeground` icon color (refs #115799) e54948aa8f2 fix output on pastedcells ed3eb3fdf23 Merge pull request #117100 from NotWearingPants/feature/debug-save-before-run-setting e70d90fddf3 Hide badge if trust state changes 5654c838e8e Emmet: add support of multiple extensions path (#117105) 5bab307980f Bump vscode-emmet-helper fca88ede1ee fix type of getValue in debugService d8bf53de7f6 improve descriptions of debug.saveBeforeStart 427d9e1fc6c fixes #117225 9818531cca0 Merge branch 'main' into feature/debug-save-before-run-setting e97e4135fc7 change options for debug.saveBeforeStart 9cc75d0e923 workaround for stoppedLocation.column being 0 b4518eb44e1 fixes #117223 ed08a141110 selections[0] is primary. 42e8d3eeb89 Fix select session behavior, fixes #117266 31aa03fcc8c Closes #116361 - adds select/compare ability 3c31b0debac Fix #116214 b597d6123fb move comment related to resizing terminal panes from code to issue 97fd4b9db42 Update go home contribution (#117097) 986996a7dab perf - add a mark for how long it takes to connect to shared process 072ec46dcfa new install proprosed api (#117059) a0945131a10 Cancel mouse down operation when the editor height changes (#113818) f1d92e78960 Remove Edge Legacy workarounds 086ccb15b3a Remove support for MSGesture 3c0970f6fc7 unwrap the actual command id when a command that required indirection fails, fixes https://github.com/microsoft/vscode/issues/116932 d08c3989a7d word navigation: on windows let the native chrome word navigation take over 17b26788b9a textAreaInput: respect the selectionDirection from native text area e722803d927 dispose models that aren't needed anymore 2362b7c7d6c :broom: remove unused disposable store 472c88618eb builds - same timeout for all tests across OS 1a6f64ef1de fix data loss issue #116600 05ea4c5e4e8 Removed optional message, and added modal parameter (#117241) 524e119a8b1 remove colon from git host in askpass arguments (#117230) ea2c1e5991d fixes #117237 b273be79079 publish vscode-json-languageserver@1.3.4 3d455784e72 JSON Language Server 1.3.3 912792b418f JSON Language Server 1.3.2 e938901e2ab fix vscode-json-languageserver readme. Fixes #116720 e33c868876b oss tool 4fbb5f84857 work against layering check... 277c60fc0a2 :lipstick: event usage b64997e0c70 add nls message for icon property (for #116198) cdf30a97f81 Update distro b237599ad2f use browser crypto when it is available d6846fa9e73 Merge pull request #116449 from microsoft/tyriar_megan_reconnect 218ffbf7d50 Right align actions in ports view 46acd748a37 don't trigger snippet completions on any whitespace trigger character, https://github.com/microsoft/vscode/issues/117194 1a45abdcf2d use `null` to unset metadata properties, fixes https://github.com/microsoft/vscode/issues/116956 ce7cd0abac5 Make env var tests more resilient to other terminal events d2a6dea3236 Disable conpty in integration tests again 1bddccd4537 Use less aggressive create process timeout d8b302db251 Merge remote-tracking branch 'origin/main' into tyriar_megan_reconnect 5e01284378a Ensure pty host is shutdown when shared process goes down 3c9cfeec32e Prevent env var reload when attaching 3781f94ba41 Fix build ad275765b1d Update distro 35d3403f4c8 Remove log b8f402dbbf3 Use + for port forward action in table 9a9d468cb68 Show table row to forward a port 61539324eb7 Merge remote-tracking branch 'origin/main' into tyriar_megan_reconnect 7e3476baba2 Add "Forward a Port" to Ports Context menu 4cbd8ce1e81 bump repo a1e96b7c1e0 fix compile error 2b27630d361 editor memento - remove fallbackToOtherGroupState (#102485) aa2abaa2f06 bump distro 63a4baf2e16 Update endgame notebooks ae0a103755b :chore: address some todos 3860c90cd82 limit editor title bar action to 9, https://github.com/microsoft/vscode/issues/115198 e70ba206ff5 Update README.md 7d286c50c7a enable tsec tsserver plugin f40b36524e0 update tsec e427e5280cb fix tests. 2104d28a324 fewer changes. c38aa5a341e file cleaning. 92c0878f39e shared process - drop the 3s delay for spawning a830cb5f74e some code :lipstick: f294b6f8109 editors - replaceEditors should take care of dirty editors 00cb6865ab8 keyboard - document my contextkeys cbcec2e1b46 support setting selections with either handle or index. cfd62b3e2d4 reduce use of selection handles. dea95d3e4f6 map handles to cellrange in UI. 8d9634abac3 Merge branch 'main' of https://github.com/Microsoft/vscode into main 7d143f79422 Fix typos 1e0adc0da5b unnecessary null -> undefined. 6e3e72705a8 Merge remote-tracking branch 'origin/main' into rebornix/nb-selections de956ce8bdf differenciate selection and focus. 11cd76005bc Fix dep cycle 719256e1f14 Don't scroll when clicking on a markdown cell f1551b6e7e5 Extract the generic message out from FromWebviewMessage 94f8212e2ce Add more specific contribution for notebook markdown renderers 4feadc39987 Fixes #112164 9a7da51af26 Make new markdown renderer better match old one's styling 75c39b01f11 Note that __vscode_notebook_message can only be true for webview messages from webview d24ad98e314 Convert to switch/case 8b72fdc3e99 testing: unit test err c3a45004a06 Pull from exp service to determine defaul startup editor value e8966ecaa95 notebookeditor.selections a0e24147e05 testing: remove duplicate extension and internal IDs 513c68ac8ec fix powershell 7 64bit not showing in 32bit vscode on 64bit Windows (#116986) 78707e2d796 Fix #117098 d615e8fcf24 add debug.saveBeforeRun setting c74bc68f0f6 Hide markdown preview cells when they are folded 6e08e452465 Fix issue #116591 (#116885) 32a81335ac1 Remove unneeded event declaration cc92705891d Flow control constants to platform cf93ca4117c Remove duplicate interfaces from workbench bfa04d48c83 testing: comp error 04957f6bdb4 Handle shutting down all window processes when not a reload 36dd567011e testing: make reveal in test explorer work 095b565283d testing: do not show test decorations in diff editors 1475cd0c07f Group common pty service interface methods f3b46e33a2a Improve ptyService side log format 0f6ef54b4bc Fix replay position 5ba8f6e7ec0 Fix webview focus issues that prevent cut/copy/paste when opening files with a quick pick (#116899) 5d2c9bf2996 Consolidate `wrapWithAbbreviation` and `wrapIndividualLinesWithAbbreviation` in one command (#116603) e66f74e0c2e testing: test feedback for decorations 89eb21418db Clarify layout obj is not referencing pid fc28fad663a Correct reconnected active terminal restoration a59c8d2e395 Pty service better title handling d29d7e023b6 Add ! as stylesheet trigger character for Emmet, fixes #117020 8a4a7128977 Simply onExit handling 71ddff460bd More ptyService clean up f9245a64b31 Tidy up persistent term events 392db917c0a fetch -> attach f0ab2d88536 Return Promise from fetch proc d19fccbcf18 Clean up 68a4faad817 linkDetector: fix tests 55260619e78 Update src/vs/workbench/contrib/terminal/browser/terminalInstance.ts bd00c624a88 skip test to unblock build 2b230e4b267 Azure DevOps build task to download built-in extension details (#116938) 88c471ed62f Merge remote-tracking branch 'origin/main' into tyriar_megan_reconnect 6d451222829 Improve seconds logging ee820dffbf1 Update smoke test README (#115582) f6894202fea debug console: better hover text for tunneled uris eeff347cac7 tabs - do not trigger relayout from updateBreadcrumbsControl (#112630) 61df1625efc assert no RPC leakage in notebook tests 3723081d639 separate vscode.NotebookEditor from ExtHostNotebookEditor dc120dedc16 tabs title - :lipstick: height compute f85b50f7491 Change filter on filter view when view visiblity changes Fixes #116815 a3fc4ce5406 remove console.log d050858b5dc fix tests 2ca2792a65f fix smoketest 443be92d9f1 improve link hover in debug console 5e63a2f4ecf cleanup, NotebookEditorInput#viewType is actually never undefined 102f5ea0fd5 Add period to list item for consistency febd96f0e35 debug breakpoints: remove breakpoint inline action a30262f0b00 Fix #115763 9fe7b6446dc support setTextDocumentLanguage-api for notebook cells, fyi @rebornix 07a458dd681 open editors: new unititled file in title area e09a46e017d use document directly, not editor.document, for $acceptDocumentPropertiesChanged, fyi @rebornix 4a74fa81c1e :lipstick: 57cd5d4936c :axe: remove unused $acceptDisplayOrder-RPC and everything around it d240f119d44 strictness (fail fast) in extHostNotebook 93ec7113e12 don't bind notebook document to a provider/extension, do then when calling backup, fixes https://github.com/microsoft/vscode/issues/117035 7e7a71d7332 :lipstick: more supportsBackup removal 84a3473d324 views: fix buttons width bfcaefe74de untitled hint: change default to be button for the user study ba7006088b0 tests - more logging for #117032 bbd39767eea sandbox - document issue with #116829 in code a47f3244b36 add doc for what workspaces are supported a98f29fd9c9 fix compile errors c4ac419ef91 remove unused cast 02b2629dd1c cleanup, all notebooks must support backup fa6c46b74b2 Merge pull request #116968 from DonJayamanne/fixOutputMetadata 03d71ec1f70 update distro 1f7f9dd5e6a use keys for sync from product a6fa62809e6 tabs wrap - allow for up to 1px overlap of last tab to action toolbar before disabling wrapping tabs (fix #116385) f9ed8037156 Move Ports view into the panel a8a04eb7d16 joao/table (#117026) c523e48e518 extensionsList: focus only enabled items in actionBar b9eb461aa24 tabs - allow badges when tab sizing is set to shrink (fix #115908) 2efcd2bcd2b Merge branch 'main' into joao/table 5d4d796b9cd remove doc c96f842dc58 Add icon column 7a40161c91c revert default value for workbench.tree.expandMode adccb9151f4 fixes #117006 97dfc57ffd6 tests - a lot more detailed getUntitledWorkspaceSync test (#116288) c9cbeda067f actionBar: allow to go over disabled items 6186bfc78f6 files - make save error actions context aware (#115840) d8b1c8d697b Merge pull request #116964 from microsoft/sandy081/fix116722 f1de1700dd5 editable changes in notebooks d151e0a33c1 Fix #116199 (#116268) d53a27d7c20 Fixes rendering issue in Firefox 73ccfc027c9 Oops 192c817fd35 Make jsdoc completions text kind instead of snippet kind 9f08368e926 Handle normalized absolute file paths on markdown preview link click (#116649) 094777f3929 Fix alt for menus inside of webviews (#116830) 096e5555b6d Allow welcome page to not be active on account of focus potentially going to a getting started item. ba05eeda2e3 log something in ptyService c3695af6d27 testing: fix unit test a172be74ef3 use persistentTerminalId instead of pid 5a0bf3751ab testing: add method to publish extension-provided results 52ebf0c7f87 Add 'deny' option to account access prompt ca02f19daf3 Fix #115314 482013c77e2 set minHeight on outputs when rerendering outputs to avoid shrinking. 8f2e85abd60 Fix #116574: Make it easier to jump from one Getting Started section to the next 1d3343a1091 remove stuff from process in platform 8806d063fe6 Enable extensible markdown notebook rendering in VS Code workspace 25c0fb7f2f6 Fix _getViewIndexUpperBound throwing if the view model is undefined 03b6a2e6b73 Null out webview on dispose d1313311956 Remove extra info from onDidChangeSessions event dd2bb8cd3ac Update src/vs/platform/terminal/electron-browser/localPtyService.ts 45dc2f5fa0f testing: allow contributing menu items to test view 88f459a2adc return terminal launch error 7aff64c42d9 Remove unused 840f19af066 Contriburte extension items at top-level Ref #116414 9c8e2ae7afb move stuff back to workbench and remove log statements and use pid e95a5c1e1c0 Update src/vs/platform/terminal/common/terminalDataBuffering.ts 2d263be14f0 fix #115722. b882940dc6d align InlineValuesProvider with EvaluatableExpressionProvider a90d4ab5cf4 Move notebook markdown cell margin to its own const, tweak margins 070a33c7d62 Update src/vs/platform/terminal/common/terminal.ts 8039b6416c7 Update src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts 6fae7792bb7 untitled hint: polish 98c1cd2ca88 untiltedHint: introdcue button option, use it as an editor contribution 0eaf2bab81c enable flow control for local terminals 9c77f4d86aa add NotebookDocument.save(). df04e1388dc fix #115596. f79a2119bd9 fix #115326. 933ca3a395c fix #113381. e8836805dca remove attachedEditors. bcc49ca4b67 testing: fix comp error f4ce983bcd7 Open first section if no items completed Closes #116570 657398dedfa Back => More Ref #116570 7130344e98f Merge branch 'main' into tyriar_megan_reconnect 26b6f4d0889 testing: fix show in active file not working when first turned on ba168d0cd71 testing: show discovery progress when finding tests e3dc574a51e move terminalDataBuffering from workbench to common 1250b64cfa1 :lipstick: d9dd7f0b0e1 revert focus tracking changes and use it to set focusable on actionBar 6cc6794dbb6 Support remote images 33dc53fe956 Oops 70c4b5defa8 fix initial terminal title Co-authored by: Daniel Imms 6b7bb2308b2 Cell output metadata to be added to Notebook Model 13a9be855a1 removed unneeded events and fix reconnect title 3fbab260e39 only start process once Co-authored by: Daniel Imms e9b451094e8 fix #116722 69d39a0ed3c send event when removing a kernel, https://github.com/microsoft/vscode/issues/115698 7bca8a91b4c send correct delta after restarting extension host, https://github.com/microsoft/vscode/issues/115698 63a9d5aa562 fix tests 50fe3228e48 Add tooltip to icon in ports view 2bb9fdfa8c2 Emmet: add css.color.short setting (#116912) 7effc11c792 Bump Emmet version ba97aa53374 Add padding-right to port cell icon 2a12fd7202d dispose more things, https://github.com/microsoft/vscode/issues/115698 a246f643eea debt, copy-paste police ac38da16b67 Merge pull request #116954 from microsoft/tyriar/heartbeat 7d57388aebe Tweak title source, create proc timeout b827a113d40 Mark disconnected terminals and disable stdin fba2cda1fa7 Handle non-responsive pty host process 7b74c7787c6 Fix hygiene issue in breakpoints view 26dff8f2cca table hover feedback 777c51f046f table: optional tooltip 29d4fdb65c8 Fix #116829 ecd60db2505 reload non-dirty notebooks when their files change on disk, https://github.com/microsoft/vscode/issues/114263 31e3a7794d4 merge NotebookController#reloadNotebook into notebook editor model, remove NotebookServce#resolve and add create and fetchData "primitives", https://github.com/microsoft/vscode/issues/114263 7d74c5d4b05 :lipstick: 2a1f11a296b add IResolvedNotebookEditorModel and use that in most places so that we can remove non-null assertions 692f1465a82 Fix #116691 ed801381331 More clean up and fix icons e8928ea6789 use product name c714b56e804 Simplify events in LocalPty 590f7bc0896 Use column weight in ports table 7e674bd5a7f Add port header tooltips c0f7c4cf9ab Add tooltips to port cells and some cleanup a65139f4bbb table: column size constraints 200323caf6d table: column header tooltip e1e5f3810c5 table: fix weights e10085761b1 Update distro fdaebc1f110 Merge pull request #116373 from microsoft/tyriar/megan da0086512c2 Update distro 666351b321d Merge remote-tracking branch 'origin/main' into tyriar/megan a6cc65462a2 Re-enable pty host restarting 16510dfc86c Remove logs from test 9e61f455450 Source -> Origin and added a menu 9e6e47cea1e Show detected ports and add input box d5d0bf7b073 Some clean up in naming 9b9688448ab Hide privacy column 49378fc9a58 Use container in renderTemplate edab4b7bdc9 privacy and source columns 6d7eefbae2d remove unused imports 7efe1382bbe update comment df97ef2288a tunnel view: enable context menu clicking 5d8db7c493f reenable tunnel view list options 9752a1cb3e0 reenable more tunnel view functionality d15bdd6aeec cleanup workbench lists 3203a54e0bc More actions on cells eb50a52badc update distro 0f120bfa7cb move IActionViewItemProvider and IActionViewItem into its right place, https://github.com/microsoft/vscode/issues/116112#event-4345173898 30ae7b194e6 Merge branch 'sandy081/settingsSync/align' into main 869fb74662b Merge pull request #116901 from DonJayamanne/fixRunState eb21069624c treeItem.iconPath no longer works with files in globalStorage in Insiders (fix #116735) 3b6599f6ba9 debt - remove IActionViewItem from composite (#116112) 63cbe73b2f5 chore - consistent imports ba8d76eb971 Improve notebook toolbar overlap of markdown cells (fixes #114730) 42289086600 Fix loading spin icon (fixes #116898) 6eaef7d42f9 Add postNotebookMessage helper function (#116909) 4af885c6121 Take `string` kind in `_executeCodeActionProvider` b0360851d4e Mark events fields readonly a2a3bf27e9e Fix hover for notebook cell cb95415caaa Revert back to old node-pty 473c7ddd500 Ensure tests run to completion 714b41738e4 Adds id & version to extension context - #116906 58f86d083d1 Fixes to enure tests complete 7160c4e7b50 Fix suggest widget explainer commit character field having extra commas be6225f669b Fix markdown cell focus indicators for notebooks (#116813) b09a71dce78 testing: update test results api to spec 00ca99f5672 testing: fix not being able to type spaces in filter 45ad634581b testing: show placeholder text if providers don't discover any tests c0b69b03a9b Ensure runState is updated correctly c484ebb065c chore: enable compression for crash reports 429fa749e78 reconnect processes Co-authored by: Daniel Imms 6dad35394fa Update copyright year 6e908f57c7c add debug logging for configuration 608e8791ff1 Add back support for reading from clipboard in webviews (#116597) 086112d4967 move cell output tests to document. 0354f334edf remove unreached code. 8cec47ff4a3 Update Codicons 4f12bb8451f First cut of allowing extensions to contribute getting started content. Closes #116414. a5ff0dd6eee Return from getSession earlier when requesting session access 4e19a9f16ab Update telemetry classification type for isEdu check 31e27a8d3c9 add trigger replay 5a4f5c95fe3 untitiled hint 00b583d38d6 💄 class name fix 4a2bb3569e7 Localize terminal context key descriptions 84a3428e924 update distro f1aee41e1fd Merge branch 'main' into sandy081/settingsSync/align 108616d3590 support switching settings sync services in web synchronise setting sync service type in web show necessary prompts when services are changed bd5d97dbce8 Rendering for local address and label c65da0b1d62 perf - init KeyboardLayoutMainService in parallel to window opening ab848457376 make 'editor/title/run'-menu generally available 83d540c4bfa :lipstick: a94e67e5e1c InlineValues provide: merge and sort segments per line a16b41d9c49 adopt WorkbenchTable in tunnel view 43262ab61af Add editor input factory 03ad0f1f8d9 workbench table 8244f999659 table: rename 8e003e63804 Adopt description in terminal RawContextKeys 6ecae6f5f94 shared process - log errors properly 79f90304beb refine completion provider for context keys, https://github.com/microsoft/vscode/issues/9303 29f80fb60f6 :up: distro 154c94ef3b1 Update terminalView.ts 9de38fc9a80 Disable keytar in our integration tests (#116852) d7230651acc Remove old workspace trust editor 797dc143ffb Fixed command, added spacing 5daa0b3b59f Fix right click paste 5816c4ea2c9 Improve tunnel label and process description 0cf9477e966 tunnel view: start to adopt table 5870204e95c make notebook and cell metadata classes, https://github.com/microsoft/vscode/issues/116333 0ac9125128e table: styles, domFocus 8615af08b3d Tweak input field width f2a1ecc9a7e Add workspace trust banner + UI polish c1230f88475 shared process - log errors/crashes also to active window 4006dd2e4fb table: use getSashOrthogonalSize e8b48607298 splitview: getSashOrthogonalSize 589a0f268a3 further TunnelViewModel simplification 037b4b161a1 simplify ITunnelViewModel 678acbe5364 outputs in notebooks 13070015bdd expose context key info command, add first version of completion item provider for package.json and keybindings.json files, https://github.com/microsoft/vscode/issues/9303 44dbd182557 Wait for tree to be registered before disposing This fixes the tree view rpc test Fixes #116776 1bf78c50fe9 add NotebookCellOutput#metadata, also use API type internally and translate dto sooner, fixes https://github.com/microsoft/vscode/issues/116792 7a0caf4d86e Let Remote extensions set port source (#116838) d3f2e22c19b table: css fe02cd157d8 table: fix initial cell sizing 89b85a05d43 storage - more consolidation bb999b90b45 table widget: fix overflow behavior f290c162de7 table: layout 3f0d8a14759 storage - some :lipstick: 45704f8f340 storage - lift more things up to abstract impl a36e9b3e092 add prefix to main errors when logged into renderer 90f5ef65a09 Delete notebookTestMain c03c7587651 Select the first search row when initially focusing it from the search inputs, now that the coloring is easier to differentiate 79b8259abb8 change cell language with cell change events. b89dedc5d03 Add onProcessReplay to LocalPtyService and forward the event to PtyService 5d08a5663ed add onProcessReplay to PtyService dcf7f714e1b add onProcessReplay to PersistentTerminalProcess b3f8737839d fix #116808. b0bd28137a6 add test for #115855. 90c5ceafc38 monaco: fix conflicted file dfee0857c23 testing: run test on enter press 269cf7a98c1 testing: improve labeling in peek for accessibility 69393e9a2fa testing: improve labeling in peek for accessibility 3d19580d17a fix: hide debug/run actions if no tests are applicable b050d09527b testing: filter focus on view visible da1439d5dba testing: tweak autorun icon checked state 12677674727 fix #116598. broadcast output items change. 74594435504 Update monaco.d.ts 0f05597b851 don't re-create a persistent terminal process 2cc13674e33 Also bump build version and run formatter on all files 52d1b626f31 Pick up latest TS version for building VS Code f3e3ea98946 rename remote -> persistent 6f23480f3b1 Remove bundling changes e7d2a864e4a testing: add contextual commands for running tests c41fb762991 Re-enable all tests 14923b5427a Allow conoutSocketWorker in unpacked asar 939038aae9a Recursively include lib 197f453aa95 Show tailored notification when paste isn't supported e091e894b57 Include lib in node-pty f08f99a1546 Merge pull request #115855 from susiwen8/onDidSaveNotebookDocument 53d2a737761 Clean up focused cell styling (fixes #116797) 742051039d7 remoteAttach -> attachExisting, remove logs, fill in args 5c005324bb4 tests - enable workspace tests again for now d22941af5d7 startDebugActionViewItem: fix focus navigation within ActionBar 22df9214fec Merge pull request #116728 from ugultopu/fix-misspelling-of-likelihood 68b67a34559 Keep misspelled property name in timerService 7ce6ee75590 testing: fix event listener leak 994ad375882 Log more in test c441c567a31 storage - implement first cut migration support 35abaaf6063 Log all lines in failing test 3859ba936d8 Merge remote-tracking branch 'origin/main' into tyriar/megan 7a9867c841e first draft editor (#116599) a17ad41546c use nls#localize for context key descriptions 3d0245d5e4f more table progress 6200437f3f1 add description to some RawContextKey-instances 8aa800e459a allow to exclude a context key from registry, allow to provide type eplicitly, https://github.com/microsoft/vscode/issues/114867 e537fd9e318 first cut of proposed "inline values provider" API 3385cc7a5cc :lipstick: c9607e61e0f actionBar: always respect orientation, so only left / right navgiate in horizontal and up/down in vertical ee9da16746d table: intro 8d900267955 set output and editable properties 6b35ff74c14 storage - bring back tests for close on shutdown 2313132d554 :lipstick: 5fc7d91fb31 workaround #116691 974b2143344 rename: resolveNotebook is openNotebook 04b7b5ee4c7 storage - let renderer close workspace DB 2ad3fe12241 storage - skip failing test d2cfc0792e0 update editable state a1b9523db10 update my-work notebook 28de0a46867 Fix YAML typo 38ae92f4b19 remove unused ui tests 77493b59a55 storage - test all storages closed when shutdown 58a427566b6 Revert change c967932ba34 Specify sourceScanPath 982b28f42db Merge remote-tracking branch 'origin/main' into tyriar/megan 58e22bc5226 window - type win as null if disposed 3dab064342e Move component governance to compile stage 5e74ad54302 storage - fix unused storage variable in tests 266e4759316 before removing cell documents capture its API objects, after inserting cell documents capture its API objects, fixes https://github.com/microsoft/vscode/issues/116711 1bb2e0a9bab storage - use inMemory storage for tests a7470e5094b storage - let service own lifecycle in main and implement storage warming when window loads f829a7dfd7e workaround for https://github.com/microsoft/vscode/issues/116751 ac916cbb2df don't assert rpc strictness yet 5662aecf241 actionBar: adopt respectOrienationForPreviousAndNextKey option in lists and notebook 55393229982 "e; is ", re #115391 72137a82233 fixes #116663 f606206cc8f debt - consistently refer to main services 8dbc14946b3 debt - consistent event names in main 3bb3da8281d storage - move more things into abstract storage service 2b1ab52273b storage - remove unused onWillSaveState event (main) bf0e8299db7 Fix misspelling of "likelihood" 3479bb35904 button checkbox and menu: do not automatically remove tabIndex from disabled items 5f5ceba51a3 actionBar: allow to focus disabled items 8263f1c66a3 actionBar: do not eat up the arrow key if there is only one item in the action bar 6c12d9f2c4a storage - add first cut lifecycle controlled from main side e4e0919c0ec refine precondition so that markdown cells always "execute" d9c653c8b68 increase default timeout for event waiting, fixes https://github.com/microsoft/vscode/issues/116704 2e53ffced96 add precondition to exec'ish cell commands 5901b6a4ea1 storage - move lifecycle into service 5f48de03e6c use metadata classes for cell and notebook document implementation, https://github.com/microsoft/vscode/issues/116333 f2a491fbc83 customSelectBox: do not buble key down and key up events to not conflict with action bar 762dc9eeea6 action bar: In case an action got disabled and it was last focused in the action bar We need to reset the tabIndex to be set on the first enabled item 8fe9b7c5ec9 Fix that keybindings editor input actions can not be triggered via keyboard 2ecfd145662 Setting for proc vs output port forwarding Fixes microsoft/vscode-remote-release#4274 3e2aebd790c Revert "use metadata classes inside NotebookCell and NotebookDocument" 18c04a57160 make `vscode.NotebookCellRange` a class ebc30d6c92c fixes #116700 7bf4a3d823d fixes #115212 2a9b2181ffe improve list settings docs 96640b6b875 tree: remove bogus expandOnlyOnDoubleClick d56305b3f9a cleanup imports 58b13a2fd1d Fix too many/wrong port notification Fixes microsoft/vscode-remote-release#4472 8848ddd9c06 use metadata classes inside NotebookCell and NotebookDocument 62d027a713c more API todos 7dc11581e45 remove unused event 4a941b1853a Merge branch 'joao/update-list-styles' into main 59afea597bd explorer: click in empty area -> create a new file e2d1cfb64a1 make SubmenuItemAction dynamic again 250c2265459 fix suggest widget styles 4077a67914b adopt focus border across all core themes c4c044e20db fix quick input inactive focus background color 9dca2bed0bb Fix bug in tree view tests Fixes #113896 793371f0559 remove twistie hover feedback f3b4f3f6acf unescape characters that marked escaped, fixes https://github.com/microsoft/vscode/issues/115391 e408bcafd1e Merge remote-tracking branch 'origin/main' into main 198bfdbfaa7 Merge branch 'joao/fix-116523' into main 7d338140c3b Merge branch 'main' into joao/update-list-styles 5c330b06d4d cells are editable c9886c39462 missing recursion break 965518f9a98 fixes #116558 4d89ae10ff8 fix #116523 114bac541eb storage - bring back logging support 2af090f8a3b Merge branch 'ben/storage2' ac5b7117ec4 assert no rpc in notebook doc test 059edf4166f Merge pull request #116685 from microsoft/job/nbtests 50bb1cf1a4d storage - do not init at random (fix tests on windows) 88089d3f204 fix terrapin failures not reporting cc4d7e8a11a update (restore) language test for new cells 196bf678a15 reset dirty state when reverting a notebook, update extension host when dirty state of a notebook (working copy) changes 5236d344604 run active editor test only when having focus 02613ef2b41 storage - implement workspace storage and fix tests 5eca02fd99e storage - some :lipstick: 23a780dbe73 storage - introduce shared class for storage in main 980becda8d5 main rename a508b135382 storage - wire in close() 76fecd98554 storage - add test for storage main service f49d78c4afc storage - fix layers to be able to use native storage service in sandbox 1f8bb6d33b3 storage - change main storage service to support global and workspace storage (stubs) a699ffaee62 Reenable notebook smoke test Fix #116535 3a442c6939b Fix broken markdown cells The editor wants to create a scoped CKS which you can't do with an Overlay 05922f8a260 storage - add tests for all services 992cf6bd44d Update node-fetch (#116560) 0de32ce880b consolidate some code 647a4b044a2 Make sure we focus inner iframe contents if the webview itself is already focused 90f344fe7ef Skip echo test again bfd81161b84 splits persisting, still some issues a0e0324a8da testing: commands to run tests at current cursor and in file 07e3bcf7eac testing: allow filtering to only executed or failed tests 0e16b7a0fe9 Simplify echo works in the default shell be7cf6f2e9e use checkmark instead of toggle lang 4 diff editor 2f277cb41ef Add github session telemetry event 8853436d0f9 Remove ps tree logging 1a4c9ac9f2a fix classic menubar safari 3d9a48e0f5f Revert "Bring ptyService into shared proc" 656c907867a Revert "Register ptyservice in localptyservice" e9ecaca14fe Rescan task scroll container after task selection animation complete Fixes #116521 1b897365d72 Revert "Move ptyService out of shared proc temporarily" 6841c52357d Try conpty in integration tests 0e3ec619b69 Revert "Re-enable most tests" 0ebe81ecc1e Revert "Skip all but 2" 778ce3d6af2 Add potential top level command entries 7934b9d439c Skip all but 2 6693b29b19c testing: show peek link in hover 5c449afc04d testing: automatically open peek view on failures 53c2e1b23c7 testing: close peek view when associate test state changes a5994556a8e Re-enable most tests 68f1497536a Skip echo works in the default shell test 8c1dbbbc588 clean some things up 1170b3158e3 Emmet: add output.reverseAttributes option (#116088) af4a8f7ba7f use TerminalInstanceService to access localPtyService 66d300b1bb7 Enable 3 tests 7661c8e35cf Move emmet to emmetio/emmet npm dependency, fixes #110697 653f025dfdb Enable ts check for service-worker fab9533c5ce Add some aria roles ref #115896 6148fedea06 Enable terminal tests that deal with ptys only 44477fbb74c Re-enable tests, disable terminal suite 27e1db98c12 Move some additional focus fixed from electron webviews to iframe webviews 2cb4179ec6a Make sure the webview gets focused even if the actual webview content does not yet exist 2e1166cb0c2 Make sure webview editor has not been disposed before claiming webview 0568d26fad6 Revert "Support the new 4.0 definition of isArray (#102413)" (#116571) 33d715555c1 Remeove "Skip" link, ref #114964. 1f45db9994f Disable api tests f1202da4a00 Simplify search view tree height calculation Fix #116182 8912ec1803a Move ptyService out of shared proc temporarily 2d6c2d0b2d7 wip - move notebook integration test into our normal API test extension 5f9f03e8226 disable extensions when debugging API tests 1f1db8515ee while resolving an editor input it might get disposed 52f633d19ce some :lipstick:, some API todos 888752f9241 remove node-pty from web c83064b9825 Update freshExecArgv comment, fix #116422 14669c2e457 Make scopes parameter optional to getSessions and remove getAllSessions a16f5d2c4c1 fixes #116395 ac1ba331274 testing: add tests for and fix bugs in test result service 4713b130e11 Register ptyservice in localptyservice dc4fa4878fb Bring ptyService into shared proc 815694184dd Unrecognized variables with arguments getting truncated (#114474) 41339cc2a08 Make user data path a AMD/CommonJS compatible thing (#116530) 6a698d7d435 tabs - no need to lookup editor index 4e1b20a7d5b Log process tree after test suites 13d51e7c21e actionBar: use up/down as well to move focus 84534d243c1 Merge branch 'master' into sandy081/settingsSync/align a56ce22cedd Disable ptyHost restart 138cfd777be Don't double dispose LocalPtyService 93da15934d5 Improve storage key for stored tunnels d88249fdfda add notebookKernelCount context key, clean up non-null assertions in notebook editor, modernize contributions store da6a819b54a Tab lists should only occupy a single tab stop 3eefea3b000 sync enablement keys and service key a6be559d52d :lipstick: fyi @rebornix cc0ccaf1c03 more disposing when dispose main thread notebooks, https://github.com/microsoft/vscode/issues/115698 e4d8575cafb Merge remote-tracking branch 'origin/master' into tyriar/megan cb010970c7d Merge branch 'master' into joao/update-list-styles 781bcaeb500 Call shutdownAll on ptyService 5a7711ac928 :lipstick: f507f5ca343 Setup tunnels for syncing 570890ca7e6 :lipstick: fc31a6a5584 skip failing test, https://github.com/microsoft/vscode/issues/116535 2384f4de731 Accessibility: Shift+Tab gets trapped in debug and problems panes. e7f29d65c37 use registerSharedProcessRemoteService to register 59008059d23 add devcontainer associations to configuration-editing 6d9611747ea wip: update list ux 868fb4c39f3 rename CellKind to NotebookCellKind 215cd172763 Merge pull request #116443 from microsoft/joh/kernelLanguages 82d255a3e34 Merge branch 'joao/overlay-cks' 968ce642c3c add tsec to CI, https://github.com/microsoft/vscode/issues/116459 bc72e7ab7e3 Merge branch 'master' into joao/overlay-cks f83e5e49fb2 Merge pull request #116460 from engelsdamien/master b06c9c66f56 :up: distro ed10bfb7c4f update tsec to 0.1.3 2911d1d1dd6 setting editable metadata f0d62c6ec2d :lipstick: more main.ts cleanup 795db5b7194 Always intercept file protocol (#116522) de9c04cae4a remove storage service, try to hook up layout info communication, bad layering also 6ac9a3ecb36 Add disable checkbox to getting started. Closes #114964. 767dd7033df Try different workaround for rewriting localhost resources for remote webviews 96718c6fe8c Add back build-notebook script 9b4f1aff5d2 Enable inline html tags in notebook markdown ba8a5d8fff8 [Deep clssifier] Lock dependencies 263d4b75e21 Fix getSessions for microsoft auth provider eceff533515 Rename login/logout to createSession/removeSession ea865096f13 allow for tiered trust (walk the tree) 98354ad7cc5 Add comment about localization string ff20de6a4e6 move more stuff into/out of platform/terminal.ts 1e46aab8d98 Update src/vs/platform/terminal/common/terminal.ts 2dea6ff4bbc fixes #116142 e4cf7f46ee2 Remove account caching from MainThreadAuthenticationProvider 650906c3697 Pass scopes through to authentication providers a7758e4328b Update indicator height for collapsed cells fb354b70b3e change import for terminalContributionsDescriptor 0c11d7c4007 undo move of lines in test files c87e0171f70 remove unneeded stuff d3502eaa4cb revert terminalTab change 7e6e069807d remove unused imports 3ba5101f27f Make notebook scrollbar transparent 33f7e89f610 Merge pull request #116409 from microsoft/misolori/notebook-cell-focus d10f2e60328 Fix #116412: Use getting started page as default startupEditor. 8dd7a21bd66 Merge branch 'tyriar/megan' into tyriar_megan_reconnect 68a47518f87 move things back to platform and delete duplicate code 78de6c64b03 remove get*Actions on container b49c2cba98a Dispose localPtyService on shared proc 5da54d318ad Dispose client on exit 3bd49afed2a Update src/vs/platform/terminal/common/terminal.ts 53ac8d3068b Update src/vs/base/common/async.ts e21134dd71e testing: implement base autorun e6bc652737c Merge remote-tracking branch 'origin/master' into tyriar/megan 2869ec9458c Clean up terminals when ptyHost goes down a35338b2501 move things back to the workbench and leave only necessary items in platform cf879190e74 sync resource enablement keys & service key in web 9118a3461c5 Make onDidChangeSessions event for auth providers fire complete session 42edcdb41b2 Use DAP's new "StackFrame.canRestart" property to enable the "Restart Frame" command a9515960052 compositeBarActions: hasPopup: true for consistency 1887d9aa251 Accessibility: Accounts and Manage items role 7aa84660c1c Merge remote-tracking branch 'origin/master' into tyriar/megan 5908eabc80a app.ts - clearly distinguish node.js and electron servers a4a87ef29f7 :lipstick: more app.ts cleanup 25263592076 :lipstick: app.ts cleanup 00a91fc8495 Adopt registerSharedProcessRemoteService a9536c368c3 Merge remote-tracking branch 'origin/master' into tyriar/megan cd95d465dc7 Don't remove node-pty/lib 493fa4bd31d :lipstick: main.ts 27bdcacfabc update distro 91c8be9a55f Merge branch 'master' into sandy081/settingsSync/align 1be536d154a Show DAP's new "ExceptionBreakpointsFilter.description" property in a hover 91b533066e6 post merge clean-up e498c28de11 Merge branch 'master' into joh/kernelLanguages 90d07beb8a7 Show DAP's new "ExceptionBreakpointsFilter.conditionDescription" as placeholder in condition text box 0d7c8ec95a6 Merge pull request #115817 from microsoft/notebook/outputs c514299b83e Show full url of ports when in panel Fixes #111378 ea048b87717 move ipc services back to e-sandbox b2e68d70b8d registerMainProcessRemoteService & registerSharedProcessRemoteService b31d9d5d06a fixes #116334 8d7dbbab619 Account for workspace files in auto task notification Fixes #115990 2033439e485 add description property to RawContextKey, all registry to collect all info, add command to print, https://github.com/microsoft/vscode-docs/issues/3039 58eb43beaa5 List all tsec exemption explicitly 33a92ebf4ac Updates tsec to 0.1.3 5a156a7fee4 #116084 fix reporting unhandled errors 481b65972b6 isolate IMainProcessService and ISharedProcessService into common d10ea1358ad add more wordings to settings sync dialog 141a4712033 more IPC cleanup 662b0003b81 cleanup update ipc code c544f38c93b Update distro 94c1ceb34f7 Merge remote-tracking branch 'origin/master' into tyriar/megan ff26dba8c41 Set up proper logging in pty host 73e5f518cdb Merge branch 'tyriar/megan' into tyriar_megan_reconnect 2b5a5223cbb Fix case where file picker doesn't have .. Fixes #116457 6c92a6605cb Merge branch 'master' into notebook/outputs 62dd18f1efd Resolve todos 5de7be246ec TerminalProcessMainProxy -> LocalPty 1b72bb62498 Handle ptyHost exit gracefully and restart ccc28e3726a Remove languages property from NotebookData and NotebookDocument 59264e2ab16 Merge remote-tracking branch 'origin/master' into tyriar/megan 5fc19f5f59b ILocalPtyService -> IPtyService 6ee4ef1c2db paneView: make actions in view title visible when focus in pane 474e769014c stop using `resolvedLanguages`, only use kernel languages or all languages a0bbfacd8cf Fixes #116060: Clone minimap options before changing them 9737b1aad10 move INotebookKernelInfoDto2 to protocol, separate kernel from dto, renames b6623e4d351 file watcher: show start watching info as debug f644b6b2a96 debt - less any, more unknown 471be7f8e60 use web overrides while reading 55d267293b9 have a clear separation between KernelProvider and Kernel 6f1cfdbae8a :lipstick: jsdoc 7d5d5f5e7f8 wire up `supportedLanguages` from extension kernel 24d1235d904 some unit tests for metadata classes, https://github.com/microsoft/vscode/issues/116333 4557e4e4c39 Merge branch 'master' into joao/overlay-cks 6b8251cf437 fix #116419 16df123b5ae do not turn off settings sync when quality changed 3da19cfbafc Revert change to startupEditor until smoke tests are fixed 8398e68f8f4 Fix #116093: New search editor should be pre-filled with selected text when pressing Ctrl + Shift + F 775830334d7 Fix #115883: Remove opener service logging. c6757e30a15 Enable getting started page as default startupEditor. Closes #116414 e3acfe5d71a Merge pull request #116212 from microsoft/misolori/extension-icons cd7a2d66853 Aria-label the image alt text ref #115896 93f705ab40b Remove old import. 6896ec35ff9 Make cell focus indicator more noticeable in large cells 5720ed629c6 Add back icon to getting started tab 89162d522b5 Remove unused template file 1830cbfd508 Remove getting started opt-in's e6d8271e2e3 Batch of getting started accessibility changes ref #115896 17018593c7c add to do ebebd48ad92 adjust resizePanes 233890f2eb0 add log service cd9704db38e Merge branch 'tyriar_megan_reconnect' into tyriar/megan 6dd156d04b2 Support drag and drop copy for markdown cells 1819dd5285a Merge pull request #116389 from microsoft/tyriar_megan_sharedproc b262ce0ac40 Always put focus in search box when using command to open settings editor Fix #116167 35f855796b9 Add support for markdown notebook renderers (#115191) 5188792bd04 Move ptyHostMain into the node folder 4ea18e96151 Remove unneeded file, document channels 6bdc6bb24b3 Clean up 25c680caf4e Create ptyHost, bidi communication c36a09929c8 testing: implement retired test state da39b7af3ea create PersistentTerminalProcess and move terminal and environmentVariable files from workbench -> platform e9b69cd2732 update distro 15b6534a114 file watcher: show info when start watching 67dda13a3ae Move pty to shared process 461bd165ecd IIPCOptions: clarify freshExecArgv 474b4ae2d51 ipc client: fork must not inherit --inspect(-brk)= f9ac40b8066 testing: add 'show in active file' cac5eba2aa7 fix workspace trust badge priority 585c5cc04b9 remove get*Actions from view pane 37e41cbfc4a Merge branch 'master' into sandy081/settingsSync/align f57bdeab80e Merge branch 'master' into sandy081/settingsSync/align 3dc8cb1afc8 Add setting to enable/disable returns generation in jsdoc 62cbf21904e update distro 74b6734e49b remove web overrides 78bdc620d5e - disable auto sync when default service changed in web - donot prevent turning off sync 662bc9b4e84 Merge branch 'merogge/localReconnect' into tyriar_megan_reconnect 1abb2d95341 Merge remote-tracking branch 'origin/master' into tyriar/74620_2 49e2e2b1392 show selecting settings sync service as a separate dialog a025039b4e9 file picker should only reveal files, not folders nor workspaces, fixes https://github.com/microsoft/vscode/issues/116297 20b8e5fddd2 Workspace trust refactoring (#116354) 969910839d9 make NotebookDocumentMetadata and NotebookCellMetadata type-equal with current proposal, https://github.com/microsoft/vscode/issues/116333 08a2af529ed Bring back "debug: select and start" to the command palette 6ed5c53fb7e fix metadata complile error cf7fc3918f8 remove CellOutputKind type 0e139c697bd allow custom id in NotebookCellOutput a9f803753c6 Create no accounts menu on demand 19cad54562a actionBar focus: make sure to setFocusable first enabled item cfa3854c3f4 action bar: only one tab stop b881f37fccc Merge branch 'master' into notebook/outputs 40b3204d70a some trying for https://github.com/microsoft/vscode/issues/116333 768a68060f1 Change blocking behavior for auth extension activation based on if request is from core or extension, fixes #116295 164e7f8a2ff upgrade DAP to 1.45.0-pre.0 e94d5c78398 use weights instead of when (#116277) c6da75c9ed5 Show a notification for all detected ports even when they are already forwarded when auto forwarding is enabled Fixes microsoft/vscode-remote-release#4309 c87de4b1f30 Let extension contribute to ports context and return useful info from port label command Part of microsoft/vscode-remote-release#4433 d2a6b516e4f add check box to use insiders settings sync service while switching 95d4184f267 fix https://github.com/microsoft/vscode/issues/115779 60898cfb4c2 more api todos 87aa935c1d0 :lipstick: 9ff3bfec449 sandbox - use electron directly and not preload for postMessage calls f311b19b644 filewatcher: allow to specify path globs for polling 79a0dbb134e :up: distro 83f4dfdff12 streams - introduce and adopt listenStream 699cc6abd39 fixes #116036 3e32386a5bb prepare for KernelInfo#supportedLanguages, https://github.com/microsoft/vscode/issues/116314 b24ca32e4bf little prep for https://github.com/microsoft/vscode/issues/116314 2a1a7a887c8 :lipstick: 7d9aa94fd84 repl: no need to use toString() for diffIdentity computation e371faebfb6 rename createChannelReceiver into ProxyChannel namespace (#116308) ddb659ae0ec fix https://github.com/microsoft/vscode/issues/116094 48e10bedc9e Revert "tryActivateProvider should not blocking" ea185a2bbba sash: add hover feedback delay 49b21da91be position run-submenu further to the left, https://github.com/microsoft/vscode/issues/114123 194aa7dfd11 set settings sync logger name f5ac4f42cc2 sandbox - receive message port via postMessage 5f67699d300 Fix color for the info and warning icons e58a5e897ea cell execution API sketches 3d9f13ea764 fix: CreateFile ERROR_FILE_NOT_FOUND from crashpad handler (#116252) 883b8629451 debt - prevent vs/code dependency from vs/server 3b456a28573 debt - do not allow platform layer to reach into code layer facb3703081 :up: distro f82462ba7c6 debt - move shellEnv to platform 6c479056158 unknown metadata value. fe6eb68d228 Pick up latest TS insiders 91a20c06b96 Use npm for building markdown preview ba7d28d53cd Use shared webpack version instead of installing locally for simple-browser 76524ef5891 Fixes 114236: Add a multi-line comment regex to unIndentedLinePattern (#114478) b2724146f07 debug: replace element when appending text to ensure updates in repl 90705080760 Merge branch 'connor4312/refactor-test-states' 3d4cabb608f testing: refactor to new runState API 7ecf23a2a2c Try wrapping IPv6 host for webview resource loading with`[]` 8a3a5d9b747 Fix search smoke test 2f76945a065 Relayout search view when message visibility changes #116182 2e9f767776a awaiting-insiders-release => unreleased 64db71fed86 Fixes #116235 - removes inline-flex 60665b5bb71 Removes dead code f8cadcc6f35 Fixes #116168 - missing provider == missing icons 2b6e896effb Adds another of my email addresses 41121165b0f Move isAccessAllowed to authentication service 06c8e30c736 did save event listener is not hooked up properly aa1e745af36 send mimetype specific metadata to webview ebc23863666 style polish 81c7bddee99 diff editor compare outputs should ignore outputid 87999247963 resize observer does not count padding. 409034368dc [renderer] fix string conversion for numbers 97998b32e9f implment getCellViewModel for side by side diff editor. 7b64e249baa node-pty@0.11.0-beta1 968499cb683 Adjust message, fix icon color e8d77e425f3 add changes 52457101377 Fix #116188: Search in files not pasting selected text using keyboard shortcut 71e56891549 tryActivateProvider should not blocking eddf95f0893 off by one... 68ec717149c Move extension icon color to a theme color token (refs #115799) 758fe86b54f Fix account badge update for new session requests 11b885de68b Merge remote-tracking branch 'origin/master' into notebook/outputs a05c4170f6f do not render if there is no mimetype at all. 538c7847c8e Revert "notebook diff editor handle empty mimetypes." e02e9687889 fix notebook worker dto acaf2ed2ac8 fix tests 478a76a1a6f fix compilation 16bd4632051 fix compilation issue 97fde37887b - introduce trusted api - disable settings sync in untrusted workspace 78446fc7950 Improve guidance commentary in GH Bug Report template (#116183) 7cb0840ad7d update distro accae732939 Merge pull request #116051 from microsoft/sandy081/sandbox/spdlog 327e25fdc26 Add portsAttributes to devcontainer.json Part of microsoft/vscode-remote-release#4445 624f51c0f7e debug console: diff identity provider should take the string content into account when computing ids 7fd4b1187cd Fix #116108 efd5a000c0b add InlineHintKind to InlineHint-type 8077bf32517 Fix iconLabel hover hide on click Part of #116197 615d2fff058 fixes #116155 79a623d9767 move to sandbox 5d1e300546e Missing info from the "Recent Workspaces and Folders" section in the taskbar context menu. Fixes #115898 065e82d8624 fix layering b14afd09df3 Merge branch 'master' into sandy081/sandbox/spdlog a8bb42c43b0 #116112 remove dependency on IActionViewItem 97c7d2ac84b add `editor/title/run` menu id and expose as proposed API 9b6aafb692d Improve trace messages b784c952088 Remove terminalFocus from create new term keybinding 992481db7f1 "inline" empty submenus in editor title bar ffe7654a9f7 ts - no implicit any 49061a5b8a1 Only show port notification in last window Part of #116058 d1c5afbbdcf Fix changing drives in simple file picker f2f9d1b1e01 Merge remote-tracking branch 'origin/master' into tyriar/74620_2 1e8edfea6ed shared process - move all settings sync related services to sandbox 8116b47d82c sandbox - move user data sync contrib to sandbox eb777f064b5 sandbox - move extension management and tips to sandbox 08988e65b5c sandbox - move telemetry service to electron-sandbox b6545a0db66 windows does not support symbolic links 3a3b42a9a3a Merge remote-tracking branch 'origin/master' into tyriar/74620_2 4b5108a79b8 Remove log 47adc864f89 Get 2 way communication working 6132a763bc8 Get one way communication happening 6b030798796 only ask to inline when there would be enough space, https://github.com/microsoft/vscode/issues/114123 4941e47c025 add support to automatically inlining submenus (when rendering), adopt in editor titles for the len(submenu)=1 case 34adb675130 improve hover feedback for sash corners 3ef4aa861a3 sandbox - move localizations service to sandbox 9c40b34cbee sandbox - move diagnostics service to electron sandbox 9441f9054f7 shared process - move service to electron-sandbox 8c8ab33b79d shared process - delete sharedIPCHandle 6ac77de5d74 pfs - improve symbolic link test for windows e5823fed988 :chore: extra comment 7e923e6f6ee action2 in explorer and debug: make sure to use original to preserve english title in command palette 0795762a8f0 allow gear~spin 100b7f04506 status - update background color (#115886) 82c57ad1fe4 name and id are required for remote views Fixes c7427d59b11 always fallback to plain text (#115860) bc1aac2a828 Dedupe tunnel requests for localhost Fixes #116124 2678e4b848a Only match exactly 7 equals (fixes #95040) cd97629c445 #116152 enable smoke tests 714fd96f61a #114901 revert partially - do not scope view pane container context to its domnode - only use target while creating the menu actions 65505d8bec5 Merge pull request #115599 from microsoft/ben/114753 be5126d37c3 Also skip 'before', #116156 0829608afbf Change disabled tests to .skip 87a3effc79a Try to disable caching in the simple browser's iframes 518097377de Handle 304s for remote resources 99f4a0262ed notebook diff editor handle empty mimetypes. d94093a14e6 handle append/replace output items. 29844a0baf3 disable smoke tests that time out 4623a509954 Fix #116154 6ba6002fb56 builtin renderer handles OutputItem. fd6997fdc72 new output type shape only. bd47ac847c3 auto save ... 779938d5e45 fix outputs loading 64a164c9d5c Add default color for sash hover border color (refs #114636) ff03697a1aa Use node script instead of 'cp' command 0544c1d391c remove legacy typings. 46e28e3bbea Copy codicon files directly into sources instead of taking a non dev dependecy on the entire package 5b32b280375 Mark simple browser as a UI extension eb62ecb01e2 Use white background in simple browser by default b06d9007ef4 chore: bump electron@11.2.3 4e0bc11ad3f relative sizes persist b7882a858fa touch up 7dc31b45ba0 active instance working for each tab 15616c18692 focused view context key should be set at global context 1e298d0353e Pass executableEnv to other side 456841a93ba Create createProcess ipc interface 281d2280861 Rename pty service to local pty service c7d527f9cec update yarn.lock 280cbff391c fix home menu items not appearing ee4a8bd5f4a Create pty service main <-> renderer channel 3021226eefd Move remoteterminalservice reg to contribution 4c690b34e09 remove log statement 9fc381f258c persist local terminals - not yet setting active instance or relative sizes e146dd28e12 Extension management - refactoring workspace trust signal (#116118) 783bb42362b testing: adopt new state icons 3edc9925e05 NotebookDocument#metadata is readonly c86be3bb57c Merge pull request #115309 from pfitzseb/sp/julia-grammar 5cfa6b7e263 update vscode-grammar-updater a873e60a71b :lipstick: strict assertions 3334b1534c9 #114901 associate scoped context key service to target 86701b150d2 debug: update js-debug fb8bced55bd after fix for grammar importer 0293b129e37 add name attribute, https://github.com/microsoft/vscode/issues/115746 7f1d17baca2 Update gulp-atom-electron (#116119) 1a9635193f6 update and fix grammar ebac2cfa10b add colorizer test 50dc6c3c66f add search support ac7918ed6e2 Fix terminal paste command 1da95321b14 RPM: Don't generate build_id links (#116105) f5381197bf7 Improve ports view welcome text Part of #116058 0f170017904 Fix update-grammar scripts for cross-platform use 01ace15b27b Fix clear terminal command ID 3fa2ca3f7b0 Fix new terminal keybinding 2a38ef15feb remove used code 124cd2155a2 Merge branch 'master' into pr/pfitzseb/115309 75f4a581b7a fix https://github.com/microsoft/vscode/issues/116104 82f3379ac67 remove getActions*2 from view pane container 9dd25c4d196 Don't show browser preview action in Ports view web Part of microsoft/vscode-remote-release#4436 809bbd7b62f move interface to its sole user 67bac9bf500 remove unused types e3d0d9c00cf Merge branch 'master' into notebook/outputs d0205792b0e add todo-tags for API feedback 83a2eb403e1 fix compile errors 99c1589aed3 Merge pull request #116005 from jeanp413/fix-115922 4821adfc12d move convert logic into extHostTypeConverters 599f7a7031b logger shall log always when created with always option 2baf63ad001 use logger service for output appenders f891543df7d Properly check for FuzzyScore.Default value. This was a regression from 37a4b96ae1820d21d215b460006e0baab471d6cc afd102cbd2e Trusted Workspaces Feature Branch Merge (#115961) 01a3787cca0 Remove 'grant access' badge when done, fixes #115950 659245f86ca append or replace mimetypes. 03fdd53f968 append/replace output items 7323c520847 testing: avoid showing 100% if any test failed ac60c82c7d7 add tests (#115944) 008e5c73371 RenderType.mainframe 90327ba10fd rename. 9f4772a98f1 rich mimetype renderer refactor fc336c97d97 allow \closedWith comment to add unreleaded label itself 3c6756c11c9 Remove unused trigger cfaf161c497 Bump actions (for the last time! moving to `stable` branch vs release tags) 5024a7053a0 convert output exthost/main. not optimized. d68691c4445 fix #115931 152ccfbf3ab Update .mailmap 125bbba18dd Add self to mailmap 686f84aacf3 Fix typo bdd51f1a048 Add name to mailmap 6302319a4ab Fix Emmet yarn lock acb1bfa51c6 Update distro cd725da2b22 xterm@4.11.0-beta.3 4fc8dc82f35 Fixes #110496 - use builtin gestures for open/diff 0a972947a13 no error and stream output anymore 3c17b03d3d1 :lipstick: 175ac0e0e53 OutputDto always has id a3ef2648025 internal output types always have id 392128e1fe5 enable diff decorations first. 339d6ddf183 Fix #115854, #115839 ae0cfa4ec4c fixes #115810 9ec337bb49c BreadcrumbsControl#update should know when something changed, https://github.com/microsoft/vscode/issues/112630 c11bf9d7dfd register open explorer command with container e60bc310b8e move window logging to main e136ed66fd3 todo-comment update 70d355c42fa Fixes #115786: Handle overlapping semantic tokens 26e6d9e93ad Set the remote ext host pid and name (#115891) c88888aa9bc wip: support overlay context key service 46c91d443a1 Update distro 80a738c2ffa Merge pull request #115758 from microsoft/tyriar/115053 daf7dd408b8 appFolder -> execInstallFolder 6b3d7512061 Merge pull request #114566 from microsoft/tyriar/92038 6848fcd7b0c Merge remote-tracking branch 'origin/master' into tyriar/115053 a4a6607ceb0 Use weak shell quoting for npm tasks with -- Part of #115876 631cc755d64 Resolve some todos b3a0d081aea add deprecation tags, remove unreferenced types, add more todos 3c7fc6d6a0d fix unused import d33b89256ea [css][html] Option to disable MDN Reference popups only (without effecting other functionalities). Fixes #97979 1b4a9029355 Revert "remove used dto interfaces" 8522c22cb4f remove used dto interfaces 6f936f91fb0 remove need to massage ids onto output items 8737b166361 :lipstick: bfa8e4e4005 Merge remote-tracking branch 'origin/master' into tyriar/92038 c54fb3c0d16 Fix remove recent task causing configure to run Fixes #114679 251e3e6ee33 Improve port hover Fixes microsoft/vscode-internalbacklog#1757 06e002eb16a Avoid deprecated assert methods 20f3ece2e09 Handle input on Android Fixes microsoft/vscode#107524 Fixes microsoft/monaco-editor#48 Fixes microsoft/monaco-editor#528 Fixes microsoft/monaco-editor#562 Fixes microsoft/monaco-editor#563 Fixes microsoft/monaco-editor#1538 Fixes microsoft/monaco-editor#2261 Refs microsoft/vscode#107602 6558f865330 `self.trustedTypes.createPolicy` is undefined in web workers on Android 7e25b47e662 Merge pull request #115809 from ferenczy/bugfix/wordBasedSuggestionsMode-typo f3fd96e0f9f add NotebookCell#output2 0b4c2d48dc1 update distro 587ebc5d2ee Fix: wrong event for `onDidSaveNotebookDocument` a9b412330a4 remote cli: open URL: %2F lost. Fixes microsoft/vscode-remote-release#4421 cdc8628d55e rename log service to logger cf0b1a89265 debug: when focusing sessions from drop down give priority to stopped sessions 77bbee524f9 make extHost only send ITransformedDisplayOutputDto (convert error, text output inside the ext host) cbc01b9a7b4 Don't leak RPC objects from API (#115679) 70cd3b36bac fix yarn lock changes names 84c635738d0 naming a059d1deae8 more API proposals e9c65a7e625 Supplementary function parameter types 17e0b26a858 Supplementary function parameter types 52838cf6799 Add back logging to open service. dae51e3d5eb Revert "Fix build.." 28bd11549a4 Fix build.. a53084475d9 Add logging to help daignose. github/codespaces#2248 a7fbb92962d Revert "Revert "Don't modify _resolvedUriTargets after first set."" f5f040052c2 Revert "Don't modify _resolvedUriTargets after first set." 2ff5b909bac fix smoke test typings. 0df177fe393 fix tests. b84cadf3f83 Don't modify _resolvedUriTargets after first set. Maybe a fix for github/codespaces#2248 8c1c32be6d4 Update commonEditorConfig.ts f2b87fd6cd4 Extensions do not update cell outputs/metadata directly. 99f71a032ea tweak settings for macos web 4d6d2266fac reuse display output as the single output type for rendering 12eb0b72541 updating web menu behavior refs #114200 2fda718ad71 Fixes #115801 - improves conflict decorations 916c13921dc onload => addDisposableListener Ref #115325 28b81efa20f Move configure terminal settings to registerAction2 b32502b95c0 Add terminal view item to view file 98f697844a3 Make switch terminal action use registerAction2 193173c8289 Fixes #114361 - adds branch/repo to aria label c30770a4256 Hide copy when no selection (disable would be ideal) b751e8a137c Select default shell bead496a613 Use object-fit: contain to keep image at proper aspect ratio. Ref #115325 beee6b13f7e Split terminal in active workspace 4dfab617e0b Merge branch 'sandy081/smoketests/remote' 63310d91d3c remove install extension 698eea649ea Remove editor from preview on interction. a0855b30c70 Use rmdirSync instead of rimraf a81dd8df862 IRawOutput -> IOutputDto 9db9edc09e0 Paste getAction b5ba200088a output always contains id 6826c825d8a Compress images (ref #115327) 464492ff0bc Terminal getActions: Create terminal b90b70e7e30 Scale images down under assumption they're exported at 1.5x Closes #115325. 5838880151b Allow for dark/light/hc imges. Closes #115327. 1c60676ac69 Terminal getActions: Kill terminal c023260cc7c rename menubar visibility default to classic refs #114200 8132711922b Fill in context menu more fd2ce701b69 testing: fix locale string 5b2dc0cad22 npm: move debug script lens into npm, clean up parsing logic 05b3f6f7adf re #115717 01406096de1 remove unused self size monitoring. 66415d85066 Merge pull request #115775 from microsoft/merogge/terminalUnitTest 5e27d3966dc fix #79692, re-enable test 087b0081983 debug: store debugUx state key to reduce flashing 668a6401f60 build - increase timeout for integration tests to 10min 6e3d5182253 Add context menu copy back 7c0be00b979 only update terminal dropdown options if they've changed (#115720) e88863d191f polish task name message in debug anyway dialog 424b2212e00 debug: propose to debuAnyway if the problemMatcher is not defined 7804da86f09 Update Codicons: add 'git-pull-request-create' https://github.com/microsoft/vscode-codicons/commit/686357b7174e7b3113640fea20db7efc84d8d1d4 62ce116f106 Terminal getActions: Select all a9bc2be6ce4 Terminal getActions: Copy selection e9a9a479810 fixes #114914 422361234ff fs - still return child even if unknown (#115645) 190733e9d32 more API todos, NotebookCellOutput#id 116f8f61e1f Merge remote-tracking branch 'origin/master' into tyriar/92038 3973012a9cd Only getPackageManager once per folder Part of #115384 f6581675046 Rename appDirname -> appFolder 3bd244bcf25 Merge branch 'master' into sandy081/smoketests/remote 900f1a1c5f6 iconExtensionPoint: improve descriptions and nls keys 52ecf853209 Check for drive letter without slash in file picker Fixes #114567 2d10baa51af remove NotebookCellOutput#metadata e83180b96f2 Merge branch 'joao/scm-menu-actions' 3421442c963 :lipstick: 42cdb7fa0b5 fixes #115677 684f61b4567 Allow to contribute to icon registry from icon contribution point. Fixes #114942 082af46e665 base icon regexes on shared expressions ab43469e12b Use role 'none' for some parts to make screen readers less chatty c178440297c update distro 94bc75db66d Merge branch 'master' into sandy081/smoketests/remote a54d8b23c13 fixes #114908 4afd8c709c8 Catch expected exception in tree view test Fixes #113896 056d6609183 Merge branch 'master' into sandy081/smoketests/remote a93d3178841 update package json cb537dd4e82 fs - provide a fallback when readdir with filetypes fails (#115645) be820b8f425 Fix custom iconLabel hover flickering on description Fixes #114230 2b6bd236136 Fix #115690 70d9246943b fs - use our readdir method everywhere d4b65868f2d enable the test 0494790a5ee fix https://github.com/microsoft/vscode/issues/115746 9572b419cbd test not running - enable remote check 2c00f1afc97 Add validation message for portsAttributes Fixes microsoft/vscode-remote-release#4365 72e8e9f5bef fs - do not log an error when watching results in ENOENT 914cef30d50 integration tests - disable minimap to reduce error output (#115747) bd20a720fba Rename "Existing Tunnels" 3c3686e0fbc check only extension 66a1a9bee37 fs - :lipstick: symbolic links handling 6250b9fde91 :up: distro 30ba42cf462 fs - fix leftover todo 0eb2d4556a2 Modernize pfs file system library (#115695) 4bdba123d24 use PersistKeySet 265d5da0b34 remove unused buildunit-files, fyi @dbaeumer d62c307366e fs - fix tests on windows 55ab8b53f80 Merge branch 'master' into sandy081/smoketests/remote acedbdf50b1 update distro 0ecd7f72d8e add remote server cli test a0d9df38adf Merge remote-tracking branch 'origin/master' into joao/scm-menu-actions f4581645226 fs - add test for symbolic link handling when link points to source ba35190e9cc limit editor title bar actions to 7 entries, https://github.com/microsoft/vscode/issues/115198 866c0160d47 fix build. 43beff622ac :lipstick: 55d04df641d Fix #115316: Getting started back button looks unstyled 9ddea6f385e chore: bump electron@11.2.2 041f9b975b0 fix missing total height change event. e984154e118 merge stream output in rendering 5d650cd8178 Allow setting startupEditor to `readme` as either default value or user value. Fix github/codespaces#1580 370a7ee077d Don't show a modal on 'getSession' for access requests if 'createIfNone' is false, fixes #111529 a9ccd48a1f7 enable extension tests in web d6ebd887f73 Merge branch 'master' into ben/modernize-fs bc0645202f3 fix build. eac031eedd7 :lipstick: 46c10294642 Fix #115316: Getting started back button looks unstyled ff85144fdd3 chore: bump electron@11.2.2 4e6d9ce2b79 add server cli test cc58f84bfef Merge branch 'rebornix/stream-output' cda6949fedd scm: hide actions when no repos are open 9c479a4518d enable remote smoke tests 2402c94e8ea scm: collapse all menu item 4beba243a03 fix missing total height change event. 6931bc71320 merge stream output in rendering acc0d4206e1 :lipstick: d2eaafb9078 scm: sort actions 3842f92113a scm menus: RepositoryVisibilityAction.precondition ff7921ebd13 Allow setting startupEditor to `readme` as either default value or user value. Fix github/codespaces#1580 066c5844050 enable remote smoke tests 5115a8eae79 Don't show a modal on 'getSession' for access requests if 'createIfNone' is false, fixes #111529 55579f367af update distro caca11f2997 Bump Emmet to fix #115623 1925f5ce16c xterm@4.11.0-beta.2 ef0657580f9 fs - preserve symlinks properly 59cf8810d92 Remove min-height from input box message Looks like the 34 here is just an old leftover f7ffeda190d scm menus: RepositoryVisibilityActionController 9dbc765a385 Add appDirname variable dfc2a6c1ae2 Fix codicon tree action vertical alignment 2d31774a528 fs - provide an option to `copy` to preserve symlinks or not 056418cb9f8 Improve portsAttributes setting description Fixes microsoft/vscode-remote-release#4373 268bb6ea737 Scroll input right when setting selection at end Fixes #115152 c5bf12802f1 Fix #115699 02fddad16d9 scm: more menu refactorings 429f1bae119 fixes #115625 28359b13691 Fixes #115588: Dispose everything associated with the extension host before attempting to close window 45bf35664a9 :lipstick: 805d7949eb4 Use relaunch function instead of reuseTerminal 4f237e52bb9 scm menus: view mode toggles 00d81156476 Merge branch 'master' into ben/modernize-fs a00411c7e8b Debug Console, Copy All (to clipboard) do not include source file name bab55b86fc5 Merge pull request #114182 from susiwen8/113389 4bc335b05ab Introduce setting debug.console.collapseIdenticalLines to disable collapsing identical lines in Debug Console 376716d1aee status bar - don't leak RPC objects from API (#115679) 538f72e2a7b Fixes #115662: Add support for escaping `@` as `@@` in regular expressions to avoid replacement 26ffdab0be4 Merge branch 'master' into joao/scm-menu-actions 495ed055117 fs - preserve symlinks when copying them (#114881) 06c0dbe6162 fix compilation error 2525f3e2763 Merge branch 'master' into pr/113673 7c90e1f5ba9 fixes 115685 67ccf8c649e Add open preveiw action to port notification and setting (#114572) 8d7157ed451 Make task definitions dynamic Fixes #114793 1cab95f5b6c fs - fix compile error for now aca5d3ea2e9 fs - merge readdir functions into one 7e05f9f0821 add appendCellOutput API proposal and implementation aaf7b923c6c fix: prevent scroll when list focused in zone-widget (#114912) 6675687f9e2 Merge branch 'joao/fix-100151' 03fd1a32c0f :lipstick: 73c5b484f34 fixes #100151 b28cd23d521 fs - more removal of promisify utility 6ca7afa84fb add support for `application/x.notebook.error-traceback` mime type dbf6147c01e fs - remove promise based methods from pfs and replace with fs.promises 42436d5a7be Merge pull request #115665 from microsoft/ben/113703 a17c656c330 fs - some polish around file services a01d16e77e9 debt - use a native private property in ExtHostQuickInput 194e1c5f1c8 fs - retry async rimraf unlink e2f7159745c fs - remove custom rimraf solutions c399d039a71 debt - don't expose MainThreadNotebookShape from NotebookEditorDecorationType 60ce9ab9c5a #115590 More tweaks 74937e0a89b Merge pull request #115530 from microsoft/joh/norpc 944c4b4fced fs - drop our custom rimraf solution and use node.js 2cf80f97cc1 Azure DevOps - Add global variable for VSCODE_QUALITY (#115636) aa840d53d28 Move action microsoft/vscode-github-triage-actions e99ec0c6e54 do not register open command for generated view containers 7690293ae20 clean up and add some doc 5b913c0cc21 Merge branch 'master' into ben/modernize-fs ef1f94d969b "Select for Compare" is available for WebView tabs (fix #113703) 63ad2bafafa Fix #115321: Getting started Skip button does not use pointer cursor and has really wide click target b7e588f2c64 Fix #115322: Getting started "Next" button in step is not keyboard accessible 4f8637eb541 Dont contract item on reload bcf14260d2d Make sure contibuted openers are cleaned up if they are renamed for an extension that is not uninstalled 34e46f2e67d Support anyOf for rich settings editor (#115648) 51e6c241d1b Change click on selected item to deselect it. a9e6b93132e Fix #115393 5f3c37f918d fix #115099 82812ed8c93 Treat clicks on the image the same as clicks on the button. Fixes #115320 316a1d86e09 Enable rich settings object editor for schemas that use anyOf (#115642) 352d5df7728 Mark functions abstract for settings tree (#115643) 617095939f4 Fix #115323: Getting started pressing enter when when the step has focus does nothing dfe10d0baf5 Get started color polish (#115331) a105ccb4363 #115289 fix show explorer command cba8232d778 update seti & add preview page 570f46ddf20 #115289 - register view open action - use view open action id if view container open action is not registered - do not register view container open action for panels and some viewlets ef64c83ef29 Fix #115429: Search keyword is cleared after window reload 01216213efa improve terminal title sanitizing, fix #115291 (#115634) a881dd44ccd support running active files with filenames containing parenthesis (#114946) 66635b8bd6e remove unknown content change in nb text model. acb300b004b Merge pull request #115630 from microsoft/rebornix/multi-selection 5d84ee5c192 Ensures icons are contained 06fc252b9a4 Prioritize import quickfix over spelling 501274f1d7a Fix #115633 04abcc03381 yarn watchd does not detect interface change again. 16d84195625 smoke test 5ec17aba95e fix build in exthostnotebook 04e6c8638ec Prevent decoding URI the user is trying to open externally (#115615) 3c79b84e34c Update Codicons: add type hierarchy, table, and variable-group icons https://github.com/microsoft/vscode-codicons/commit/6e29ef1dae9c8aca8311a1ac433ee86a6ab873cf https://github.com/microsoft/vscode-codicons/commit/39a2dd5bba2725c426a9fb03d0ddfb40fe0719a2 57488b54303 Fix #115595: Search editor: respect `soft` option in `revert` 4aa4d1f65f7 Revert "Add a dialog box when opening unsaved files in a custom editor (#114947)" (#115627) 33f49b2363c Add a dialog box when opening unsaved files in a custom editor (#114947) c3c0db94f3d Merge remote-tracking branch 'origin' into rebornix/multi-selection c4f273e3dfe fix tests. 9c4d2480630 fs - avoid one exists() call 0677d5e6f62 fs - sort pfs and introduce SymlinkSupport namespace 3088c27fbdc debug: mark terminal as free when the associated debug session ends (#115573) 6662709200d Merge pull request #115578 from obsgolem/master e6712df1110 Simplify logic b60478452fa [themes] fix dept in default theme files. Fixes #111877 f345c732a3e Allow moving to blank lines also by model lines 7a6a45fb2c1 browser tests - fix regression from updating playwright 76e6174c90b validate yarn.lock changes in PRs 3c6e1758ecf Convert to use PrevBlankLine / NextBlankLine in the "to" argument. 2808625686b No need to create aliases 1a016a67b2e :up: deps d50306793fc Upgrade Playwright to v1.8.0. (#115241) 507e210014e Sentence casing on terminal link text Fixes microsoft/vscode-remote-release#4363 970d920f5bd fs - modernize `move` and add comments 3debe292293 #115590 tweak wordings 21aa14f0642 remove ext.ts 653e409f480 Merge pull request #115336 from rluvaton/patch-1 085185259ff Env var changes will restart terminal automatically fd978d6feac Merge pull request #115190 from PathToLife/pathtolife/double-press-keybind b8737236efd Minor tweaks 3022afaeaa2 Minor refactorings 2fb57aa3b64 Revert do not show compare for markdown preivew a0d76bb9834 fs - drop pfs.mkdirp in favor of node.js ca746af08ab fix hygiene 35e1ee2ecc0 ext: extract to disk 72a9a9ca395 Simplify code 3079c2245ce Only restore non-auto-forwarded ports Fixes #115216 a77a89eaef4 Also handle single modifier keybindings in `StandaloneKeybindingService` cfc22176e62 Add tests, some renames & refactorings 7e714f4d25e more notebook API todos c3b556727e2 fix update-grammars script 8bf9b56adec Merge branch 'joao/extensions' fa0e0004772 :lipstick: f92b41b5d5e Add defaultSnippets for portsAttributes Fixes microsoft/vscode-remote-release#4382 7e0230677aa improve ext ci output c770c381978 update notebook milestones 9dcecc01c6f fix https://github.com/microsoft/vscode/issues/115353 6b2a14afc68 Prevent two task defaults Fixes #115281 56dfaf8b985 #115522 adopt to settled promises b2d303d16e7 ext: allow anonymous access 42fcb8d7c55 Custom editors: improve the generic save error notification (fix #115598) abb05eb058b Fix #115586 83935a961f0 Merge pull request #115452 from jogo-/patch-1 7020ccf1346 #115289 show only default containers in view menu 3feb8937a80 editors - make sure to always remove pending confirmations even in error case 4342faa67cf backup tracker - wire in cancellation token 867b60d649e backups - show cancellable progress for backup/revert too (#115028) 04d4310a8a5 fix smoketest (#115586) 2604a356e27 Fix typo in papercuts.github-issues ee29ad444b7 Include closed issues too for verification found. d45a8915d27 transient metadata should be used to control the content change and dirty state. f96b651052a we should only use comm object to communicate. 36e0c46923e Merge branch 'master' into rebornix/multi-selection be9de77eb40 Added a new "blankLine" option for move units. This option will move the cursor to the next/previous line which consists only of whitespace, skipping over folded or otherwise hidden lines. d9ff550d02d Add intellisense for onOpenExternalUri activation and rename event 7d5052f5084 Set permission handlers for webviews d99c218e9b2 Make sure we always apply TS auto imports, even if VS Code applies the completion before it has been resolved 60bb22ddd3c Use `test` instead of `match` 7490ac87e19 Fix spelling 5851bcab4d9 Use `?.` c3699dc01db Fix wording on error 4ccfa1d019b Fix spelling 6f1fbfdd935 Inline object map type 8c3e6cd9ee2 Fix spelling 4e00f75408e Remove stubs file reference protocol 6fed1b63833 Uses background flag for better perf/mem usage Filters out deleted resources ed410a1cc04 adopt icon descriptions fixes from vscode-docs 925d9234b86 Pick up latest TypeScript 4.2 nightly 833bae4fd91 Add more explicit implementations of ICustomEditorInputFactory 0f9ff35c82a Fix #115289 61decba0335 fix extension categories sort order efaceb5f682 Enable 'Install Additional Product Icon Themes' 82af67ebce4 Plumb etags through rest of the webview resource pipeline (#115360) 80ba07df03b notebooks: add generic colors for renderers (#109412) d5685965c5e Fix keybinding for Search view missing from view and sidebar #115556 0eaf57957fb typeahead: line wrap improvements 7583817a12a added unreleased fixes to endgame notebook a5a33501be1 chore - group notebook specific api proposals together b37252c1823 Update grammars a99dd66f0f7 test more results of create-functions 02d28757e88 :lipstick: 76962b2583a ext: ci command 2ceeaeb6814 hide proxy from TextEditorDecorationType abbc2e305d7 more API todos for notebooks c9a7425b903 Merge branch 'master' into pathtolife/double-press-keybind 750888c4967 Merge pull request #114957 from TacticalDan/tacticaldan/scrollingPerformance b82933a1d2a Limit to 8ms (120fps) 0ac7f0ee830 Merge branch 'master' into tacticaldan/scrollingPerformance 3ec92ad8ad5 Better hiding of custom hover in icon label a5b078b5514 debt - adopt some ? operator bc837b7162e :lipstick: dialog main service locks a0c75f60530 add tests for createXYZ functions and skip most of them... 38ca4695d10 Fix #114432: Multiple save dialogs appearing on Windows if Ctrl+S is pressed multiple times (#114450) 178e7034bc4 simplify map creation, fyi @bpasero 03da2de889c add proper yarn.lock files a0cb5c5a46e Fix port label not always getting set Part of microsoft/vscode-remote-release#4364 ad8f7e18728 Fixes microsoft/monaco-editor#2329: Move `registerThemingParticipant` call to `/editor/` 38db1778aa1 adopt built-in extensions b24036eaa27 Use label as tooltip fallback properly Part of #115337 2681e07db46 more notebook todos 53ae79d62d9 Avoid the CSS general sibling combinator ~ for perf reasons ddd678ab297 debug console menu action polish f37f96bbec3 Merge pull request #115261 from microsoft/alex/language-config-priority 47390dbe1b1 Fixes #115221: update emoji tests 300effb0c8f add some notebook API todos 3d2ca29012c hide terminal proxy a60beb9d7a8 don't leak proxies in editor land, also remove indentSize property which isn't API 82c629eb3a4 hide tasks in TaskExecution 46cf57b2646 a bunch of failing tests 930b5686ffa add todo 3114b1c4c52 hide rpc proxies 4cfd5f85080 clipboard changes 1ecf01b9c71 mark rpc protocol and proxies with symbols and try to find them from an API test (with success...) 01e92bdc93c debug: do not render checkmark in view menu for the debug console b08c1eb5bce Merge pull request #115345 from shskwmt/fix/115154 1f4506183c4 for now remove isSaving() implementation from custom editors (#115526) 34ca1211023 adopt Promises.settled 00a199daf73 Merge branch 'master' into fix/115154 8b510618c89 Merge pull request #115401 from microsoft/tyriar/115390 0627cf0a2d2 event - adopt Promises.settled in async emitter (#115522) 769ad06e7c1 Promise.allSettled - use native variant if it exists 71bd9c5032c Revert "event - adopt Promises.settled in async emitter (#115522)" 643cbb2aaa6 Fixes microsoft/monaco-editor#2328: In some webpack configurations, `process` can be defined, while `process.nextTick` is not 126959896ff event - adopt Promises.settled in async emitter (#115522) 5c7fc5da28e Fixes #112382: Use replacement characters when doing dom based line break computin c2759462f8b backups - catch errors on shutdown and don't show modal dialogs in extension development (#115028) 0ca20779b5b Promise.all() does not await all promises when one throws (#115522) 08c73d7b6e4 history - make sure to track file renames properly (#113277) 8d6164f25d1 :up: chokidar@3.5.1 d30c12dc6b3 debt - fix some types in bootstrap JS files a9b98904880 Improving performance of tree traversal getViewState function (#115387) f5bb67e37aa Unit tests cleanup (#115377) 6a1c7a5097d Fix #115509, register a separate action for opening serch editor from view 9e152f9a193 Fix #11511 Search Mode setting does not open editors unless search view is visible 50ec8ea6e76 Merge branch 'master' into patch-1 ef2c97e92f6 Fix spelling in papercuts.github-issues a916ce9076c Add "overflow: hidden" style to split-view-view within integrated-terminal 81ae94a9dc8 bump version to 1.54.0 ec805db5eda add repository field to extensions package.json 9a5d14e307a run prettier over extensions json files 1e8d0be3761 Make term config tests await config 3921d63e64f Add "overflow: hidden" style to split-view-view c628fd10fb0 Merge branch 'master' into patch-1 80f20b3d9f2 fix(workbench): add forgotten escaping in regex b0ac7e40bbd add Julia grammar 8471235643e Give a higher priority to language configuration set via API call (#114684) 9548fe4af9e bugfix - fix macos not working because scan code was removed - add isModifierKey() logic to scanCode.ts, consistent with windows keyCodes.ts b14064fbf84 minor commit - fix comment inconsistency - rename function camelCase d8a474947ce fix comments de4b1289848 fix PR Layers check 27fc6204873 comments 26c709a7c6a Merge branch 'microsoft-master' 28b3a7e3a93 New method to avoid regression, found via unit test, related to modifier keys being ignored in getDisptachParts() 301b9f7ed77 working on fixing unit test regressions c67f42f1b51 Fix modifier key triggering chord - revert removal of shift key 4d0d77f9b12 remove attempt at fixing shift+[shiftleft] binding - better solution to be commited later ae426b39b18 macos implemented double shift keybind windows initial implementation bc0262a6645 Revert "hack to make double shift possible in widget" 6794401b7c8 minimal changes 5e948799db0 fix build b2600b23d5b Cut keyboard shortcut support mutli selection 86a88180596 multi selection in notebook 601161f8dd0 Reduce arbitrary event limiter from 16ms down to 4.16666 (support for monitors up-to 240hz) #107016 caac9511a73 windows attempt at "shift shift" - still bugged 5ed3c977bdc hack to make double shift possible in widget 03c59637b69 wip 160bdf06b34 wip: adopt menu actions in scm 768ace7b7f1 Merge branch 'master' into 113389 9be03fe29b2 Fix: add alwaysConsumeMouseWheel for list 3563e2b7403 rename run to exec for consistency REVERT: 622cb03f7e0 Merge pull request #116444 from microsoft/alex/stable-fix-116060 REVERT: 5933e313e5d Fixes #116060: Clone minimap options before changing them REVERT: f3a12e053e1 Pick up TS 4.1.5 (#116380) REVERT: 3b9cef2b8d1 Bump Emmet (#116230) REVERT: 8757f67bcda fix #116049 (#116319) REVERT: 73c0a56bbd2 Merge pull request #116311 from microsoft/joh/fix/116094 REVERT: 5cf34afa107 Use weak shell quoting for npm tasks with -- (#116309) REVERT: 6635ca9a64e Merge pull request #116245 from microsoft/connor4312/debug-repl-fix REVERT: 65406fcea58 fix https://github.com/microsoft/vscode/issues/116094 REVERT: 43e11faf4ee fix: CreateFile ERROR_FILE_NOT_FOUND from crashpad handler (#116256) REVERT: 17d65083f6c debug: replace element when appending text to ensure updates in repl REVERT: 9d194eac0d7 This reverts us to the previous distro commit (#116218) REVERT: 1fe57f42761 Merge pull request #115789 from microsoft/rebornix/fix-notebook-runstate REVERT: d63ab6acdbd bump version to 1.53.2 (#116228) REVERT: 4aff7304539 Merge pull request #115772 from microsoft/misolori/1.53/create-pr-icon REVERT: 678843ff3ad fixes #115810 (#115943) REVERT: e1ec11f5183 always fallback to plain text (#115860) (#116177) REVERT: 615ea78d96a status - update background color (#115886) (#116181) REVERT: 00d7f953055 add changes (#116223) REVERT: 3c19fc731cb Pick up the official TS 4.1.4 build (#116222) REVERT: 5d424b828ad Pick up new distro version and bump version (#116149) REVERT: ee2c947e064 ci: update newer 11.2.1 for CVE-2021-21148 (#115951) REVERT: e23884b9476 re #115717 REVERT: 5da053f081f Update Codicons: add 'git-pull-request-create' https://github.com/microsoft/vscode-codicons/commit/686357b7174e7b3113640fea20db7efc84d8d1d4 REVERT: 7f04ecd68be use PersistKeySet (#115744) REVERT: 8490d3dde47 Merge pull request #115701 from microsoft/sandy081/fix115699 REVERT: 1d6c8826375 Fix #115699 REVERT: f84decb78f3 Merge pull request #115686 from microsoft/isidorn/openEditorsCollapsed REVERT: 203b86d14c5 fixes 115685 REVERT: 83f7a99bd95 Azure DevOps - Add global variable for VSCODE_QUALITY (#115636) (#115673) REVERT: e1c818a1711 Merge pull request #115655 from microsoft/rebornix/fix-jupyter-activation REVERT: 761dd469c13 chore: bump distro REVERT: 8d779a4fada Merge pull request #115609 from microsoft/joh/fix115353 REVERT: 30fe91131c9 Merge pull request #115611 from microsoft/isidorn/selectForCompareUntitled REVERT: 8dbf3d717b2 Revert do not show compare for markdown preivew REVERT: bc38ed1b5a3 fix https://github.com/microsoft/vscode/issues/115353 REVERT: 65006668d07 Merge pull request #115547 from microsoft/aeschli/installProductIconTheme REVERT: b99487f4168 Fix keybinding for Search view missing from view and sidebar (#115558) REVERT: feda473d978 Enable 'Install Additional Product Icon Themes' REVERT: 565dc9704f2 Use label as tooltip fallback properly (#115537) REVERT: c02643e3c95 Properly set port label from ports attributes REVERT: ae05392454a Merge pull request #115536 from microsoft/isidorn/debugConsoleCheckmark REVERT: e4a65573a89 render "Debug Console" action after a separator REVERT: a62c65bdb74 ignore focus when toggling debug console visibility REVERT: 4d98741552d debug: do not render checkmark in view menu for the debug console REVERT: ad232b0ac13 Fix #115509, register a separate action for opening serch editor from view (#115514) REVERT: 4eb39372949 Fix #115511 Search Mode setting does not open editors unless search view is visible (#115513) git-subtree-dir: lib/vscode git-subtree-split: fd6f3bce6709b121a895d042d343d71f317d74e7 --- .devcontainer/cache/build-cache-image.sh | 2 +- .devcontainer/devcontainer.json | 2 +- .eslintignore | 1 + .eslintrc.json | 7 +- .github/ISSUE_TEMPLATE/bug_report.md | 15 +- .github/actions/build-chat/.gitignore | 2 - .github/actions/build-chat/action.yml | 10 - .github/actions/build-chat/package.json | 23 - .github/actions/build-chat/src/main.ts | 217 - .github/actions/build-chat/tsconfig.json | 18 - .github/actions/build-chat/yarn.lock | 728 - .github/commands.json | 2 +- .github/pull_request_template.md | 2 +- .github/workflows/author-verified.yml | 22 +- .github/workflows/build-chat.yml | 41 +- .github/workflows/ci.yml | 7 +- .github/workflows/deep-classifier-monitor.yml | 2 +- .github/workflows/deep-classifier-runner.yml | 4 +- .github/workflows/deep-classifier-scraper.yml | 2 +- .github/workflows/devcontainer-cache.yml | 6 +- .github/workflows/english-please.yml | 2 +- .github/workflows/feature-request.yml | 2 +- .github/workflows/latest-release-monitor.yml | 2 +- .github/workflows/locker.yml | 2 +- .github/workflows/needs-more-info-closer.yml | 2 +- .github/workflows/no-yarn-lock-changes.yml | 14 + .../{commands.yml => on-comment.yml} | 11 +- .github/workflows/on-label.yml | 18 +- .github/workflows/on-open.yml | 2 +- .../workflows/release-pipeline-labeler.yml | 2 +- .github/workflows/rich-navigation.yml | 2 +- .../workflows/test-plan-item-validator.yml | 2 +- .mailmap | 4 + .vscode/launch.json | 3 +- .vscode/notebooks/api.github-issues | 1307 +- .vscode/notebooks/endgame.github-issues | 79 +- .../notebooks/grooming-delta.github-issues | 9 +- .vscode/notebooks/grooming.github-issues | 12 +- .vscode/notebooks/inbox.github-issues | 26 +- .vscode/notebooks/my-endgame.github-issues | 126 +- .vscode/notebooks/my-work.github-issues | 59 +- .vscode/notebooks/papercuts.github-issues | 25 +- .vscode/notebooks/verification.github-issues | 29 +- .vscode/settings.json | 15 +- .yarnrc | 2 +- README.md | 4 +- ThirdPartyNotices.txt | 152 +- .../darwin/product-build-darwin.yml | 25 +- build/azure-pipelines/distro-build.yml | 8 +- build/azure-pipelines/exploration-build.yml | 4 +- .../linux/product-build-alpine.yml | 5 +- .../linux/product-build-linux.yml | 15 +- build/azure-pipelines/product-build.yml | 2 +- build/azure-pipelines/product-compile.yml | 13 + .../publish-types/publish-types.yml | 2 +- .../publish-types/update-types.ts | 2 +- .../azure-pipelines/web/product-build-web.yml | 1 + .../win32/product-build-win32.yml | 10 +- build/ext.js | 207 - build/filters.js | 3 + build/gulpfile.editor.js | 2 +- build/gulpfile.vscode.js | 11 +- build/lib/builtInExtensions.ts | 2 +- build/lib/builtInExtensionsCG.js | 79 + build/lib/builtInExtensionsCG.ts | 83 + build/lib/electron.ts | 2 +- build/lib/i18n.resources.json | 8 + build/monaco/README-npm.md | 2 +- build/npm/dirs.js | 1 + build/npm/update-all-grammars.js | 67 +- build/npm/update-grammar.js | 176 - build/package.json | 10 +- build/yarn.lock | 420 +- cgmanifest.json | 4 +- extensions/bat/package.json | 72 +- extensions/bat/package.nls.json | 2 +- extensions/bat/yarn.lock | 4 + extensions/clojure/package.json | 68 +- extensions/clojure/package.nls.json | 2 +- extensions/clojure/yarn.lock | 4 + extensions/coffeescript/package.json | 84 +- extensions/coffeescript/yarn.lock | 4 + extensions/configuration-editing/package.json | 12 +- .../configuration-editing/package.nls.json | 2 +- .../schemas/attachContainer.schema.json | 57 + .../devContainer.schema.generated.json | 290 + .../schemas/devContainer.schema.src.json | 59 +- .../src/configurationEditingMain.ts | 85 +- extensions/cpp/build/update-grammars.js | 2 +- extensions/cpp/package.json | 170 +- extensions/cpp/package.nls.json | 2 +- extensions/cpp/yarn.lock | 4 + extensions/csharp/package.json | 23 +- extensions/csharp/package.nls.json | 2 +- extensions/csharp/yarn.lock | 4 + extensions/css-language-features/package.json | 40 + .../css-language-features/package.nls.json | 6 + .../css-language-features/server/package.json | 2 +- .../server/src/cssServer.ts | 8 +- .../css-language-features/server/yarn.lock | 8 +- extensions/css/package.json | 10 +- extensions/css/package.nls.json | 2 +- extensions/css/yarn.lock | 4 + extensions/debug-auto-launch/package.json | 80 +- extensions/debug-server-ready/package.json | 282 +- extensions/docker/package.json | 87 +- extensions/docker/package.nls.json | 2 +- extensions/docker/yarn.lock | 4 + extensions/emmet/package.json | 876 +- extensions/emmet/package.nls.json | 5 +- extensions/emmet/src/abbreviationActions.ts | 335 +- extensions/emmet/src/emmetCommon.ts | 9 +- extensions/emmet/src/test/completion.test.ts | 7 + .../test/test-fixtures/.vscode/settings.json | 3 + .../src/test/wrapWithAbbreviation.test.ts | 42 +- extensions/emmet/src/util.ts | 29 +- extensions/emmet/yarn.lock | 33 +- extensions/extension-editing/package.json | 131 +- extensions/extension-editing/package.nls.json | 2 +- extensions/fsharp/package.json | 75 +- extensions/fsharp/package.nls.json | 2 +- extensions/fsharp/yarn.lock | 4 + extensions/git-ui/package.json | 4 + extensions/git-ui/package.nls.json | 2 +- extensions/git/build/update-grammars.js | 2 +- extensions/git/package.json | 109 +- extensions/git/package.nls.json | 3 + extensions/git/src/askpass-main.ts | 2 +- extensions/git/src/commands.ts | 104 +- extensions/git/src/git.ts | 137 +- extensions/git/src/main.ts | 5 +- extensions/git/src/repository.ts | 24 +- extensions/git/src/timelineProvider.ts | 51 +- extensions/github-authentication/package.json | 6 +- .../github-authentication/src/common/utils.ts | 69 +- .../github-authentication/src/extension.ts | 18 +- .../github-authentication/src/github.ts | 30 +- .../github-authentication/src/githubServer.ts | 55 +- extensions/github-authentication/yarn.lock | 8 +- extensions/github/package.json | 4 + extensions/github/yarn.lock | 6 +- extensions/go/package.json | 80 +- extensions/go/package.nls.json | 2 +- extensions/go/yarn.lock | 4 + extensions/groovy/package.json | 83 +- extensions/groovy/package.nls.json | 2 +- extensions/groovy/yarn.lock | 4 + extensions/grunt/package.json | 4 + extensions/gulp/package.json | 4 + extensions/gulp/package.nls.json | 2 +- extensions/handlebars/package.json | 51 +- extensions/handlebars/package.nls.json | 2 +- extensions/handlebars/yarn.lock | 4 + extensions/hlsl/package.json | 70 +- extensions/hlsl/package.nls.json | 2 +- extensions/hlsl/yarn.lock | 4 + .../html-language-features/package.json | 4 + .../server/package.json | 2 +- .../server/src/modes/cssMode.ts | 8 +- .../html-language-features/server/yarn.lock | 8 +- extensions/html/build/update-grammar.js | 2 +- extensions/html/package.json | 6 +- extensions/html/package.nls.json | 2 +- extensions/html/yarn.lock | 4 + extensions/image-preview/package.json | 4 + .../image-preview/src/ownedStatusBarEntry.ts | 2 +- extensions/ini/package.json | 103 +- extensions/ini/package.nls.json | 2 +- extensions/ini/yarn.lock | 4 + extensions/jake/package.json | 4 + extensions/jake/package.nls.json | 2 +- extensions/java/cgmanifest.json | 4 +- extensions/java/package.json | 72 +- extensions/java/package.nls.json | 2 +- extensions/java/syntaxes/java.tmLanguage.json | 8 +- extensions/java/yarn.lock | 4 + extensions/javascript/package.json | 68 +- extensions/javascript/package.nls.json | 2 +- .../syntaxes/JavaScript.tmLanguage.json | 43 +- .../syntaxes/JavaScriptReact.tmLanguage.json | 43 +- extensions/javascript/yarn.lock | 4 + .../json-language-features/package.json | 264 +- .../json-language-features/server/README.md | 13 +- .../server/package.json | 2 +- extensions/json/build/update-grammars.js | 4 +- extensions/json/package.json | 4 + extensions/json/package.nls.json | 2 +- extensions/json/yarn.lock | 4 + extensions/julia/.vscodeignore | 2 + extensions/julia/cgmanifest.json | 17 + extensions/julia/language-configuration.json | 31 + extensions/julia/package.json | 54 + extensions/julia/package.nls.json | 4 + .../julia/syntaxes/julia.tmLanguage.json | 1113 ++ extensions/less/package.json | 100 +- extensions/less/package.nls.json | 2 +- extensions/less/yarn.lock | 4 + extensions/log/cgmanifest.json | 4 +- extensions/log/package.json | 72 +- extensions/log/package.nls.json | 2 +- extensions/log/syntaxes/log.tmLanguage.json | 6 +- extensions/log/yarn.lock | 4 + extensions/lua/package.json | 63 +- extensions/lua/package.nls.json | 2 +- extensions/lua/yarn.lock | 4 + extensions/make/package.json | 104 +- extensions/make/package.nls.json | 2 +- extensions/make/yarn.lock | 4 + extensions/markdown-basics/package.json | 190 +- extensions/markdown-basics/yarn.lock | 4 + .../notebook-out/index.js | 1 + .../notebook/index.ts | 28 + .../markdown-language-features/package.json | 688 +- .../src/features/preview.ts | 3 + .../src/markdownEngine.ts | 2 +- .../webpack.notebook.js | 27 + extensions/merge-conflict/package.json | 4 + .../merge-conflict/src/mergeConflictParser.ts | 2 +- .../microsoft-authentication/package.json | 116 +- .../microsoft-authentication/src/AADHelper.ts | 75 +- .../microsoft-authentication/src/extension.ts | 16 +- extensions/microsoft-authentication/yarn.lock | 8 +- .../.vscodeignore | 12 + .../notebook-markdown-extensions/README.md | 3 + .../notebook-markdown-extensions/icon.png | Bin 0 -> 903 bytes .../notebook-out/emoji.js | 1 + .../notebook-out/katex.js | 1 + .../notebook/emoji.ts | 20 + .../notebook/katex.ts | 21 + .../notebook/tsconfig.json | 12 + .../notebook-markdown-extensions/package.json | 51 + .../package.nls.json | 4 + .../webpack.notebook.js | 36 + .../notebook-markdown-extensions/yarn.lock | 320 + extensions/npm/package.json | 4 + extensions/npm/src/commands.ts | 5 +- extensions/npm/src/npmMain.ts | 2 + extensions/npm/src/npmScriptLens.ts | 113 + extensions/npm/src/npmView.ts | 55 +- extensions/npm/src/readScripts.ts | 73 + extensions/npm/src/scriptHover.ts | 38 +- extensions/npm/src/tasks.ts | 186 +- .../objective-c/build/update-grammars.js | 2 +- extensions/objective-c/package.json | 102 +- extensions/objective-c/package.nls.json | 2 +- extensions/objective-c/yarn.lock | 4 + extensions/package.json | 5 +- extensions/perl/package.json | 100 +- extensions/perl/package.nls.json | 2 +- extensions/perl/yarn.lock | 4 + extensions/php-language-features/package.json | 174 +- .../php-language-features/package.nls.json | 2 +- extensions/php/build/update-grammar.js | 2 +- extensions/php/package.json | 128 +- extensions/php/package.nls.json | 2 +- extensions/php/yarn.lock | 4 + extensions/powershell/package.json | 79 +- extensions/powershell/package.nls.json | 2 +- extensions/powershell/yarn.lock | 4 + extensions/pug/package.json | 63 +- extensions/pug/package.nls.json | 2 +- extensions/pug/yarn.lock | 4 + extensions/python/package.json | 89 +- extensions/python/package.nls.json | 2 +- extensions/python/yarn.lock | 4 + extensions/r/package.json | 64 +- extensions/r/package.nls.json | 2 +- extensions/r/yarn.lock | 4 + extensions/razor/package.json | 55 +- extensions/razor/package.nls.json | 2 +- extensions/razor/yarn.lock | 4 + extensions/ruby/package.json | 97 +- extensions/ruby/package.nls.json | 2 +- extensions/ruby/yarn.lock | 4 + extensions/rust/package.json | 72 +- extensions/rust/package.nls.json | 2 +- extensions/rust/yarn.lock | 4 + extensions/scss/package.json | 146 +- extensions/scss/package.nls.json | 2 +- extensions/scss/yarn.lock | 4 + extensions/search-result/package.json | 4 + extensions/search-result/src/extension.ts | 3 + .../syntaxes/generateTMLanguage.js | 1 + .../syntaxes/searchResult.tmLanguage.json | 89 + extensions/shaderlab/package.json | 74 +- extensions/shaderlab/package.nls.json | 2 +- extensions/shaderlab/yarn.lock | 4 + extensions/shellscript/package.json | 155 +- extensions/shellscript/package.nls.json | 2 +- extensions/shellscript/yarn.lock | 4 + .../simple-browser/build/copy.js | 19 +- extensions/simple-browser/media/codicon.css | 449 + extensions/simple-browser/media/codicon.ttf | Bin 0 -> 62792 bytes extensions/simple-browser/media/index.js | 210 +- extensions/simple-browser/media/index.js.map | 2 +- extensions/simple-browser/media/main.css | 2 + extensions/simple-browser/package.json | 28 +- .../simple-browser/preview-src/index.ts | 16 +- .../simple-browser/src/simpleBrowserView.ts | 9 +- extensions/simple-browser/yarn.lock | 2686 +-- extensions/sql/build/update-grammar.js | 2 +- extensions/sql/package.json | 72 +- extensions/sql/package.nls.json | 2 +- extensions/sql/yarn.lock | 4 + extensions/swift/package.json | 71 +- extensions/swift/package.nls.json | 2 +- extensions/swift/yarn.lock | 4 + .../testing-editor-contributions/package.json | 10 +- .../package.nls.json | 2 +- .../src/extension.ts | 408 +- extensions/theme-abyss/package.json | 40 +- .../theme-abyss/themes/abyss-color-theme.json | 2 +- extensions/theme-abyss/yarn.lock | 4 + extensions/theme-defaults/package.json | 106 +- .../theme-defaults/themes/dark_defaults.json | 24 - extensions/theme-defaults/themes/dark_vs.json | 22 +- .../theme-defaults/themes/hc_black.json | 325 +- .../themes/hc_black_defaults.json | 333 - .../theme-defaults/themes/light_defaults.json | 28 - .../theme-defaults/themes/light_plus.json | 3 +- .../theme-defaults/themes/light_vs.json | 26 +- extensions/theme-defaults/yarn.lock | 4 + extensions/theme-kimbie-dark/package.json | 40 +- .../themes/kimbie-dark-color-theme.json | 2 +- extensions/theme-kimbie-dark/yarn.lock | 4 + extensions/theme-monokai-dimmed/package.json | 42 +- .../themes/dimmed-monokai-color-theme.json | 2 +- extensions/theme-monokai-dimmed/yarn.lock | 4 + extensions/theme-monokai/package.json | 42 +- .../themes/monokai-color-theme.json | 2 +- extensions/theme-monokai/yarn.lock | 4 + extensions/theme-quietlight/package.json | 42 +- .../themes/quietlight-color-theme.json | 2 +- extensions/theme-quietlight/yarn.lock | 4 + extensions/theme-red/package.json | 40 +- .../theme-red/themes/Red-color-theme.json | 2 +- extensions/theme-red/yarn.lock | 4 + extensions/theme-seti/.vscodeignore | 1 + .../theme-seti/build/update-icon-theme.js | 1 + extensions/theme-seti/cgmanifest.json | 2 +- extensions/theme-seti/icons/preview.html | 104 + extensions/theme-seti/icons/seti.woff | Bin 35676 -> 35844 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 641 +- extensions/theme-seti/package.json | 48 +- extensions/theme-seti/yarn.lock | 4 + extensions/theme-solarized-dark/package.json | 40 +- .../themes/solarized-dark-color-theme.json | 2 +- extensions/theme-solarized-dark/yarn.lock | 4 + extensions/theme-solarized-light/package.json | 40 +- .../themes/solarized-light-color-theme.json | 2 +- extensions/theme-solarized-light/yarn.lock | 4 + .../theme-tomorrow-night-blue/package.json | 40 +- .../tomorrow-night-blue-color-theme.json | 2 +- .../theme-tomorrow-night-blue/yarn.lock | 4 + .../build/update-grammars.js | 6 +- extensions/typescript-basics/cgmanifest.json | 2 +- extensions/typescript-basics/package.json | 4 + extensions/typescript-basics/package.nls.json | 2 +- .../syntaxes/TypeScript.tmLanguage.json | 43 +- .../syntaxes/TypeScriptReact.tmLanguage.json | 43 +- extensions/typescript-basics/yarn.lock | 4 + .../extension-browser.webpack.config.js | 18 +- .../typescript-language-features/package.json | 20 +- .../package.nls.json | 1 + .../src/extension.browser.ts | 2 +- .../src/extension.ts | 6 +- .../src/languageFeatures/callHierarchy.ts | 8 +- .../src/languageFeatures/completions.ts | 397 +- .../fileConfigurationManager.ts | 2 +- .../src/languageFeatures/jsDocCompletions.ts | 19 +- .../languageFeatures/languageConfiguration.ts | 4 +- .../src/languageFeatures/quickFix.ts | 30 +- .../src/languageFeatures/refactor.ts | 10 +- .../src/languageProvider.ts | 2 +- .../src/lazyClientHost.ts | 4 +- .../src/protocol.d.ts | 16 - .../src/test/unit/onEnter.test.ts | 43 + .../src/typescriptServiceClient.ts | 4 +- .../typescript-language-features/yarn.lock | 84 - extensions/vb/package.json | 74 +- extensions/vb/package.nls.json | 2 +- extensions/vb/yarn.lock | 4 + extensions/vscode-api-tests/package.json | 35 + .../src/singlefolder-tests/commands.test.ts | 3 + .../singlefolder-tests/configuration.test.ts | 3 + .../src/singlefolder-tests/debug.test.ts | 4 +- .../src/singlefolder-tests/editor.test.ts | 7 +- .../src/singlefolder-tests/env.test.ts | 3 + .../src/singlefolder-tests/extensions.test.ts | 25 + .../src/singlefolder-tests/languages.test.ts | 4 +- .../notebook.document.test.ts | 391 + .../src/singlefolder-tests/notebook.test.ts | 1285 ++ .../src/singlefolder-tests/quickInput.test.ts | 7 +- .../src/singlefolder-tests/rpc.test.ts | 97 + .../src/singlefolder-tests/terminal.test.ts | 355 +- .../src/singlefolder-tests/types.test.ts | 3 + .../src/singlefolder-tests/webview.test.ts | 4 +- .../src/singlefolder-tests/window.test.ts | 38 +- .../workspace.event.test.ts | 43 +- .../singlefolder-tests/workspace.fs.test.ts | 3 + .../workspace.tasks.test.ts | 2 + .../src/singlefolder-tests/workspace.test.ts | 7 +- extensions/vscode-api-tests/src/utils.ts | 67 +- .../testWorkspace/.vscode/settings.json | 5 +- .../testWorkspace2/.vscode/settings.json | 3 + extensions/vscode-colorize-tests/package.json | 4 + .../test/colorize-fixtures/test.jl | 26 + .../test/colorize-results/test_jl.json | 2543 +++ .../vscode-custom-editor-tests/package.json | 4 + extensions/vscode-notebook-tests/package.json | 16 +- ...{notebookSmokeTestMain.ts => extension.ts} | 41 +- .../src/notebook.test.ts | 1503 -- .../src/notebookTestMain.ts | 187 - extensions/vscode-test-resolver/package.json | 270 +- .../vscode-test-resolver/src/extension.ts | 11 +- extensions/xml/package.json | 212 +- extensions/xml/package.nls.json | 2 +- extensions/xml/yarn.lock | 4 + extensions/yaml/package.json | 94 +- extensions/yaml/package.nls.json | 2 +- extensions/yaml/yarn.lock | 4 + extensions/yarn.lock | 33 +- package.json | 32 +- product.json | 10 +- remote/package.json | 8 +- remote/web/package.json | 6 +- remote/web/yarn.lock | 24 +- remote/yarn.lock | 32 +- resources/linux/rpm/code.spec.template | 4 + scripts/generate-definitelytyped.sh | 2 +- scripts/test-integration.bat | 22 +- scripts/test-integration.sh | 25 +- src/bootstrap.js | 13 +- src/main.js | 199 +- src/paths.js | 48 - src/tsconfig.json | 6 + src/tsec.exemptions.json | 28 +- src/vs/base/browser/browser.ts | 4 +- src/vs/base/browser/canIUse.ts | 14 +- src/vs/base/browser/contextmenu.ts | 3 +- src/vs/base/browser/dom.ts | 14 +- src/vs/base/browser/event.ts | 14 +- src/vs/base/browser/markdownRenderer.ts | 13 +- .../browser/ui/actionbar/actionViewItems.ts | 38 +- .../base/browser/ui/actionbar/actionbar.css | 1 + src/vs/base/browser/ui/actionbar/actionbar.ts | 101 +- src/vs/base/browser/ui/button/button.ts | 3 +- src/vs/base/browser/ui/checkbox/checkbox.ts | 31 +- .../ui/codicons/codicon/codicon-modifiers.css | 2 +- .../browser/ui/codicons/codicon/codicon.ttf | Bin 64268 -> 65176 bytes .../base/browser/ui/codicons/codiconStyles.ts | 2 +- .../ui/dropdown/dropdownActionViewItem.ts | 10 +- .../browser/ui/iconLabel/iconHoverDelegate.ts | 1 - src/vs/base/browser/ui/iconLabel/iconLabel.ts | 30 +- .../base/browser/ui/iconLabel/iconLabels.ts | 3 +- src/vs/base/browser/ui/inputbox/inputBox.css | 1 - src/vs/base/browser/ui/inputbox/inputBox.ts | 3 + src/vs/base/browser/ui/list/list.ts | 2 +- src/vs/base/browser/ui/list/listView.ts | 43 +- src/vs/base/browser/ui/list/listWidget.ts | 67 +- src/vs/base/browser/ui/menu/menu.ts | 12 +- src/vs/base/browser/ui/menu/menubar.css | 2 +- src/vs/base/browser/ui/menu/menubar.ts | 22 +- src/vs/base/browser/ui/sash/sash.css | 34 +- src/vs/base/browser/ui/sash/sash.ts | 103 +- .../browser/ui/selectBox/selectBoxCustom.ts | 10 +- src/vs/base/browser/ui/splitview/paneview.css | 1 + src/vs/base/browser/ui/splitview/paneview.ts | 14 +- src/vs/base/browser/ui/splitview/splitview.ts | 24 +- src/vs/base/browser/ui/table/table.css | 66 + src/vs/base/browser/ui/table/table.ts | 40 + src/vs/base/browser/ui/table/tableWidget.ts | 329 + src/vs/base/browser/ui/toolbar/toolbar.ts | 4 +- src/vs/base/browser/ui/tree/abstractTree.ts | 11 +- src/vs/base/browser/ui/tree/asyncDataTree.ts | 12 +- src/vs/base/browser/ui/tree/media/tree.css | 4 + src/vs/base/browser/ui/tree/objectTree.ts | 2 +- src/vs/base/common/actions.ts | 43 - src/vs/base/common/async.ts | 203 +- src/vs/base/common/buildunit.json | 16 - src/vs/base/common/codicons.ts | 881 +- src/vs/base/common/errors.ts | 30 + src/vs/base/common/errorsWithActions.ts | 28 - src/vs/base/common/event.ts | 61 +- src/vs/base/common/extpath.ts | 1 - src/vs/base/common/filters.ts | 4 +- src/vs/base/common/iconLabels.ts | 14 +- src/vs/base/common/iterator.ts | 53 +- src/vs/base/common/keyCodes.ts | 11 + src/vs/base/common/lifecycle.ts | 10 +- src/vs/base/common/marked/marked.js | 403 +- src/vs/base/common/network.ts | 2 + src/vs/base/common/paging.ts | 15 - src/vs/base/common/platform.ts | 2 +- src/vs/base/common/resources.ts | 4 +- src/vs/base/common/stream.ts | 142 +- src/vs/base/common/strings.ts | 18 +- src/vs/base/common/types.ts | 38 +- src/vs/base/common/uuid.ts | 23 +- src/vs/base/node/extpath.ts | 5 +- src/vs/base/node/languagePacks.js | 509 +- src/vs/base/node/pfs.ts | 721 +- src/vs/base/node/powershell.ts | 152 +- src/vs/base/node/processes.ts | 6 +- .../vs/base/node/userDataPath.d.ts | 7 +- src/vs/base/node/userDataPath.js | 72 + src/vs/base/node/zip.ts | 8 +- src/vs/base/parts/ipc/common/ipc.ts | 221 +- .../ipc.mp.ts | 5 +- src/vs/base/parts/ipc/node/ipc.cp.ts | 12 +- src/vs/base/parts/ipc/test/common/ipc.test.ts | 10 +- .../ipc/test/electron-sandbox/ipc.mp.test.ts | 4 +- .../parts/quickinput/browser/quickInput.ts | 6 +- .../parts/sandbox/electron-browser/preload.js | 38 +- .../sandbox/electron-sandbox/electronTypes.ts | 41 +- .../parts/sandbox/electron-sandbox/globals.ts | 63 +- .../test/electron-sandbox/globals.test.ts | 9 +- src/vs/base/parts/storage/common/storage.ts | 20 +- src/vs/base/parts/storage/node/storage.ts | 15 +- .../parts/storage/test/node/storage.test.ts | 42 +- src/vs/base/test/browser/dom.test.ts | 32 +- src/vs/base/test/browser/hash.test.ts | 68 +- .../test/browser/highlightedLabel.test.ts | 23 +- src/vs/base/test/browser/iconLabels.test.ts | 14 +- .../ui/contextview/contextview.test.ts | 24 +- src/vs/base/test/common/async.test.ts | 183 + src/vs/base/test/common/event.test.ts | 237 +- src/vs/base/test/common/extpath.test.ts | 14 +- src/vs/base/test/common/fuzzyScorer.test.ts | 76 +- src/vs/base/test/common/glob.test.ts | 5 +- src/vs/base/test/common/iconLabels.test.ts | 24 +- src/vs/base/test/common/iterator.test.ts | 7 + src/vs/base/test/common/labels.test.ts | 14 +- src/vs/base/test/common/lifecycle.test.ts | 25 +- src/vs/base/test/common/linkedList.test.ts | 1 - src/vs/base/test/common/linkedText.test.ts | 30 +- src/vs/base/test/common/map.test.ts | 4 +- src/vs/base/test/common/network.test.ts | 24 +- src/vs/base/test/common/stream.test.ts | 86 +- src/vs/base/test/common/strings.test.ts | 5 + src/vs/base/test/node/crypto.test.ts | 5 +- src/vs/base/test/node/extpath.test.ts | 5 +- src/vs/base/test/node/pfs/pfs.test.ts | 119 +- src/vs/base/test/node/powershell.test.ts | 31 +- .../node/userDataPath.test.ts} | 12 +- src/vs/base/test/node/zip/zip.test.ts | 5 +- src/vs/base/worker/workerMain.ts | 10 +- src/vs/buildunit.json | 13 - src/vs/code/browser/workbench/workbench.ts | 2 + .../contrib/languagePackCachedDataCleaner.ts | 5 +- .../sharedProcess/contrib/logsDataCleaner.ts | 3 +- .../contrib/nodeCachedDataCleaner.ts | 5 +- .../contrib/storageDataCleaner.ts | 5 +- .../sharedProcess/sharedProcess.js | 5 +- .../sharedProcess/sharedProcessMain.ts | 79 +- .../electron-browser/workbench/workbench.js | 5 +- src/vs/code/electron-main/app.ts | 419 +- src/vs/code/electron-main/auth.ts | 4 +- src/vs/code/electron-main/main.ts | 254 +- src/vs/code/electron-main/protocol.ts | 51 +- .../electron-sandbox/issue/issueReporter.js | 4 +- .../issue/issueReporterMain.ts | 3 +- .../processExplorer/processExplorer.js | 4 +- .../electron-sandbox/workbench/workbench.js | 5 +- src/vs/code/node/cli.ts | 2 +- src/vs/code/node/cliProcessMain.ts | 25 +- .../editor/browser/controller/coreCommands.ts | 5 +- .../editor/browser/controller/mouseHandler.ts | 22 +- .../editor/browser/controller/mouseTarget.ts | 74 - .../browser/controller/pointerHandler.ts | 105 +- .../browser/controller/textAreaHandler.ts | 77 +- .../browser/controller/textAreaInput.ts | 99 +- .../browser/controller/textAreaState.ts | 72 +- .../browser/core/keybindingCancellation.ts | 3 +- src/vs/editor/browser/editorDom.ts | 4 + .../browser/services/markerDecorations.ts | 26 + .../editor/browser/services/openerService.ts | 8 +- .../browser/view/domLineBreaksComputer.ts | 10 +- src/vs/editor/browser/view/viewController.ts | 6 +- src/vs/editor/browser/view/viewImpl.ts | 4 + .../viewParts/lineNumbers/lineNumbers.ts | 35 +- .../browser/viewParts/lines/viewLine.ts | 6 +- .../viewParts/selections/selections.ts | 9 +- .../editor/browser/widget/codeEditorWidget.ts | 30 +- .../editor/browser/widget/diffEditorWidget.ts | 39 +- .../common/config/commonEditorConfig.ts | 2 +- src/vs/editor/common/config/editorOptions.ts | 8 + src/vs/editor/common/controller/cursor.ts | 16 +- .../common/controller/cursorMoveCommands.ts | 31 +- .../common/controller/cursorMoveOperations.ts | 41 + .../common/controller/cursorTypeOperations.ts | 43 +- src/vs/editor/common/editorCommon.ts | 11 + src/vs/editor/common/editorContextKeys.ts | 69 +- src/vs/editor/common/model/textModel.ts | 49 +- src/vs/editor/common/modes.ts | 95 +- .../modes/languageConfigurationRegistry.ts | 156 +- .../common/modes/languageFeatureRegistry.ts | 4 +- .../editor/common/modes/languageSelector.ts | 2 +- src/vs/editor/common/modes/modesRegistry.ts | 2 +- .../editor/common/services/getIconClasses.ts | 11 +- .../services/semanticTokensProviderStyling.ts | 27 + .../common/standalone/standaloneEnums.ts | 6 + .../editor/common/viewModel/viewModelImpl.ts | 4 +- src/vs/editor/contrib/clipboard/clipboard.ts | 4 +- .../editor/contrib/codeAction/codeAction.ts | 7 +- .../contrib/codeAction/codeActionModel.ts | 47 +- .../editor/contrib/codeAction/codeActionUi.ts | 11 + .../contrib/codelens/codelensController.ts | 2 +- src/vs/editor/contrib/folding/foldingModel.ts | 8 +- .../gotoSymbol/peek/referencesController.ts | 6 +- .../contrib/gotoSymbol/referencesModel.ts | 4 +- .../contrib/hover/markerHoverParticipant.ts | 2 +- .../editor/contrib/hover/modesContentHover.ts | 4 + .../contrib/message/messageController.ts | 2 +- .../editor/contrib/suggest/suggestWidget.ts | 8 +- .../contrib/suggest/suggestWidgetDetails.ts | 2 +- .../contrib/suggest/suggestWidgetStatus.ts | 4 +- .../editor/contrib/suggest/wordContextKey.ts | 11 +- .../editor/contrib/symbolIcons/symbolIcons.ts | 376 + .../contrib/wordOperations/wordOperations.ts | 37 +- .../standaloneGotoSymbolQuickAccess.ts | 2 + .../standaloneQuickInputServiceImpl.ts | 2 +- .../standalone/browser/simpleServices.ts | 16 +- .../standalone/browser/standaloneLanguages.ts | 3 +- .../standalone/browser/standaloneServices.ts | 4 +- .../browser/standaloneThemeServiceImpl.ts | 10 +- .../common/monarch/monarchCompile.ts | 23 +- .../standalone/common/monarch/monarchTypes.ts | 4 + .../standalone/test/monarch/monarch.test.ts | 88 +- .../test/browser/controller/cursor.test.ts | 44 +- .../controller/cursorMoveCommand.test.ts | 93 + .../test/browser/controller/imeTester.ts | 4 +- .../browser/controller/textAreaState.test.ts | 84 +- .../services/decorationRenderOptions.test.ts | 4 +- src/vs/editor/test/browser/testCommand.ts | 4 +- .../model/editableTextModelTestUtils.ts | 18 +- .../modes/languageConfiguration.test.ts | 12 +- src/vs/monaco.d.ts | 27 +- .../browser/menuEntryActionViewItem.css | 1 - .../browser/menuEntryActionViewItem.ts | 77 +- src/vs/platform/actions/common/actions.ts | 37 +- src/vs/platform/actions/common/menuService.ts | 47 +- .../backup/electron-main/backupMainService.ts | 52 +- .../electron-main/backupMainService.test.ts | 38 +- .../contextkey/browser/contextKeyService.ts | 143 +- .../platform/contextkey/common/contextkey.ts | 24 +- .../platform/contextkey/common/contextkeys.ts | 15 +- .../contextview/browser/contextViewService.ts | 2 +- .../electron-main/extensionHostDebugIpc.ts | 11 +- .../diagnostics/common/diagnostics.ts | 14 + .../diagnostics/node/diagnosticsService.ts | 125 +- .../electron-main/dialogMainService.ts | 174 +- .../driver/electron-browser/driver.ts | 2 +- .../platform/driver/electron-main/driver.ts | 8 +- src/vs/platform/editor/common/editor.ts | 17 +- src/vs/platform/environment/common/argv.ts | 1 + .../environment/common/environment.ts | 3 - .../electron-main/environmentMainService.ts | 4 + src/vs/platform/environment/node/argv.ts | 1 + .../environment/node/environmentService.ts | 72 +- .../environment}/node/shellEnv.ts | 0 .../node/{waitMarkerFile.ts => wait.ts} | 9 +- .../node/extensionDownloader.ts | 7 +- .../node/extensionManagementService.ts | 11 +- .../node/extensionsScanner.ts | 19 +- .../platform/extensions/common/extensions.ts | 15 +- .../test/common/extensionValidator.test.ts | 36 +- .../browser/indexedDBFileSystemProvider.ts | 4 - src/vs/platform/files/common/fileService.ts | 64 +- .../files/node/diskFileSystemProvider.ts | 28 +- .../node/watcher/nodejs/watcherService.ts | 12 +- .../node/watcher/nsfw/nsfwWatcherService.ts | 12 +- .../files/node/watcher/nsfw/watcherApp.ts | 4 +- .../files/node/watcher/nsfw/watcherService.ts | 4 +- .../watcher/unix/chokidarWatcherService.ts | 16 +- .../files/node/watcher/unix/watcher.ts | 2 +- .../files/node/watcher/unix/watcherApp.ts | 4 +- .../files/node/watcher/unix/watcherService.ts | 4 +- src/vs/platform/files/node/watcher/watcher.ts | 2 +- .../files/test/browser/fileService.test.ts | 86 +- .../electron-browser/diskFileService.test.ts | 22 +- .../instantiation/common/extensions.ts | 10 +- .../electron-browser/mainProcessService.ts | 29 + .../electron-sandbox/mainProcessService.ts | 37 +- .../platform/ipc/electron-sandbox/services.ts | 77 + .../issue/electron-main/issueMainService.ts | 11 +- .../common/abstractKeybindingService.ts | 58 +- .../common/baseResolvedKeybinding.ts | 5 + .../common/resolvedKeybindingItem.ts | 4 + .../common/usLayoutResolvedKeybinding.ts | 16 + .../common/abstractKeybindingService.test.ts | 1 + .../test/common/mockKeybindingService.ts | 3 + .../keyboardLayoutMainService.ts | 12 +- .../launch/{node => common}/launch.ts | 0 .../launch/electron-main/launchMainService.ts | 6 +- .../platform/layout/browser/layoutService.ts | 2 +- src/vs/platform/lifecycle/common/lifecycle.ts | 4 +- .../electron-main/lifecycleMainService.ts | 63 +- src/vs/platform/list/browser/listService.ts | 228 +- .../localizations/node/localizations.ts | 15 +- src/vs/platform/log/browser/log.ts | 20 +- src/vs/platform/log/common/bufferLog.ts | 10 +- .../common/{fileLogService.ts => fileLog.ts} | 10 +- src/vs/platform/log/common/log.ts | 172 +- src/vs/platform/log/common/logIpc.ts | 148 +- src/vs/platform/log/node/loggerService.ts | 29 +- src/vs/platform/log/node/spdlogLog.ts | 120 + src/vs/platform/log/node/spdlogService.ts | 174 - .../platform/menubar/electron-main/menubar.ts | 16 +- .../electron-main/nativeHostMainService.ts | 74 +- .../electron-sandbox/nativeHostService.ts | 6 +- src/vs/platform/product/common/product.ts | 4 +- .../platform/product/common/productService.ts | 4 +- .../platform/quickinput/browser/quickInput.ts | 6 +- .../registry/test/common/platform.test.ts | 33 +- .../remote/common/remoteAgentConnection.ts | 264 +- src/vs/platform/remote/common/tunnel.ts | 35 +- .../electron-main/sharedProcess.ts | 90 +- .../sharedProcess/node/sharedProcess.ts | 2 - src/vs/platform/state/node/stateService.ts | 4 +- src/vs/platform/state/test/node/state.test.ts | 5 +- .../storage/browser/storageService.ts | 128 +- src/vs/platform/storage/common/storage.ts | 202 +- src/vs/platform/storage/common/storageIpc.ts | 136 + .../storage/electron-main/storageIpc.ts | 136 + .../storage/electron-main/storageMain.ts | 307 + .../electron-main/storageMainService.ts | 142 + .../electron-sandbox/storageService2.ts | 127 + src/vs/platform/storage/node/storageIpc.ts | 214 - .../storage/node/storageMainService.ts | 191 - .../platform/storage/node/storageService.ts | 111 +- .../storageService.test.ts} | 62 +- .../test/common/storageService.test.ts | 149 +- .../electron-main/storageMainService.test.ts | 225 + .../storage/test/node/storageService.test.ts | 61 +- src/vs/platform/telemetry/common/telemetry.ts | 1 + .../telemetry/common/telemetryLogAppender.ts | 2 +- .../telemetry/common/telemetryService.ts | 3 +- .../telemetry/common/telemetryUtils.ts | 6 +- .../test/common/telemetryLogAppender.test.ts | 7 +- .../terminal/common/environmentVariable.ts | 16 + src/vs/platform/terminal/common/terminal.ts | 365 + .../terminal/common/terminalDataBuffering.ts | 2 +- .../terminal/common/terminalProcess.ts | 76 + .../terminal/common/terminalRecorder.ts | 93 + .../electron-browser/localPtyService.ts | 222 + .../terminal/electron-sandbox/terminal.ts | 11 + .../terminal/node/heartbeatService.ts | 22 + src/vs/platform/terminal/node/ptyHostMain.ts | 33 + src/vs/platform/terminal/node/ptyService.ts | 426 + .../terminal/node/terminalEnvironment.ts | 73 + .../terminal/node/terminalProcess.ts | 53 +- .../platform/theme/browser/iconsStyleSheet.ts | 61 + src/vs/platform/theme/common/colorRegistry.ts | 17 +- src/vs/platform/theme/common/iconRegistry.ts | 84 +- src/vs/platform/theme/common/styler.ts | 44 +- src/vs/platform/theme/common/themeService.ts | 9 +- src/vs/platform/update/common/updateIpc.ts | 74 + .../electron-main/abstractUpdateService.ts | 6 +- .../update/electron-main/updateIpc.ts | 34 - .../electron-main/updateService.darwin.ts | 4 +- .../electron-main/updateService.linux.ts | 4 +- .../electron-main/updateService.snap.ts | 8 +- .../electron-main/updateService.win32.ts | 10 +- .../url/electron-main/electronUrlListener.ts | 6 +- .../common/abstractSynchronizer.ts | 2 +- .../common/extensionsStorageSync.ts | 12 +- .../userDataSync/common/extensionsSync.ts | 5 +- .../userDataSync/common/globalStateMerge.ts | 20 +- .../userDataSync/common/globalStateSync.ts | 109 +- .../common/userDataAutoSyncService.ts | 46 +- .../userDataSync/common/userDataSync.ts | 14 + .../common/userDataSyncBackupStoreService.ts | 5 +- .../userDataSync/common/userDataSyncIpc.ts | 137 +- .../userDataSync/common/userDataSyncLog.ts | 6 +- .../userDataSyncResourceEnablementService.ts | 12 +- .../common/userDataSyncService.ts | 53 +- .../common/userDataSyncServiceIpc.ts} | 157 +- .../common/userDataSyncStoreService.ts | 32 +- .../userDataAutoSyncService.ts | 4 +- .../test/common/userDataSyncService.test.ts | 2 +- .../common/userDataSyncStoreService.test.ts | 1 + .../platform/webview/common/resourceLoader.ts | 102 +- .../webview/common/webviewManagerService.ts | 13 +- .../electron-main/webviewMainService.ts | 29 +- .../webviewPortMappingProvider.ts | 32 +- .../electron-main/webviewProtocolProvider.ts | 193 +- src/vs/platform/windows/common/windows.ts | 13 +- .../windows}/electron-main/window.ts | 210 +- .../platform/windows/electron-main/windows.ts | 48 +- .../electron-main/windowsMainService.ts | 56 +- .../electron-main/windowsStateHandler.ts | 47 +- .../windows/test/electron-main/window.test.ts | 109 - .../test/electron-main/windowsFinder.test.ts | 109 + .../electron-main/windowsStateHandler.test.ts | 133 +- .../workspace/common/workspaceTrust.ts | 87 + .../workspace/test/common/workspace.test.ts | 214 +- .../platform/workspaces/common/workspaces.ts | 39 +- .../workspacesHistoryMainService.ts | 45 +- .../electron-main/workspacesMainService.ts | 2 +- .../workspacesManagementMainService.ts | 33 +- .../workspaces/test/common/workspaces.test.ts | 18 +- .../workspacesHistoryStorage.test.ts | 109 +- .../workspacesManagementMainService.test.ts | 202 +- src/vs/vscode.d.ts | 95 + src/vs/vscode.proposed.d.ts | 1408 +- .../api/browser/extensionHost.contribution.ts | 3 + .../api/browser/mainThreadAuthentication.ts | 419 +- .../api/browser/mainThreadCLICommands.ts | 7 +- .../api/browser/mainThreadComments.ts | 2 +- .../api/browser/mainThreadDebugService.ts | 4 +- .../api/browser/mainThreadDocuments.ts | 7 +- .../workbench/api/browser/mainThreadEditor.ts | 9 - .../api/browser/mainThreadEditors.ts | 4 +- .../mainThreadFileSystemEventService.ts | 8 +- .../api/browser/mainThreadLanguageFeatures.ts | 27 +- .../api/browser/mainThreadLanguages.ts | 22 +- .../api/browser/mainThreadLogService.ts | 6 +- .../api/browser/mainThreadNotebook.ts | 399 +- .../api/browser/mainThreadTerminalService.ts | 8 +- .../api/browser/mainThreadTesting.ts | 86 +- .../api/browser/mainThreadTreeViews.ts | 2 +- .../api/browser/mainThreadTunnelService.ts | 40 +- .../api/browser/mainThreadUriOpeners.ts | 9 +- .../api/browser/mainThreadWorkspace.ts | 23 +- .../api/browser/viewsExtensionPoint.ts | 19 +- .../workbench/api/common/extHost.api.impl.ts | 102 +- .../workbench/api/common/extHost.protocol.ts | 123 +- .../api/common/extHostApiCommands.ts | 14 +- .../api/common/extHostAuthentication.ts | 82 +- .../workbench/api/common/extHostClipboard.ts | 24 +- .../workbench/api/common/extHostCodeInsets.ts | 6 +- .../workbench/api/common/extHostCommands.ts | 22 +- .../api/common/extHostDebugService.ts | 27 +- .../api/common/extHostDocumentsAndEditors.ts | 23 +- .../api/common/extHostExtensionService.ts | 13 + .../api/common/extHostFileSystemConsumer.ts | 74 +- .../common/extHostFileSystemEventService.ts | 3 +- .../api/common/extHostLanguageFeatures.ts | 42 +- .../workbench/api/common/extHostNotebook.ts | 408 +- .../common/extHostNotebookConcatDocument.ts | 3 +- .../api/common/extHostNotebookDocument.ts | 316 +- .../api/common/extHostNotebookEditor.ts | 146 +- .../workbench/api/common/extHostQuickOpen.ts | 1117 +- .../workbench/api/common/extHostStatusBar.ts | 27 +- .../api/common/extHostStoragePaths.ts | 6 +- src/vs/workbench/api/common/extHostTask.ts | 7 +- .../api/common/extHostTerminalService.ts | 137 +- src/vs/workbench/api/common/extHostTesting.ts | 157 +- .../workbench/api/common/extHostTextEditor.ts | 451 +- .../api/common/extHostTextEditors.ts | 25 +- .../workbench/api/common/extHostTreeViews.ts | 7 +- .../api/common/extHostTypeConverters.ts | 349 +- src/vs/workbench/api/common/extHostTypes.ts | 474 +- .../workbench/api/common/extHostWorkspace.ts | 26 +- .../api/common/menusExtensionPoint.ts | 25 +- src/vs/workbench/api/node/extHostCLIServer.ts | 6 +- .../workbench/api/node/extHostDebugService.ts | 30 +- .../api/node/extHostExtensionService.ts | 4 +- .../workbench/api/node/extHostLogService.ts | 9 +- .../api/node/extHostOutputService.ts | 30 +- .../api/node/extHostTerminalService.ts | 19 +- .../api/node/extHostTunnelService.ts | 16 +- .../workbench/api/worker/extHostLogService.ts | 4 +- .../browser/actions/developerActions.ts | 24 +- .../workbench/browser/actions/helpActions.ts | 36 +- .../browser/actions/layoutActions.ts | 138 +- .../workbench/browser/actions/listCommands.ts | 45 +- .../browser/actions/navigationActions.ts | 18 +- .../browser/actions/windowActions.ts | 50 +- .../browser/actions/workspaceActions.ts | 56 +- .../browser/actions/workspaceCommands.ts | 18 +- src/vs/workbench/browser/codeeditor.ts | 6 +- src/vs/workbench/browser/composite.ts | 3 +- src/vs/workbench/browser/contextkeys.ts | 27 +- src/vs/workbench/browser/dnd.ts | 2 +- src/vs/workbench/browser/editor.ts | 155 +- src/vs/workbench/browser/labels.ts | 11 +- src/vs/workbench/browser/layout.ts | 142 +- src/vs/workbench/browser/panecomposite.ts | 85 +- src/vs/workbench/browser/panel.ts | 4 +- src/vs/workbench/browser/part.ts | 2 +- .../parts/activitybar/activitybarActions.ts | 69 +- .../parts/activitybar/activitybarPart.ts | 152 +- .../activitybar/media/activityaction.css | 13 + .../activitybar/media/activitybarpart.css | 24 - .../workbench/browser/parts/compositeBar.ts | 9 +- .../browser/parts/compositeBarActions.ts | 78 +- .../workbench/browser/parts/compositePart.ts | 24 +- .../browser/parts/dialogs/dialogHandler.ts | 12 +- .../browser/parts/editor/binaryDiffEditor.ts | 4 +- .../browser/parts/editor/binaryEditor.ts | 18 +- .../parts/editor/breadcrumbsControl.ts | 5 +- .../browser/parts/editor/breadcrumbsPicker.ts | 10 +- .../parts/editor/editor.contribution.ts | 254 +- .../workbench/browser/parts/editor/editor.ts | 8 +- .../browser/parts/editor/editorActions.ts | 196 +- .../browser/parts/editor/editorAutoSave.ts | 4 +- .../browser/parts/editor/editorCommands.ts | 23 +- .../browser/parts/editor/editorControl.ts | 8 +- .../browser/parts/editor/editorDropTarget.ts | 5 +- .../browser/parts/editor/editorGroupView.ts | 82 +- .../browser/parts/editor/editorPane.ts | 29 +- .../browser/parts/editor/editorPart.ts | 28 +- .../browser/parts/editor/editorStatus.ts | 16 +- .../browser/parts/editor/editorsObserver.ts | 4 +- .../parts/editor/media/tabstitlecontrol.css | 8 +- .../parts/editor/noTabsTitleControl.ts | 17 +- .../browser/parts/editor/sideBySideEditor.ts | 28 +- .../browser/parts/editor/tabsTitleControl.ts | 113 +- .../browser/parts/editor/textDiffEditor.ts | 8 +- .../parts/editor/textResourceEditor.ts | 4 +- .../browser/parts/editor/titleControl.ts | 20 +- .../browser/parts/editor/untitledHint.ts | 176 + .../notifications/notificationsCenter.ts | 2 +- .../notifications/notificationsCommands.ts | 8 +- .../notifications/notificationsToasts.ts | 2 +- .../notifications/notificationsViewer.ts | 5 +- .../browser/parts/panel/panelActions.ts | 34 +- .../browser/parts/panel/panelPart.ts | 21 +- .../browser/parts/sidebar/sidebarPart.ts | 4 +- .../browser/parts/statusbar/statusbarPart.ts | 8 +- .../browser/parts/titlebar/menubarControl.ts | 151 +- .../browser/parts/titlebar/titlebarPart.ts | 2 +- .../browser/parts/views/media/views.css | 36 +- .../workbench/browser/parts/views/treeView.ts | 17 +- .../workbench/browser/parts/views/viewPane.ts | 56 +- .../browser/parts/views/viewPaneContainer.ts | 94 +- .../browser/parts/views/viewsService.ts | 364 +- .../browser/parts/views/viewsViewlet.ts | 9 + src/vs/workbench/browser/quickaccess.ts | 3 +- src/vs/workbench/browser/style.ts | 1 - src/vs/workbench/browser/viewlet.ts | 89 +- src/vs/workbench/browser/web.main.ts | 16 +- .../browser/workbench.contribution.ts | 264 +- src/vs/workbench/browser/workbench.ts | 14 +- src/vs/workbench/buildfile.desktop.js | 4 +- src/vs/workbench/common/actions.ts | 2 +- src/vs/workbench/common/composite.ts | 7 +- src/vs/workbench/common/editor.ts | 62 +- src/vs/workbench/common/notifications.ts | 3 +- src/vs/workbench/common/panecomposite.ts | 2 +- src/vs/workbench/common/panel.ts | 11 +- src/vs/workbench/common/resources.ts | 29 +- src/vs/workbench/common/theme.ts | 208 +- src/vs/workbench/common/viewlet.ts | 7 +- src/vs/workbench/common/views.ts | 90 +- .../contrib/backup/common/backupRestorer.ts | 26 +- .../backup/electron-sandbox/backupTracker.ts | 168 +- .../test/browser/backupRestorer.test.ts | 32 +- .../backup/test/browser/backupTracker.test.ts | 41 +- .../electron-browser/backupTracker.test.ts | 126 +- .../browser/preview/bulkEdit.contribution.ts | 2 +- .../browser/callHierarchy.contribution.ts | 6 +- .../contrib/cli/node/cli.contribution.ts | 11 +- .../languageConfigurationExtensionPoint.ts | 2 +- .../browser/outline/documentSymbolsTree.ts | 373 +- .../electron-browser/startDebugTextMate.ts | 2 +- .../displayChangeRemeasureFonts.ts | 6 +- .../browser/customEditor.contribution.ts | 6 +- .../customEditor/browser/customEditorInput.ts | 18 - .../browser/customEditorInputFactory.ts | 36 +- .../customEditor/browser/customEditors.ts | 40 +- .../common/contributedCustomEditors.ts | 9 +- .../browser/breakpointEditorContribution.ts | 2 +- .../contrib/debug/browser/breakpointsView.ts | 53 +- .../contrib/debug/browser/callStackView.ts | 10 +- .../debug/browser/debug.contribution.ts | 64 +- .../debug/browser/debugActionViewItems.ts | 45 +- .../debug/browser/debugAdapterManager.ts | 4 +- .../contrib/debug/browser/debugCommands.ts | 4 + .../debug/browser/debugEditorContribution.ts | 143 +- .../contrib/debug/browser/debugIcons.ts | 4 +- .../contrib/debug/browser/debugService.ts | 39 +- .../contrib/debug/browser/debugSession.ts | 7 +- .../contrib/debug/browser/debugTaskRunner.ts | 48 +- .../contrib/debug/browser/debugToolBar.ts | 2 +- .../contrib/debug/browser/debugViewlet.ts | 56 +- .../browser/extensionHostDebugService.ts | 86 +- .../contrib/debug/browser/linkDetector.ts | 19 +- .../browser/media/debug.contribution.css | 2 +- .../debug/browser/media/debugViewlet.css | 3 +- .../contrib/debug/browser/media/repl.css | 3 + .../contrib/debug/browser/rawDebugSession.ts | 6 +- .../workbench/contrib/debug/browser/repl.ts | 21 +- .../contrib/debug/browser/replFilter.ts | 23 +- .../workbench/contrib/debug/common/debug.ts | 80 +- .../contrib/debug/common/debugModel.ts | 22 +- .../contrib/debug/common/debugProtocol.d.ts | 7 + .../contrib/debug/common/debugStorage.ts | 11 +- .../contrib/debug/common/debugger.ts | 4 +- .../contrib/debug/common/replModel.ts | 16 +- .../extensionHostDebugService.ts | 2 +- .../debug/test/browser/baseDebugView.test.ts | 2 +- .../debug/test/browser/callStack.test.ts | 13 +- .../debug/test/browser/debugHover.test.ts | 2 +- .../debug/test/browser/debugViewModel.test.ts | 2 +- .../debug/test/browser/linkDetector.test.ts | 8 +- .../contrib/debug/test/browser/repl.test.ts | 16 +- .../debug/test/browser/telemetry.test.ts | 2 +- .../experimentService.test.ts | 3 + .../extensions/browser/extensionEditor.ts | 13 +- ...ensionRecommendationNotificationService.ts | 9 +- .../browser/extensions.contribution.ts | 64 +- .../extensions/browser/extensionsActions.ts | 116 +- .../browser/extensionsDependencyChecker.ts | 3 +- .../extensions/browser/extensionsIcons.ts | 2 + .../extensions/browser/extensionsList.ts | 20 +- .../extensions/browser/extensionsViewlet.ts | 7 +- .../extensions/browser/extensionsViews.ts | 23 +- .../extensions/browser/extensionsWidgets.ts | 13 +- .../browser/extensionsWorkbenchService.ts | 6 +- .../extensions/browser/media/extension.css | 22 +- .../browser/media/extensionEditor.css | 26 +- .../browser/media/extensionsWidgets.css | 9 +- .../extensions.contribution.ts | 2 +- .../extensionsAutoProfiler.ts | 10 +- .../extensionRecommendationsService.test.ts | 2 +- .../extensionsActions.test.ts | 5 +- .../electron-browser/extensionsViews.test.ts | 2 +- .../extensionsWorkbenchService.test.ts | 2 +- .../common/contributedOpeners.ts | 46 +- .../common/externalUriOpenerService.ts | 49 +- .../contrib/feedback/browser/feedback.ts | 28 +- .../feedback/browser/feedbackStatusbarItem.ts | 102 +- .../files/browser/editors/binaryFileEditor.ts | 8 +- .../files/browser/editors/textFileEditor.ts | 2 +- .../browser/editors/textFileEditorTracker.ts | 2 +- .../editors/textFileSaveErrorHandler.ts | 105 +- .../contrib/files/browser/explorerService.ts | 12 +- .../contrib/files/browser/explorerViewlet.ts | 19 +- .../files/browser/fileActions.contribution.ts | 10 +- .../contrib/files/browser/fileActions.ts | 36 +- .../contrib/files/browser/fileCommands.ts | 24 +- .../files/browser/files.contribution.ts | 108 +- .../workbench/contrib/files/browser/files.ts | 58 +- .../files/browser/views/explorerView.ts | 37 +- .../files/browser/views/explorerViewer.ts | 2 +- .../files/browser/views/openEditorsView.ts | 37 +- .../files/common/dirtyFilesIndicator.ts | 2 +- .../workbench/contrib/files/common/files.ts | 27 +- .../files/electron-sandbox/textFileEditor.ts | 2 +- .../files/test/browser/editorAutoSave.test.ts | 47 +- .../test/browser/fileEditorInput.test.ts | 14 +- .../files/test/browser/textFileEditor.test.ts | 113 - .../browser/textFileEditorTracker.test.ts | 62 +- .../issue/electron-sandbox/issueService.ts | 53 +- .../contrib/logs/common/logsDataCleaner.ts | 3 +- .../markers/browser/markers.contribution.ts | 48 +- .../contrib/markers/browser/markersView.ts | 4 +- .../markers/browser/markersViewActions.ts | 14 + .../contrib/notebook/browser/constants.ts | 9 +- .../notebook/browser/contrib/coreActions.ts | 150 +- .../browser/contrib/find/findController.ts | 2 +- .../notebook/browser/contrib/fold/folding.ts | 13 +- .../browser/contrib/fold/foldingModel.ts | 27 +- .../contrib/outline/notebookOutline.ts | 7 +- .../browser/contrib/status/editorStatus.ts | 11 +- .../notebook/browser/diff/diffComponents.ts | 8 +- .../browser/diff/diffElementOutputs.ts | 85 +- .../browser/diff/diffElementViewModel.ts | 4 +- .../notebook/browser/diff/notebookDiff.css | 2 +- .../browser/diff/notebookDiffEditorBrowser.ts | 12 +- .../browser/diff/notebookTextDiffEditor.ts | 35 +- .../notebook/browser/extensionPoint.ts | 45 + .../notebook/browser/media/notebook.css | 58 +- .../notebook/browser/notebook.contribution.ts | 74 +- .../notebook/browser/notebookBrowser.ts | 86 +- .../browser/notebookDiffEditorInput.ts | 44 +- .../notebook/browser/notebookEditor.ts | 4 +- .../notebook/browser/notebookEditorInput.ts | 57 +- .../notebook/browser/notebookEditorWidget.ts | 446 +- .../contrib/notebook/browser/notebookIcons.ts | 12 +- .../notebook/browser/notebookRegistry.ts | 6 +- .../notebook/browser/notebookServiceImpl.ts | 303 +- .../notebook/browser/view/notebookCellList.ts | 97 +- .../browser/view/output/outputRenderer.ts | 42 +- .../view/output/transforms/errorTransform.ts | 24 +- .../view/output/transforms/richTransform.ts | 414 +- .../view/output/transforms/streamTransform.ts | 36 - .../view/output/transforms/textHelper.ts | 48 +- .../view/renderers/backLayerWebView.ts | 685 +- .../browser/view/renderers/cellDnd.ts | 69 +- .../browser/view/renderers/cellOutput.ts | 368 +- .../browser/view/renderers/cellRenderer.ts | 77 +- .../browser/view/renderers/codeCell.ts | 12 +- .../browser/view/renderers/markdownCell.ts | 134 +- .../browser/view/renderers/webviewPreloads.ts | 272 +- .../view/renderers/webviewThemeMapping.ts | 71 + .../notebook/browser/viewModel/cellEdit.ts | 10 +- .../browser/viewModel/cellOutputViewModel.ts | 32 +- .../viewModel/cellSelectionCollection.ts | 85 + .../browser/viewModel/codeCellViewModel.ts | 22 +- .../viewModel/markdownCellViewModel.ts | 16 +- .../browser/viewModel/notebookViewModel.ts | 124 +- .../contrib/notebook/common/model/cellEdit.ts | 16 +- .../model/notebookCellOutputTextModel.ts | 60 + .../common/model/notebookCellTextModel.ts | 11 +- .../common/model/notebookTextModel.ts | 196 +- .../contrib/notebook/common/notebookCommon.ts | 325 +- .../notebook/common/notebookEditorModel.ts | 259 +- .../notebookEditorModelResolverService.ts | 14 +- .../common/notebookMarkdownRenderer.ts | 33 + .../notebook/common/notebookService.ts | 27 +- .../common/services/notebookSimpleWorker.ts | 8 +- .../services/notebookWorkerServiceImpl.ts | 3 +- .../notebook/test/notebookCommon.test.ts | 23 +- .../notebook/test/notebookSelection.test.ts | 33 + .../notebook/test/notebookTextModel.test.ts | 87 +- .../notebook/test/notebookViewModel.test.ts | 12 +- .../notebook/test/testNotebookEditor.ts | 71 +- .../contrib/outline/browser/outlinePane.ts | 2 +- .../output/browser/output.contribution.ts | 62 +- .../contrib/output/browser/outputView.ts | 3 +- .../outputChannelModelService.ts | 23 +- .../test/browser/outputLinkProvider.test.ts | 268 +- .../performance/browser/perfviewEditor.ts | 4 +- .../electron-browser/startupProfiler.ts | 9 +- .../electron-browser/startupTimings.ts | 5 +- .../browser/media/settingsEditor2.css | 21 +- .../preferences/browser/preferencesEditor.ts | 8 +- .../preferences/browser/preferencesIcons.ts | 18 +- .../preferences/browser/settingsEditor2.ts | 6 +- .../preferences/browser/settingsLayout.ts | 5 + .../preferences/browser/settingsTree.ts | 28 +- .../preferences/browser/settingsTreeModels.ts | 11 +- .../remote/browser/media/tunnelView.css | 83 +- .../contrib/remote/browser/remote.ts | 34 +- .../contrib/remote/browser/remoteExplorer.ts | 171 +- .../contrib/remote/browser/remoteIcons.ts | 4 + .../contrib/remote/browser/tunnelView.ts | 1032 +- .../contrib/remote/browser/urlFinder.ts | 7 +- .../remote/common/remote.contribution.ts | 25 +- .../electron-sandbox/remote.contribution.ts | 7 +- .../contrib/sash/browser/sash.contribution.ts | 2 +- .../workbench/contrib/scm/browser/activity.ts | 13 +- .../contrib/scm/browser/dirtydiffDecorator.ts | 10 +- .../contrib/scm/browser/media/scm.css | 2 + src/vs/workbench/contrib/scm/browser/menus.ts | 21 +- .../contrib/scm/browser/scm.contribution.ts | 50 +- .../scm/browser/scmRepositoriesViewPane.ts | 13 +- .../scm/browser/scmRepositoryRenderer.ts | 3 +- .../contrib/scm/browser/scmViewPane.ts | 680 +- .../scm/browser/scmViewPaneContainer.ts | 13 - src/vs/workbench/contrib/scm/browser/util.ts | 36 +- src/vs/workbench/contrib/scm/common/scm.ts | 1 - .../search/browser/anythingQuickAccess.ts | 2 +- .../search/browser/media/searchview.css | 11 + .../contrib/search/browser/replaceService.ts | 3 +- .../search/browser/search.contribution.ts | 56 +- .../contrib/search/browser/searchActions.ts | 32 +- .../contrib/search/browser/searchView.ts | 23 +- .../contrib/search/browser/searchWidget.ts | 2 +- .../browser/searchEditor.contribution.ts | 3 +- .../browser/searchEditorActions.ts | 9 +- .../searchEditor/browser/searchEditorInput.ts | 25 +- .../browser/snippetCompletionProvider.ts | 2 +- .../tags/electron-browser/workspaceTags.ts | 3 +- .../tasks/browser/abstractTaskService.ts | 4 +- .../tasks/browser/runAutomaticTasks.ts | 69 +- .../tasks/browser/task.contribution.ts | 8 +- .../contrib/tasks/browser/taskQuickPick.ts | 29 +- .../tasks/browser/terminalTaskSystem.ts | 3 +- .../contrib/tasks/common/jsonSchema_v2.ts | 16 +- .../tasks/common/taskDefinitionRegistry.ts | 7 + .../tasks/electron-browser/taskService.ts | 3 + .../browser/environmentVariableInfo.ts | 2 +- .../browser/links/terminalLinkManager.ts | 4 +- .../terminal/browser/media/terminal.css | 1 + .../terminal/browser/remoteTerminalService.ts | 58 +- .../terminal/browser/terminal.contribution.ts | 81 +- .../contrib/terminal/browser/terminal.ts | 52 +- .../terminal/browser/terminalActions.ts | 787 +- .../terminal/browser/terminalConfigHelper.ts | 3 +- .../terminal/browser/terminalInstance.ts | 42 +- .../browser/terminalInstanceService.ts | 33 +- .../browser/terminalProcessExtHostProxy.ts | 5 +- .../browser/terminalProcessManager.ts | 77 +- .../terminal/browser/terminalService.ts | 181 +- .../contrib/terminal/browser/terminalTab.ts | 27 +- .../browser/terminalTypeAheadAddon.ts | 130 +- .../contrib/terminal/browser/terminalView.ts | 161 +- .../environmentVariable.contribution.ts | 2 +- .../terminal/common/environmentVariable.ts | 4 +- .../common/environmentVariableCollection.ts | 11 +- .../common/environmentVariableService.ts | 2 +- .../terminal/common/remoteTerminalChannel.ts | 15 +- .../contrib/terminal/common/terminal.ts | 270 +- .../terminal/common/terminalConfiguration.ts | 2 +- .../terminal/common/terminalEnvironment.ts | 2 +- .../contrib/terminal/common/terminalMenu.ts | 11 - .../terminalInstanceService.ts | 131 +- .../terminalNativeContribution.ts | 3 +- .../terminal/electron-sandbox/localPty.ts | 122 + .../electron-sandbox/terminal.contribution.ts | 10 + .../contrib/terminal/node/terminal.ts | 26 +- .../terminal/node/terminalEnvironment.ts | 63 +- .../test/browser/terminalConfigHelper.test.ts | 94 +- .../test/browser/terminalTypeahead.test.ts | 36 +- .../test/common/terminalDataBuffering.test.ts | 2 +- .../hierarchalByLocation.ts | 98 +- .../explorerProjections/hierarchalByName.ts | 11 +- .../explorerProjections/hierarchalNodes.ts | 84 +- .../browser/explorerProjections/index.ts | 28 +- .../explorerProjections/locationStore.ts | 24 +- .../explorerProjections/stateByLocation.ts | 321 - .../explorerProjections/stateByName.ts | 289 - .../browser/explorerProjections/stateNodes.ts | 35 - .../contrib/testing/browser/icons.ts | 8 +- .../contrib/testing/browser/media/testing.css | 65 +- .../testing/browser/testExplorerActions.ts | 548 +- .../testing/browser/testing.contribution.ts | 49 +- .../testing/browser/testingDecorations.ts | 165 +- .../testing/browser/testingExplorerFilter.ts | 183 +- .../testing/browser/testingExplorerView.ts | 597 +- .../testing/browser/testingOutputPeek.ts | 219 +- .../contrib/testing/browser/theme.ts | 22 +- .../contrib/testing/common/configuration.ts | 59 + .../contrib/testing/common/constants.ts | 10 +- .../testing/common/getComputedState.ts | 84 + .../contrib/testing/common/observableValue.ts | 32 + .../testing/common/ownedTestCollection.ts | 180 +- .../contrib/testing/common/testCollection.ts | 87 +- .../testing/common/testResultService.ts | 608 +- .../contrib/testing/common/testService.ts | 61 +- .../contrib/testing/common/testServiceImpl.ts | 135 +- .../contrib/testing/common/testStubs.ts | 14 +- .../contrib/testing/common/testingAutoRun.ts | 102 + .../testing/common/testingContentProvider.ts | 17 +- .../testing/common/testingContextKeys.ts | 12 +- .../contrib/testing/common/testingStates.ts | 12 +- .../contrib/testing/common/testingUri.ts | 54 +- .../common/workspaceTestCollectionService.ts | 14 + .../hierarchalByLocation.test.ts | 14 +- .../hierarchalByName.test.ts | 14 +- .../stateByLocation.test.ts | 154 - .../explorerProjections/stateByName.test.ts | 122 - .../test/common/ownedTestCollection.ts | 27 +- .../test/common/testResultService.test.ts | 240 + .../testing/test/common/testingUri.test.ts | 9 +- .../contrib/timeline/browser/timelinePane.ts | 32 +- .../contrib/update/browser/update.ts | 129 +- .../url/browser/trustedDomainsValidator.ts | 5 +- .../userDataSync/browser/userDataSync.ts | 35 +- .../userDataSync/browser/userDataSyncViews.ts | 32 +- .../userDataSync.contribution.ts | 2 +- .../contrib/watermark/browser/watermark.ts | 2 +- .../webview/browser/baseWebviewElement.ts | 18 +- .../browser/dynamicWebviewEditorOverlay.ts | 7 + .../contrib/webview/browser/pre/main.js | 25 + .../webview/browser/pre/service-worker.js | 187 +- .../contrib/webview/browser/themeing.ts | 3 +- .../contrib/webview/browser/webview.ts | 3 + .../contrib/webview/browser/webviewElement.ts | 58 +- .../electron-browser/webviewElement.ts | 2 +- .../webviewIgnoreMenuShortcutsManager.ts | 6 +- .../electron-sandbox/iframeWebviewElement.ts | 15 +- .../electron-sandbox/resourceLoading.ts | 36 +- .../windowIgnoreMenuShortcutsManager.ts | 6 +- .../webviewPanel/browser/webviewEditor.ts | 5 +- .../common/viewsWelcome.contribution.ts | 2 +- .../browser/gettingStarted.contribution.ts | 115 +- .../gettingStarted/browser/gettingStarted.css | 194 +- .../gettingStarted/browser/gettingStarted.ts | 545 +- .../browser/vs_code_editor_getting_started.ts | 36 - .../page/browser/welcomePage.contribution.ts | 34 +- .../welcome/page/browser/welcomePage.ts | 245 +- .../welcome/page/browser/welcomePageColors.ts | 9 +- .../browser/editor/editorWalkThrough.ts | 3 +- .../editor/vs_code_editor_walkthrough.ts | 2 +- .../walkThrough/browser/walkThroughPart.ts | 1 + .../browser/workspace.contribution.ts | 355 + .../browser/workspaceTrustEditor.css | 87 + .../workspace/browser/workspaceTrustEditor.ts | 187 + .../workspace/browser/workspaceTrustTree.ts | 471 + .../electron-browser/desktop.main.ts | 43 +- .../electron-sandbox/actions/windowActions.ts | 24 +- .../electron-sandbox/desktop.contribution.ts | 6 + .../electron-sandbox/desktop.main.ts | 98 +- .../parts/dialogs/dialogHandler.ts | 16 +- .../parts/titlebar/titlebarPart.ts | 52 +- .../sandbox.simpleservices.ts | 29 +- src/vs/workbench/electron-sandbox/window.ts | 22 +- .../services/activity/common/activity.ts | 4 +- .../browser/authenticationService.ts | 419 +- .../backupFileService.test.ts | 148 +- .../commands/common/commandService.ts | 2 +- .../configuration/browser/configuration.ts | 73 +- .../browser/configurationService.ts | 32 +- .../browser/configurationResolverService.ts | 10 +- .../common/variableResolver.ts | 11 +- .../configurationResolverService.ts | 3 + .../configurationResolverService.test.ts | 23 +- .../electron-browser/diagnosticsService.ts | 23 - .../electron-sandbox/diagnosticsService.ts | 9 + .../dialogs/browser/simpleFileDialog.ts | 13 +- .../services/editor/browser/editorService.ts | 314 +- .../editor/common/editorGroupsService.ts | 6 +- .../services/editor/common/editorOpenWith.ts | 309 - .../services/editor/common/editorService.ts | 19 - .../test/browser/editorGroupsService.test.ts | 213 +- .../editor/test/browser/editorService.test.ts | 78 +- .../test/browser/editorsObserver.test.ts | 63 +- .../electron-sandbox/encryptionService.ts | 6 +- .../experiment/common/experimentService.ts | 37 +- .../browser/extensionEnablementService.ts | 101 +- .../common/extensionManagement.ts | 1 + .../common/extensionManagementService.ts | 54 +- .../extensionManagementServerService.ts | 2 +- .../extensionManagementService.ts | 12 +- .../extensionTipsService.ts | 2 +- .../extensionUrlTrustService.ts | 6 +- .../remoteExtensionManagementService.ts | 5 +- .../extensionEnablementService.test.ts | 18 +- .../common/workspaceExtensionsConfig.ts | 12 +- .../extensions/browser/extensionService.ts | 3 + .../common/abstractExtensionService.ts | 12 +- .../services/extensions/common/extensions.ts | 14 +- .../extensions/common/extensionsRegistry.ts | 10 + .../services/extensions/common/rpcProtocol.ts | 14 +- .../cachedExtensionScanner.ts | 11 +- .../electron-browser/extensionService.ts | 3 + .../extensions/node/extensionPoints.ts | 17 +- .../services/extensions/node/proxyResolver.ts | 31 +- .../common/filesConfigurationService.ts | 2 +- .../common/gettingStartedContent.ts | 31 +- .../common/gettingStartedRegistry.ts | 126 +- .../common/gettingStartedService.ts | 91 +- .../common/media/dark/settings.png | Bin 0 -> 25343 bytes .../common/media/hc/settings.png | Bin 0 -> 36444 bytes .../common/media/light/settings.png | Bin 0 -> 36898 bytes .../gettingStarted/common/media/settings.png | Bin 26205 -> 0 bytes .../services/history/browser/history.ts | 190 +- .../services/history/common/history.ts | 10 +- .../history/test/browser/history.test.ts | 115 +- .../host/browser/browserHostService.ts | 6 + .../electron-sandbox}/sharedProcessService.ts | 43 +- .../issue/electron-sandbox/issueService.ts | 6 +- .../keybinding/browser/keybindingService.ts | 12 + .../browser/keyboardLayoutService.ts | 7 + .../common/macLinuxKeyboardMapper.ts | 16 + .../common/windowsKeyboardMapper.ts | 16 + .../electron-sandbox/nativeKeyboardLayout.ts | 6 +- .../keyboardMapperTestUtils.ts | 17 +- .../macLinuxFallbackKeyboardMapper.test.ts | 115 +- .../macLinuxKeyboardMapper.test.ts | 257 +- .../windowsKeyboardMapper.test.ts | 127 +- .../services/label/common/labelService.ts | 15 +- .../services/layout/browser/layoutService.ts | 17 +- .../electron-sandbox/lifecycleService.ts | 4 +- .../localizationsService.ts | 6 +- .../log/electron-browser/logService.ts | 72 - .../log/electron-sandbox/logService.ts | 39 + .../electron-sandbox/menubarService.ts | 6 +- .../common/notificationService.ts | 6 +- .../services/output/node/outputAppender.ts | 25 - .../preferences/browser/preferencesService.ts | 52 +- .../preferences/common/preferences.ts | 9 +- .../test/browser/progressIndicator.test.ts | 3 +- .../remote/common/remoteExplorerService.ts | 130 +- .../search/electron-browser/searchService.ts | 3 - .../telemetryService.ts | 2 +- .../electron-browser/commonProperties.test.ts | 21 +- .../browser/browserTextFileService.ts | 7 +- .../textfile/browser/textFileService.ts | 18 +- .../services/textfile/common/encoding.ts | 79 +- .../textfile/common/textFileEditorModel.ts | 8 +- .../common/textFileEditorModelManager.ts | 6 +- .../services/textfile/common/textfiles.ts | 1 + .../electron-browser/nativeTextFileService.ts | 33 +- .../test/browser/textFileEditorModel.test.ts | 14 +- .../test/browser/textFileService.test.ts | 1 - .../nativeTextFileService.io.test.ts | 15 +- .../nativeTextFileService.test.ts | 70 + .../test/node/encoding/encoding.test.ts | 6 +- .../browser/textModelResolverService.test.ts | 16 +- .../themes/browser/workbenchThemeService.ts | 8 +- .../themes/common/iconExtensionPoint.ts | 234 + .../services/timer/browser/timerService.ts | 20 + .../test/browser/untitledTextEditor.test.ts | 2 +- .../update/electron-sandbox/updateService.ts | 59 +- .../url/electron-sandbox/urlService.ts | 6 +- .../services/userData/browser/userDataInit.ts | 61 +- .../userDataAutoSyncEnablementService.ts | 14 + .../browser/userDataSyncWorkbenchService.ts | 32 +- .../userDataSync/common/userDataSync.ts | 5 +- .../userDataAutoSyncService.ts | 2 +- .../userDataSyncAccountService.ts | 2 +- .../userDataSyncMachinesService.ts | 2 +- .../electron-sandbox/userDataSyncService.ts | 10 + .../userDataSyncStoreManagementService.ts | 27 +- .../views/browser/viewDescriptorService.ts | 4 +- .../views/common/viewContainerModel.ts | 19 +- .../test/browser/viewContainerModel.test.ts | 30 +- .../browser/viewDescriptorService.test.ts | 4 +- .../common/workingCopyFileService.ts | 13 +- .../abstractWorkspaceEditingService.ts | 12 +- .../browser/workspaceTrustEditorInput.ts | 42 + .../workspaces/browser/workspacesService.ts | 2 +- .../workspaces/common/workspaceTrust.ts | 351 + .../electron-sandbox/workspacesService.ts | 6 +- .../test/common/testWorkspaceTrustService.ts | 28 + .../browser/api/extHostApiCommands.test.ts | 10 +- .../browser/api/extHostConfiguration.test.ts | 9 +- .../test/browser/api/extHostNotebook.test.ts | 52 +- .../api/extHostNotebookConcatDocument.test.ts | 2 +- .../browser/api/extHostNotebookKernel.test.ts | 110 + .../test/browser/api/extHostTesting.test.ts | 37 +- .../browser/api/extHostTextEditor.test.ts | 207 +- .../test/browser/api/extHostTreeViews.test.ts | 14 +- .../test/browser/api/extHostTypes.test.ts | 56 + .../test/browser/api/extHostWorkspace.test.ts | 3 +- .../browser/api/mainThreadDocuments.test.ts | 6 +- .../browser/api/mainThreadTreeViews.test.ts | 2 +- src/vs/workbench/test/browser/part.test.ts | 177 +- .../test/browser/parts/editor/editor.test.ts | 14 +- .../parts/editor/editorDiffModel.test.ts | 7 +- .../browser/parts/editor/editorGroups.test.ts | 399 +- .../browser/parts/editor/editorInput.test.ts | 14 +- .../browser/parts/editor/editorModel.test.ts | 77 +- .../browser/parts/editor/editorPane.test.ts | 30 +- src/vs/workbench/test/browser/viewlet.test.ts | 22 +- .../test/browser/workbenchTestServices.ts | 180 +- .../test/common/notifications.test.ts | 2 +- .../test/common/workbenchTestServices.ts | 8 +- .../api/extHostSearch.test.ts | 12 +- .../colorRegistry.releaseTest.ts | 5 +- .../textsearch.perf.integrationTest.ts | 3 +- .../electron-browser/workbenchTestServices.ts | 3 +- src/vs/workbench/workbench.common.main.ts | 6 +- src/vs/workbench/workbench.desktop.main.ts | 17 - src/vs/workbench/workbench.sandbox.main.ts | 20 + src/vs/workbench/workbench.web.api.ts | 4 +- src/vs/workbench/workbench.web.main.ts | 2 +- test/automation/package.json | 4 +- test/automation/src/application.ts | 11 +- test/automation/src/code.ts | 25 +- test/automation/src/extensions.ts | 6 + test/automation/src/playwrightDriver.ts | 3 +- test/automation/src/settings.ts | 4 +- test/automation/tsconfig.json | 2 +- test/smoke/README.md | 37 +- .../src/areas/extensions/extensions.test.ts | 11 +- .../smoke/src/areas/notebook/notebook.test.ts | 2 +- test/smoke/src/areas/search/search.test.ts | 2 +- .../areas/workbench/data-migration.test.ts | 4 +- .../src/areas/workbench/localization.test.ts | 4 +- test/smoke/src/main.ts | 2 +- test/ui/splitview/package.json | 13 - test/ui/splitview/public/index.html | 260 - test/ui/splitview/yarn.lock | 341 - test/ui/tree/package.json | 13 - test/ui/tree/public/compressed.json | 15620 ---------------- test/ui/tree/public/index.html | 403 - test/ui/tree/server.js | 68 - test/ui/tree/tree.js | 24 - test/ui/tree/yarn.lock | 341 - test/unit/browser/index.js | 15 +- yarn.lock | 292 +- 1459 files changed, 53314 insertions(+), 51110 deletions(-) delete mode 100644 .github/actions/build-chat/.gitignore delete mode 100644 .github/actions/build-chat/action.yml delete mode 100644 .github/actions/build-chat/package.json delete mode 100644 .github/actions/build-chat/src/main.ts delete mode 100644 .github/actions/build-chat/tsconfig.json delete mode 100644 .github/actions/build-chat/yarn.lock create mode 100644 .github/workflows/no-yarn-lock-changes.yml rename .github/workflows/{commands.yml => on-comment.yml} (63%) delete mode 100644 build/ext.js create mode 100644 build/lib/builtInExtensionsCG.js create mode 100644 build/lib/builtInExtensionsCG.ts delete mode 100644 build/npm/update-grammar.js create mode 100644 extensions/bat/yarn.lock create mode 100644 extensions/clojure/yarn.lock create mode 100644 extensions/coffeescript/yarn.lock create mode 100644 extensions/cpp/yarn.lock create mode 100644 extensions/csharp/yarn.lock create mode 100644 extensions/css/yarn.lock create mode 100644 extensions/docker/yarn.lock create mode 100644 extensions/emmet/src/test/test-fixtures/.vscode/settings.json create mode 100644 extensions/fsharp/yarn.lock create mode 100644 extensions/go/yarn.lock create mode 100644 extensions/groovy/yarn.lock create mode 100644 extensions/handlebars/yarn.lock create mode 100644 extensions/hlsl/yarn.lock create mode 100644 extensions/html/yarn.lock create mode 100644 extensions/ini/yarn.lock create mode 100644 extensions/java/yarn.lock create mode 100644 extensions/javascript/yarn.lock create mode 100644 extensions/json/yarn.lock create mode 100644 extensions/julia/.vscodeignore create mode 100644 extensions/julia/cgmanifest.json create mode 100644 extensions/julia/language-configuration.json create mode 100644 extensions/julia/package.json create mode 100644 extensions/julia/package.nls.json create mode 100644 extensions/julia/syntaxes/julia.tmLanguage.json create mode 100644 extensions/less/yarn.lock create mode 100644 extensions/log/yarn.lock create mode 100644 extensions/lua/yarn.lock create mode 100644 extensions/make/yarn.lock create mode 100644 extensions/markdown-basics/yarn.lock create mode 100644 extensions/markdown-language-features/notebook-out/index.js create mode 100644 extensions/markdown-language-features/notebook/index.ts create mode 100644 extensions/markdown-language-features/webpack.notebook.js create mode 100644 extensions/notebook-markdown-extensions/.vscodeignore create mode 100644 extensions/notebook-markdown-extensions/README.md create mode 100644 extensions/notebook-markdown-extensions/icon.png create mode 100644 extensions/notebook-markdown-extensions/notebook-out/emoji.js create mode 100644 extensions/notebook-markdown-extensions/notebook-out/katex.js create mode 100644 extensions/notebook-markdown-extensions/notebook/emoji.ts create mode 100644 extensions/notebook-markdown-extensions/notebook/katex.ts create mode 100644 extensions/notebook-markdown-extensions/notebook/tsconfig.json create mode 100644 extensions/notebook-markdown-extensions/package.json create mode 100644 extensions/notebook-markdown-extensions/package.nls.json create mode 100644 extensions/notebook-markdown-extensions/webpack.notebook.js create mode 100644 extensions/notebook-markdown-extensions/yarn.lock create mode 100644 extensions/npm/src/npmScriptLens.ts create mode 100644 extensions/npm/src/readScripts.ts create mode 100644 extensions/objective-c/yarn.lock create mode 100644 extensions/perl/yarn.lock create mode 100644 extensions/php/yarn.lock create mode 100644 extensions/powershell/yarn.lock create mode 100644 extensions/pug/yarn.lock create mode 100644 extensions/python/yarn.lock create mode 100644 extensions/r/yarn.lock create mode 100644 extensions/razor/yarn.lock create mode 100644 extensions/ruby/yarn.lock create mode 100644 extensions/rust/yarn.lock create mode 100644 extensions/scss/yarn.lock create mode 100644 extensions/shaderlab/yarn.lock create mode 100644 extensions/shellscript/yarn.lock rename test/ui/splitview/server.js => extensions/simple-browser/build/copy.js (54%) create mode 100644 extensions/simple-browser/media/codicon.css create mode 100644 extensions/simple-browser/media/codicon.ttf create mode 100644 extensions/sql/yarn.lock create mode 100644 extensions/swift/yarn.lock create mode 100644 extensions/theme-abyss/yarn.lock delete mode 100644 extensions/theme-defaults/themes/dark_defaults.json delete mode 100644 extensions/theme-defaults/themes/hc_black_defaults.json delete mode 100644 extensions/theme-defaults/themes/light_defaults.json create mode 100644 extensions/theme-defaults/yarn.lock create mode 100644 extensions/theme-kimbie-dark/yarn.lock create mode 100644 extensions/theme-monokai-dimmed/yarn.lock create mode 100644 extensions/theme-monokai/yarn.lock create mode 100644 extensions/theme-quietlight/yarn.lock create mode 100644 extensions/theme-red/yarn.lock create mode 100644 extensions/theme-seti/icons/preview.html create mode 100644 extensions/theme-seti/yarn.lock create mode 100644 extensions/theme-solarized-dark/yarn.lock create mode 100644 extensions/theme-solarized-light/yarn.lock create mode 100644 extensions/theme-tomorrow-night-blue/yarn.lock create mode 100644 extensions/typescript-basics/yarn.lock create mode 100644 extensions/vb/yarn.lock create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/extensions.test.ts create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/notebook.document.test.ts create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/rpc.test.ts create mode 100644 extensions/vscode-api-tests/testWorkspace2/.vscode/settings.json create mode 100644 extensions/vscode-colorize-tests/test/colorize-fixtures/test.jl create mode 100644 extensions/vscode-colorize-tests/test/colorize-results/test_jl.json rename extensions/vscode-notebook-tests/src/{notebookSmokeTestMain.ts => extension.ts} (77%) delete mode 100644 extensions/vscode-notebook-tests/src/notebook.test.ts delete mode 100644 extensions/vscode-notebook-tests/src/notebookTestMain.ts create mode 100644 extensions/xml/yarn.lock create mode 100644 extensions/yaml/yarn.lock delete mode 100644 src/paths.js create mode 100644 src/vs/base/browser/ui/table/table.css create mode 100644 src/vs/base/browser/ui/table/table.ts create mode 100644 src/vs/base/browser/ui/table/tableWidget.ts delete mode 100644 src/vs/base/common/buildunit.json delete mode 100644 src/vs/base/common/errorsWithActions.ts rename extensions/typescript-language-features/src/typings/collections.d.ts => src/vs/base/node/userDataPath.d.ts (78%) create mode 100644 src/vs/base/node/userDataPath.js rename src/vs/base/parts/ipc/{electron-sandbox => electron-browser}/ipc.mp.ts (90%) rename src/vs/base/{node/paths.ts => test/node/userDataPath.test.ts} (56%) delete mode 100644 src/vs/buildunit.json create mode 100644 src/vs/editor/browser/services/markerDecorations.ts create mode 100644 src/vs/editor/contrib/symbolIcons/symbolIcons.ts rename src/vs/{code => platform/environment}/node/shellEnv.ts (100%) rename src/vs/platform/environment/node/{waitMarkerFile.ts => wait.ts} (72%) create mode 100644 src/vs/platform/ipc/electron-browser/mainProcessService.ts create mode 100644 src/vs/platform/ipc/electron-sandbox/services.ts rename src/vs/platform/launch/{node => common}/launch.ts (100%) rename src/vs/platform/log/common/{fileLogService.ts => fileLog.ts} (94%) create mode 100644 src/vs/platform/log/node/spdlogLog.ts delete mode 100644 src/vs/platform/log/node/spdlogService.ts rename src/vs/{code => platform/sharedProcess}/electron-main/sharedProcess.ts (68%) create mode 100644 src/vs/platform/storage/common/storageIpc.ts create mode 100644 src/vs/platform/storage/electron-main/storageIpc.ts create mode 100644 src/vs/platform/storage/electron-main/storageMain.ts create mode 100644 src/vs/platform/storage/electron-main/storageMainService.ts create mode 100644 src/vs/platform/storage/electron-sandbox/storageService2.ts delete mode 100644 src/vs/platform/storage/node/storageIpc.ts delete mode 100644 src/vs/platform/storage/node/storageMainService.ts rename src/vs/platform/storage/test/{electron-browser/storage.test.ts => browser/storageService.test.ts} (51%) create mode 100644 src/vs/platform/storage/test/electron-main/storageMainService.test.ts create mode 100644 src/vs/platform/terminal/common/environmentVariable.ts create mode 100644 src/vs/platform/terminal/common/terminal.ts rename src/vs/{workbench/contrib => platform}/terminal/common/terminalDataBuffering.ts (95%) create mode 100644 src/vs/platform/terminal/common/terminalProcess.ts create mode 100644 src/vs/platform/terminal/common/terminalRecorder.ts create mode 100644 src/vs/platform/terminal/electron-browser/localPtyService.ts create mode 100644 src/vs/platform/terminal/electron-sandbox/terminal.ts create mode 100644 src/vs/platform/terminal/node/heartbeatService.ts create mode 100644 src/vs/platform/terminal/node/ptyHostMain.ts create mode 100644 src/vs/platform/terminal/node/ptyService.ts create mode 100644 src/vs/platform/terminal/node/terminalEnvironment.ts rename src/vs/{workbench/contrib => platform}/terminal/node/terminalProcess.ts (88%) create mode 100644 src/vs/platform/theme/browser/iconsStyleSheet.ts create mode 100644 src/vs/platform/update/common/updateIpc.ts delete mode 100644 src/vs/platform/update/electron-main/updateIpc.ts rename src/vs/{workbench/services/userDataSync/electron-browser/userDataSyncService.ts => platform/userDataSync/common/userDataSyncServiceIpc.ts} (59%) rename src/vs/{code => platform/windows}/electron-main/window.ts (88%) delete mode 100644 src/vs/platform/windows/test/electron-main/window.test.ts create mode 100644 src/vs/platform/windows/test/electron-main/windowsFinder.test.ts create mode 100644 src/vs/platform/workspace/common/workspaceTrust.ts create mode 100644 src/vs/workbench/browser/parts/editor/untitledHint.ts delete mode 100644 src/vs/workbench/contrib/files/test/browser/textFileEditor.test.ts delete mode 100644 src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts create mode 100644 src/vs/workbench/contrib/notebook/browser/view/renderers/webviewThemeMapping.ts create mode 100644 src/vs/workbench/contrib/notebook/browser/viewModel/cellSelectionCollection.ts create mode 100644 src/vs/workbench/contrib/notebook/common/model/notebookCellOutputTextModel.ts create mode 100644 src/vs/workbench/contrib/notebook/common/notebookMarkdownRenderer.ts create mode 100644 src/vs/workbench/contrib/notebook/test/notebookSelection.test.ts rename src/vs/workbench/contrib/output/{electron-browser => electron-sandbox}/outputChannelModelService.ts (91%) create mode 100644 src/vs/workbench/contrib/terminal/electron-sandbox/localPty.ts create mode 100644 src/vs/workbench/contrib/terminal/electron-sandbox/terminal.contribution.ts delete mode 100644 src/vs/workbench/contrib/testing/browser/explorerProjections/stateByLocation.ts delete mode 100644 src/vs/workbench/contrib/testing/browser/explorerProjections/stateByName.ts delete mode 100644 src/vs/workbench/contrib/testing/browser/explorerProjections/stateNodes.ts create mode 100644 src/vs/workbench/contrib/testing/common/configuration.ts create mode 100644 src/vs/workbench/contrib/testing/common/getComputedState.ts create mode 100644 src/vs/workbench/contrib/testing/common/observableValue.ts create mode 100644 src/vs/workbench/contrib/testing/common/testingAutoRun.ts delete mode 100644 src/vs/workbench/contrib/testing/test/browser/explorerProjections/stateByLocation.test.ts delete mode 100644 src/vs/workbench/contrib/testing/test/browser/explorerProjections/stateByName.test.ts create mode 100644 src/vs/workbench/contrib/testing/test/common/testResultService.test.ts rename src/vs/workbench/contrib/userDataSync/{electron-browser => electron-sandbox}/userDataSync.contribution.ts (99%) delete mode 100644 src/vs/workbench/contrib/welcome/gettingStarted/browser/vs_code_editor_getting_started.ts create mode 100644 src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts create mode 100644 src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.css create mode 100644 src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts create mode 100644 src/vs/workbench/contrib/workspace/browser/workspaceTrustTree.ts delete mode 100644 src/vs/workbench/services/diagnostics/electron-browser/diagnosticsService.ts create mode 100644 src/vs/workbench/services/diagnostics/electron-sandbox/diagnosticsService.ts delete mode 100644 src/vs/workbench/services/editor/common/editorOpenWith.ts rename src/vs/workbench/services/extensionManagement/{electron-browser => electron-sandbox}/extensionManagementServerService.ts (99%) rename src/vs/workbench/services/extensionManagement/{electron-browser => electron-sandbox}/extensionTipsService.ts (98%) create mode 100644 src/vs/workbench/services/gettingStarted/common/media/dark/settings.png create mode 100644 src/vs/workbench/services/gettingStarted/common/media/hc/settings.png create mode 100644 src/vs/workbench/services/gettingStarted/common/media/light/settings.png delete mode 100644 src/vs/workbench/services/gettingStarted/common/media/settings.png rename src/vs/{platform/ipc/electron-browser => workbench/services/ipc/electron-sandbox}/sharedProcessService.ts (56%) rename src/vs/workbench/services/localizations/{electron-browser => electron-sandbox}/localizationsService.ts (81%) delete mode 100644 src/vs/workbench/services/log/electron-browser/logService.ts create mode 100644 src/vs/workbench/services/log/electron-sandbox/logService.ts delete mode 100644 src/vs/workbench/services/output/node/outputAppender.ts rename src/vs/workbench/services/telemetry/{electron-browser => electron-sandbox}/telemetryService.ts (99%) create mode 100644 src/vs/workbench/services/textfile/test/electron-browser/nativeTextFileService.test.ts create mode 100644 src/vs/workbench/services/themes/common/iconExtensionPoint.ts rename src/vs/workbench/services/userDataSync/{electron-browser => electron-sandbox}/userDataAutoSyncService.ts (98%) rename src/vs/workbench/services/userDataSync/{electron-browser => electron-sandbox}/userDataSyncAccountService.ts (98%) rename src/vs/workbench/services/userDataSync/{electron-browser => electron-sandbox}/userDataSyncMachinesService.ts (98%) create mode 100644 src/vs/workbench/services/userDataSync/electron-sandbox/userDataSyncService.ts rename src/vs/workbench/services/userDataSync/{electron-browser => electron-sandbox}/userDataSyncStoreManagementService.ts (63%) create mode 100644 src/vs/workbench/services/workspaces/browser/workspaceTrustEditorInput.ts create mode 100644 src/vs/workbench/services/workspaces/common/workspaceTrust.ts create mode 100644 src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts create mode 100644 src/vs/workbench/test/browser/api/extHostNotebookKernel.test.ts delete mode 100644 test/ui/splitview/package.json delete mode 100644 test/ui/splitview/public/index.html delete mode 100644 test/ui/splitview/yarn.lock delete mode 100644 test/ui/tree/package.json delete mode 100644 test/ui/tree/public/compressed.json delete mode 100644 test/ui/tree/public/index.html delete mode 100644 test/ui/tree/server.js delete mode 100644 test/ui/tree/tree.js delete mode 100644 test/ui/tree/yarn.lock diff --git a/.devcontainer/cache/build-cache-image.sh b/.devcontainer/cache/build-cache-image.sh index 78d0fbfd..42e143d7 100755 --- a/.devcontainer/cache/build-cache-image.sh +++ b/.devcontainer/cache/build-cache-image.sh @@ -8,7 +8,7 @@ set -e SCRIPT_PATH="$(cd "$(dirname $0)" && pwd)" CONTAINER_IMAGE_REPOSITORY="$1" -BRANCH="${2:-"master"}" +BRANCH="${2:-"main"}" if [ "${CONTAINER_IMAGE_REPOSITORY}" = "" ]; then echo "Container repository not specified!" diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index cd632e13..3b82cd90 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "name": "Code - OSS", // Image contents: https://github.com/microsoft/vscode-dev-containers/blob/master/repository-containers/images/github.com/microsoft/vscode/.devcontainer/base.Dockerfile - "image": "mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:branch-master", + "image": "mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:branch-main", "workspaceMount": "source=${localWorkspaceFolder},target=/home/node/workspace/vscode,type=bind,consistency=cached", "workspaceFolder": "/home/node/workspace/vscode", diff --git a/.eslintignore b/.eslintignore index 5a8dd89e..8b93a419 100644 --- a/.eslintignore +++ b/.eslintignore @@ -13,5 +13,6 @@ **/extensions/**/out/** **/extensions/**/build/** **/extensions/markdown-language-features/media/** +**/extensions/markdown-language-features/notebook-out/** **/extensions/typescript-basics/test/colorize-fixtures/** **/extensions/**/dist/** diff --git a/.eslintrc.json b/.eslintrc.json index 24b5b101..1085686e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -268,7 +268,6 @@ "**/vs/base/{common,node,electron-main}/**", "**/vs/base/parts/*/{common,node,electron-main}/**", "**/vs/platform/*/{common,node,electron-main}/**", - "**/vs/code/**", "*" // node modules ] }, @@ -279,6 +278,7 @@ "sinon", "vs/nls", "**/vs/base/{common,browser}/**", + "**/vs/base/parts/*/{common,browser}/**", "**/vs/platform/*/{common,browser}/**", "**/vs/platform/*/test/{common,browser}/**" ] @@ -807,7 +807,6 @@ "**/vs/platform/**/{common,node}/**", "**/vs/workbench/**/{common,node}/**", "**/vs/server/**", - "**/vs/code/**/{common,node}/**", "*" // node modules ] }, @@ -985,7 +984,8 @@ "TreeDataProvider", "CustomEditorProvider", "CustomReadonlyEditorProvider", - "TerminalLinkProvider" + "TerminalLinkProvider", + "AuthenticationProvider" ] } ], @@ -1009,6 +1009,7 @@ "end", "expand", "hide", + "invalidate", "open", "override", "receive", diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index acb1cb3d..de7ad30b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,11 +4,11 @@ about: Create a report to help us improve --- - - - - -- VSCode Version: + + + + +- VS Code Version: - OS Version: Steps to Reproduce: @@ -16,5 +16,8 @@ Steps to Reproduce: 1. 2. - + Does this issue occur when all extensions are disabled?: Yes/No + + + diff --git a/.github/actions/build-chat/.gitignore b/.github/actions/build-chat/.gitignore deleted file mode 100644 index db4c6d9b..00000000 --- a/.github/actions/build-chat/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/.github/actions/build-chat/action.yml b/.github/actions/build-chat/action.yml deleted file mode 100644 index 278475c9..00000000 --- a/.github/actions/build-chat/action.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: 'Build Chat' -description: 'Notify in chat about build results.' -author: 'Christof Marti' -inputs: - workflow_run_url: - description: 'Workflow run URL of the completed build.' - required: true -runs: - using: 'node12' - main: 'dist/main.js' diff --git a/.github/actions/build-chat/package.json b/.github/actions/build-chat/package.json deleted file mode 100644 index 156717a8..00000000 --- a/.github/actions/build-chat/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "build-chat", - "version": "0.0.0", - "author": "Microsoft Corporation", - "license": "MIT", - "description": "A GitHub action to create a Windows Package Manager manifest file.", - "main": "dist/main.js", - "scripts": { - "build": "tsc" - }, - "dependencies": { - "@actions/core": "^1.2.6", - "@octokit/rest": "^18.0.12", - "@slack/web-api": "^6.0.0", - "azure-storage": "^2.10.3", - "stream-buffers": "^3.0.2" - }, - "devDependencies": { - "@types/node": "^14.14.22", - "@types/stream-buffers": "^3.0.3", - "typescript": "^4.1.3" - } -} diff --git a/.github/actions/build-chat/src/main.ts b/.github/actions/build-chat/src/main.ts deleted file mode 100644 index 71e03585..00000000 --- a/.github/actions/build-chat/src/main.ts +++ /dev/null @@ -1,217 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as core from '@actions/core'; -import { Octokit, RestEndpointMethodTypes } from '@octokit/rest'; -import { WebClient } from '@slack/web-api'; -import * as storage from 'azure-storage'; -import { WritableStreamBuffer } from 'stream-buffers'; - -(async () => { - const actionUrl = core.getInput('workflow_run_url'); - const url = actionUrl || 'https://api.github.com/repos/microsoft/vscode/actions/runs/503514090'; - console.log(url); - const parts = url.split('/'); - const owner = parts[parts.length - 5]; - const repo = parts[parts.length - 4]; - const runId = parseInt(parts[parts.length - 1], 10); - if (actionUrl) { - await handleNotification(owner, repo, runId); - } else { - const results = await buildComplete(owner, repo, runId); - for (const message of [...results.logMessages, ...results.messages]) { - console.log(message); - } - } -})() - .then(null, console.error); - -const testChannels = ['bot-log', 'bot-test-log']; - -async function handleNotification(owner: string, repo: string, runId: number) { - - const results = await buildComplete(owner, repo, runId); - if (results.logMessages.length || results.messages.length) { - - const web = new WebClient(process.env.SLACK_TOKEN); - const memberships = await listAllMemberships(web); - const memberTestChannels = memberships.filter(m => testChannels.indexOf(m.name) !== -1); - - for (const message of results.logMessages) { - for (const testChannel of memberTestChannels) { - await web.chat.postMessage({ - text: message, - link_names: true, - channel: testChannel.id, - }); - } - } - for (const message of results.messages) { - for (const channel of memberships) { - await web.chat.postMessage({ - text: message, - link_names: true, - channel: channel.id, - }); - } - } - } -} - -async function buildComplete(owner: string, repo: string, runId: number) { - console.log(`buildComplete: https://github.com/${owner}/${repo}/actions/runs/${runId}`); - const auth = `token ${process.env.GITHUB_TOKEN}`; - const octokit = new Octokit({ auth }); - const buildResult = (await octokit.actions.getWorkflowRun({ - owner, - repo, - run_id: runId, - })).data; - if (buildResult.head_branch !== 'master' && !buildResult.head_branch?.startsWith('release/')) { - console.error('Private branch. Terminating.') - return { logMessages: [], messages: [] }; - } - - // const buildQuery = `${buildsApiUrl}?$top=10&maxTime=${buildResult.finishTime}&definitions=${buildResult.definition.id}&branchName=${buildResult.sourceBranch}&resultFilter=${results.join(',')}&api-version=5.0-preview.4`; - - const buildResults = (await octokit.actions.listWorkflowRuns({ - owner, - repo, - workflow_id: buildResult.workflow_id, - branch: buildResult.head_branch || undefined, - per_page: 5, // More returns 502s. - })).data.workflow_runs - .filter(run => run.status === 'completed'); - - const currentBuildIndex = buildResults.findIndex(build => build.id === buildResult.id); - if (currentBuildIndex === -1) { - console.error('Build not on first page. Terminating.') - console.error(buildResults.map(({ id, status, conclusion }) => ({ id, status, conclusion }))); - return { logMessages: [], messages: [] }; - } - const slicedResults = buildResults.slice(currentBuildIndex, currentBuildIndex + 2); - const builds = slicedResults - .map((build, i, array) => ({ - data: build, - previousSourceVersion: i < array.length - 1 ? array[i + 1].head_sha : undefined, - authors: [], - buildHtmlUrl: build.html_url, - changesHtmlUrl: '', - })); - const logMessages = builds.slice(0, 1) - .map(build => `Id: ${build.data.id} | Branch: ${build.data.head_branch} | Conclusion: ${build.data.conclusion} | Created: ${build.data.created_at} | Updated: ${build.data.updated_at}`); - const transitionedBuilds = builds.filter((build, i, array) => i < array.length - 1 && transitioned(build, array[i + 1])); - await Promise.all(transitionedBuilds - .map(async build => { - if (build.previousSourceVersion) { - const cmp = await compareCommits(octokit, owner, repo, build.previousSourceVersion, build.data.head_sha); - const commits = cmp.data.commits; - const authors = new Set([ - ...commits.map((c: any) => c.author.login), - ...commits.map((c: any) => c.committer.login), - ]); - authors.delete('web-flow'); // GitHub Web UI committer - build.authors = [...authors]; - build.changesHtmlUrl = `https://github.com/${owner}/${repo}/compare/${build.previousSourceVersion.substr(0, 7)}...${build.data.head_sha.substr(0, 7)}`; // Shorter than: cmp.data.html_url - } - })); - const vscode = repo === 'vscode'; - const name = vscode ? `VS Code ${buildResult.name} Build` : buildResult.name; - // TBD: `Requester: ${vstsToSlackUser(build.requester, build.degraded)}${pingBenForSmokeTests && releaseBuild && build.result === 'partiallySucceeded' ? ' | Ping: @bpasero' : ''}` - const accounts = await readAccounts(); - const githubAccountMap = githubToAccounts(accounts); - const messages = transitionedBuilds.map(build => `${name} -Result: ${build.data.conclusion} | Branch: ${build.data.head_branch} | Authors: ${githubToSlackUsers(githubAccountMap, build.authors, build.degraded).sort().join(', ') || `None (rebuild)`} -Build: ${build.buildHtmlUrl} -Changes: ${build.changesHtmlUrl}`); - return { logMessages, messages }; -} - -const conclusions = ['success', 'failure'] - -function transitioned(newer: Build, older: Build) { - const newerResult = newer.data.conclusion || 'success'; - const olderResult = older.data.conclusion || 'success'; - if (newerResult === olderResult) { - return false; - } - if (conclusions.indexOf(newerResult) > conclusions.indexOf(olderResult)) { - newer.degraded = true; - } - return true; -} - -async function compareCommits(octokit: Octokit, owner: string, repo: string, base: string, head: string) { - return octokit.repos.compareCommits({ owner, repo, base, head }); -} - -function githubToSlackUsers(githubToAccounts: Record, githubUsers: string[], at?: boolean) { - return githubUsers.map(g => githubToAccounts[g] ? `${at ? '@' : ''}${githubToAccounts[g].slack}` : g); -} - -interface Accounts { - github: string; - slack: string; - vsts: string; -} - -function githubToAccounts(accounts: Accounts[]) { - return accounts.reduce((m, e) => { - m[e.github] = e; - return m; - }, >{}); -} - -async function readAccounts() { - const connectionString = process.env.BUILD_CHAT_STORAGE_CONNECTION_STRING; - if (!connectionString) { - console.error('Connection string missing.'); - return []; - } - const buf = await readFile(connectionString, 'config', '/', 'accounts.json'); - return JSON.parse(buf.toString()) as Accounts[]; -} - -async function readFile(connectionString: string, share: string, directory: string, filename: string) { - return new Promise((resolve, reject) => { - const stream = new WritableStreamBuffer() - const fileService = storage.createFileService(connectionString); - fileService.getFileToStream(share, directory, filename, stream, err => { - if (err) { - reject(err); - } else { - const contents = stream.getContents(); - if (contents) { - resolve(contents); - } else { - reject(new Error('No content')); - } - } - }); - }); -} - -interface AllChannels { - channels: { - id: string; - name: string; - is_member: boolean; - }[]; -} - -async function listAllMemberships(web: WebClient) { - const groups = await web.conversations.list({ types: 'public_channel,private_channel' }) as unknown as AllChannels; - return groups.channels - .filter(c => c.is_member); -} - -interface Build { - data: RestEndpointMethodTypes['actions']['getWorkflowRun']['response']['data']; - previousSourceVersion: string | undefined; - authors: string[]; - buildHtmlUrl: string; - changesHtmlUrl: string; - degraded?: boolean; -} diff --git a/.github/actions/build-chat/tsconfig.json b/.github/actions/build-chat/tsconfig.json deleted file mode 100644 index f4889aab..00000000 --- a/.github/actions/build-chat/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es2017", - "strict": true, - "noUnusedLocals": true, - "resolveJsonModule": true, - "lib": [ - "es2017" - ], - "sourceMap": true, - "outDir": "./dist", - "rootDir": "./src", - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/.github/actions/build-chat/yarn.lock b/.github/actions/build-chat/yarn.lock deleted file mode 100644 index bc218523..00000000 --- a/.github/actions/build-chat/yarn.lock +++ /dev/null @@ -1,728 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@actions/core@^1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09" - integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA== - -"@octokit/auth-token@^2.4.4": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.4.tgz#ee31c69b01d0378c12fd3ffe406030f3d94d3b56" - integrity sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q== - dependencies: - "@octokit/types" "^6.0.0" - -"@octokit/core@^3.2.3": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.4.tgz#5791256057a962eca972e31818f02454897fd106" - integrity sha512-d9dTsqdePBqOn7aGkyRFe7pQpCXdibSJ5SFnrTr0axevObZrpz3qkWm7t/NjYv5a66z6vhfteriaq4FRz3e0Qg== - dependencies: - "@octokit/auth-token" "^2.4.4" - "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.4.12" - "@octokit/types" "^6.0.3" - before-after-hook "^2.1.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^6.0.1": - version "6.0.10" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.10.tgz#741ce1fa2f4fb77ce8ebe0c6eaf5ce63f565f8e8" - integrity sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q== - dependencies: - "@octokit/types" "^6.0.0" - is-plain-object "^5.0.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^4.5.8": - version "4.5.8" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.8.tgz#d42373633c3015d0eafce64a8ce196be167fdd9b" - integrity sha512-WnCtNXWOrupfPJgXe+vSmprZJUr0VIu14G58PMlkWGj3cH+KLZEfKMmbUQ6C3Wwx6fdhzVW1CD5RTnBdUHxhhA== - dependencies: - "@octokit/request" "^5.3.0" - "@octokit/types" "^6.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-3.0.0.tgz#f73d48af2d21bf4f97fbf38fae43b54699e0dbba" - integrity sha512-jOp1CVRw+OBJaZtG9QzZggvJXvyzgDXuW948SWsDiwmyDuCjeYCiF3TDD/qvhpF580RfP7iBIos4AVU6yhgMlA== - -"@octokit/plugin-paginate-rest@^2.6.2": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.8.0.tgz#2b41e12b494e895bf5fb5b12565d2c80a0ecc6ae" - integrity sha512-HtuEQ2AYE4YFEBQN0iHmMsIvVucd5RsnwJmRKIsfAg1/ZeoMaU+jXMnTAZqIUEmcVJA27LjHUm3f1hxf8Fpdxw== - dependencies: - "@octokit/types" "^6.4.0" - -"@octokit/plugin-request-log@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz#394d59ec734cd2f122431fbaf05099861ece3c44" - integrity sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg== - -"@octokit/plugin-rest-endpoint-methods@4.4.1": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.4.1.tgz#105cf93255432155de078c9efc33bd4e14d1cd63" - integrity sha512-+v5PcvrUcDeFXf8hv1gnNvNLdm4C0+2EiuWt9EatjjUmfriM1pTMM+r4j1lLHxeBQ9bVDmbywb11e3KjuavieA== - dependencies: - "@octokit/types" "^6.1.0" - deprecation "^2.3.1" - -"@octokit/request-error@^2.0.0": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.4.tgz#07dd5c0521d2ee975201274c472a127917741262" - integrity sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA== - dependencies: - "@octokit/types" "^6.0.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": - version "5.4.12" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.12.tgz#b04826fa934670c56b135a81447be2c1723a2ffc" - integrity sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg== - dependencies: - "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.0.0" - "@octokit/types" "^6.0.3" - deprecation "^2.0.0" - is-plain-object "^5.0.0" - node-fetch "^2.6.1" - once "^1.4.0" - universal-user-agent "^6.0.0" - -"@octokit/rest@^18.0.12": - version "18.0.12" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.0.12.tgz#278bd41358c56d87c201e787e8adc0cac132503a" - integrity sha512-hNRCZfKPpeaIjOVuNJzkEL6zacfZlBPV8vw8ReNeyUkVvbuCvvrrx8K8Gw2eyHHsmd4dPlAxIXIZ9oHhJfkJpw== - dependencies: - "@octokit/core" "^3.2.3" - "@octokit/plugin-paginate-rest" "^2.6.2" - "@octokit/plugin-request-log" "^1.0.2" - "@octokit/plugin-rest-endpoint-methods" "4.4.1" - -"@octokit/types@^6.0.0", "@octokit/types@^6.0.3", "@octokit/types@^6.1.0", "@octokit/types@^6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.4.0.tgz#f3f47be70bcdb3c26f2c2619f3dd0ced466a265c" - integrity sha512-1FEmuVppZE2zG0rBdQlviRz5cp0udyI63zyhBVPrm0FRNAsQkAXU7IYWQg1XvhChFut8YbFYN1usQpk54D6/4w== - dependencies: - "@octokit/openapi-types" "^3.0.0" - "@types/node" ">= 8" - -"@slack/logger@>=1.0.0 <3.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-2.0.0.tgz#6a4e1c755849bc0f66dac08a8be54ce790ec0e6b" - integrity sha512-OkIJpiU2fz6HOJujhlhfIGrc8hB4ibqtf7nnbJQDerG0BqwZCfmgtK5sWzZ0TkXVRBKD5MpLrTmCYyMxoMCgPw== - dependencies: - "@types/node" ">=8.9.0" - -"@slack/types@^1.7.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@slack/types/-/types-1.10.0.tgz#cbf7d83e1027f4cbfd13d6b429f120c7fb09127a" - integrity sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg== - -"@slack/web-api@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-6.0.0.tgz#14c65ed73c66a187e5f20e12c3898dfd8d5cbf7c" - integrity sha512-YD1wqWuzrYPf4RQyD7OnYS5lImUmNWn+G5V6Qt0N97fPYxqhT72YJtRdSnsTc3VkH5R5imKOhYxb+wqI9hiHnA== - dependencies: - "@slack/logger" ">=1.0.0 <3.0.0" - "@slack/types" "^1.7.0" - "@types/is-stream" "^1.1.0" - "@types/node" ">=12.0.0" - axios "^0.21.1" - eventemitter3 "^3.1.0" - form-data "^2.5.0" - is-stream "^1.1.0" - p-queue "^6.6.1" - p-retry "^4.0.0" - -"@types/is-stream@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/is-stream/-/is-stream-1.1.0.tgz#b84d7bb207a210f2af9bed431dc0fbe9c4143be1" - integrity sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@>= 8", "@types/node@>=12.0.0", "@types/node@>=8.9.0", "@types/node@^14.14.22": - version "14.14.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" - integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== - -"@types/retry@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/stream-buffers@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/stream-buffers/-/stream-buffers-3.0.3.tgz#34e565bf64e3e4bdeee23fd4aa58d4636014a02b" - integrity sha512-NeFeX7YfFZDYsCfbuaOmFQ0OjSmHreKBpp7MQ4alWQBHeh2USLsj7qyMyn9t82kjqIX516CR/5SRHnARduRtbQ== - dependencies: - "@types/node" "*" - -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -azure-storage@^2.10.3: - version "2.10.3" - resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.10.3.tgz#c5966bf929d87587d78f6847040ea9a4b1d4a50a" - integrity sha512-IGLs5Xj6kO8Ii90KerQrrwuJKexLgSwYC4oLWmc11mzKe7Jt2E5IVg+ZQ8K53YWZACtVTMBNO3iGuA+4ipjJxQ== - dependencies: - browserify-mime "~1.2.9" - extend "^3.0.2" - json-edm-parser "0.1.2" - md5.js "1.3.4" - readable-stream "~2.0.0" - request "^2.86.0" - underscore "~1.8.3" - uuid "^3.0.0" - validator "~9.4.1" - xml2js "0.2.8" - xmlbuilder "^9.0.7" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -before-after-hook@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" - integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== - -browserify-mime@~1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/browserify-mime/-/browserify-mime-1.2.9.tgz#aeb1af28de6c0d7a6a2ce40adb68ff18422af31f" - integrity sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8= - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -deprecation@^2.0.0, deprecation@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -extend@^3.0.2, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -follow-redirects@^1.10.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-edm-parser@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/json-edm-parser/-/json-edm-parser-0.1.2.tgz#1e60b0fef1bc0af67bc0d146dfdde5486cd615b4" - integrity sha1-HmCw/vG8CvZ7wNFG393lSGzWFbQ= - dependencies: - jsonparse "~1.2.0" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsonparse@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" - integrity sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -md5.js@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -mime-db@1.45.0: - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== - dependencies: - mime-db "1.45.0" - -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-queue@^6.6.1: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-retry@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.2.0.tgz#ea9066c6b44f23cab4cd42f6147cdbbc6604da5d" - integrity sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.12.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -request@^2.86.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@0.5.x: - version "0.5.8" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" - integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stream-buffers@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.2.tgz#5249005a8d5c2d00b3a32e6e0a6ea209dc4f3521" - integrity sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ== - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -typescript@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" - integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== - -underscore@~1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= - -universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.0.0, uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -validator@~9.4.1: - version "9.4.1" - resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663" - integrity sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xml2js@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.8.tgz#9b81690931631ff09d1957549faf54f4f980b3c2" - integrity sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I= - dependencies: - sax "0.5.x" - -xmlbuilder@^9.0.7: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= diff --git a/.github/commands.json b/.github/commands.json index 7563a392..de0643d5 100644 --- a/.github/commands.json +++ b/.github/commands.json @@ -93,7 +93,7 @@ "addLabel": "z-author-verified", "removeLabel": "author-verification-requested", "requireLabel": "author-verification-requested", - "disallowLabel": "awaiting-insiders-release" + "disallowLabel": "unreleased" }, { "type": "comment", diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 45f9ee8f..19314029 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,7 +2,7 @@ * Read our Pull Request guidelines: https://github.com/microsoft/vscode/wiki/How-to-Contribute#pull-requests * Associate an issue with the Pull Request. -* Ensure that the code is up-to-date with the `master` branch. +* Ensure that the code is up-to-date with the `main` branch. * Include a description of the proposed changes and how to test them. --> diff --git a/.github/workflows/author-verified.yml b/.github/workflows/author-verified.yml index 33b4b607..2a24e793 100644 --- a/.github/workflows/author-verified.yml +++ b/.github/workflows/author-verified.yml @@ -1,9 +1,5 @@ name: Author Verified on: - repository_dispatch: - types: [trigger-author-verified] - schedule: - - cron: 20 14 * * * # 4:20pm Zurich issues: types: [closed] @@ -13,28 +9,22 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Actions - if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'author-verification-requested') + if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released') uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions - if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'author-verification-requested') + if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released') run: npm install --production --prefix ./actions - - name: Checkout Repo - if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'author-verification-requested') - uses: actions/checkout@v2 - with: - path: ./repo - fetch-depth: 0 - name: Run Author Verified - if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'author-verification-requested') + if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released') uses: ./actions/author-verified with: appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - requestVerificationComment: "This bug has been fixed in to the latest release of [VS Code Insiders](https://code.visualstudio.com/insiders/)!\n\n@${author}, you can help us out by commenting `/verified` if things are now working as expected.\n\nIf things still don't seem right, please ensure you're on version ${commit} of Insiders (today's or later - you can use `Help: About` in the command palette to check), and leave a comment letting us know what isn't working as expected.\n\nHappy Coding!" - pendingReleaseLabel: awaiting-insiders-release + requestVerificationComment: "This bug has been fixed in the latest release of [VS Code Insiders](https://code.visualstudio.com/insiders/)!\n\n@${author}, you can help us out by commenting `/verified` if things are now working as expected.\n\nIf things still don't seem right, please ensure you're on version ${commit} of Insiders (today's or later - you can use `Help: About` in the command palette to check), and leave a comment letting us know what isn't working as expected.\n\nHappy Coding!" + releasedLabel: insiders-released verifiedLabel: verified authorVerificationRequestedLabel: author-verification-requested diff --git a/.github/workflows/build-chat.yml b/.github/workflows/build-chat.yml index e8a6797b..03f3bd42 100644 --- a/.github/workflows/build-chat.yml +++ b/.github/workflows/build-chat.yml @@ -7,30 +7,29 @@ on: types: - completed branches: - - master + - main - release/* jobs: main: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node.js 12.x - uses: actions/setup-node@v1.4.4 - with: - node-version: "12.x" - - - name: Build - run: yarn install && yarn run build - working-directory: .github/actions/build-chat - - - name: Build Chat - uses: ./.github/actions/build-chat - with: - workflow_run_url: ${{ github.event.workflow_run.url }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }} - BUILD_CHAT_STORAGE_CONNECTION_STRING: ${{ secrets.BUILD_CHAT_STORAGE_CONNECTION_STRING }} + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: "microsoft/vscode-github-triage-actions" + path: ./actions + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Install Additional Dependencies + # Pulls in a bunch of other packages that arent needed for the rest of the actions + run: npm install @azure/storage-blob@12.1.1 + - name: Build Chat + uses: ./actions/build-chat + with: + token: ${{ secrets.GITHUB_TOKEN }} + slack_token: ${{ secrets.SLACK_TOKEN }} + storage_connection_string: ${{ secrets.BUILD_CHAT_STORAGE_CONNECTION_STRING }} + workflow_run_url: ${{ github.event.workflow_run.url }} + notification_channel: build + log_channel: bot-log diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73acbb00..f1324b59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,11 +3,11 @@ name: CI on: push: branches: - - master + - main - release/* pull_request: branches: - - master + - main - release/* jobs: @@ -247,6 +247,9 @@ jobs: - name: Run Monaco Editor Checks run: yarn monaco-compile-check + - name: Run Trusted Types Checks + run: yarn tsec-compile-check + - name: Editor Distro & ESM Bundle run: yarn gulp editor-esm-bundle diff --git a/.github/workflows/deep-classifier-monitor.yml b/.github/workflows/deep-classifier-monitor.yml index e8ad08aa..106266d0 100644 --- a/.github/workflows/deep-classifier-monitor.yml +++ b/.github/workflows/deep-classifier-monitor.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml index af42751b..19a8a705 100644 --- a/.github/workflows/deep-classifier-runner.yml +++ b/.github/workflows/deep-classifier-runner.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions run: npm install --production --prefix ./actions @@ -38,7 +38,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install --upgrade numpy scipy scikit-learn joblib nltk simpletransformers torch torchvision + pip install --upgrade numpy==1.20.0 scipy==1.6.0 scikit-learn==0.24.1 joblib==1.0.0 nltk==3.5 simpletransformers==0.51.16 torch==1.7.1 torchvision==0.8.2 - name: "Run Classifier: Generator" run: python ./actions/classifier-deep/apply/generate-labels/main.py - name: "Run Classifier: Labeler" diff --git a/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml index 837e5696..78a9b7f9 100644 --- a/.github/workflows/deep-classifier-scraper.yml +++ b/.github/workflows/deep-classifier-scraper.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/devcontainer-cache.yml b/.github/workflows/devcontainer-cache.yml index a250b56c..4670186b 100644 --- a/.github/workflows/devcontainer-cache.yml +++ b/.github/workflows/devcontainer-cache.yml @@ -2,9 +2,9 @@ name: VS Code Repo Dev Container Cache Image Generation on: push: - # Currently doing this for master, but could be done for PRs as well + # Currently doing this for main, but could be done for PRs as well branches: - - "master" + - "main" # Only updates to these files result in changes to installed packages, so skip otherwise paths: @@ -35,6 +35,6 @@ jobs: az acr login --name $ACR_REGISTRY_NAME GIT_BRANCH=$(echo "${{ github.ref }}" | grep -oP 'refs/(heads|tags)/\K(.+)') - if [ "$GIT_BRANCH" == "" ]; then GIT_BRANCH=master; fi + if [ "$GIT_BRANCH" == "" ]; then GIT_BRANCH=main; fi .devcontainer/cache/build-cache-image.sh "${{ secrets.CONTAINER_IMAGE_REGISTRY }}/public/vscode/devcontainers/repos/microsoft/vscode" "${GIT_BRANCH}" diff --git a/.github/workflows/english-please.yml b/.github/workflows/english-please.yml index 70ae98f4..a11a9a35 100644 --- a/.github/workflows/english-please.yml +++ b/.github/workflows/english-please.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions if: contains(github.event.issue.labels.*.name, '*english-please') diff --git a/.github/workflows/feature-request.yml b/.github/workflows/feature-request.yml index 22307714..bce7976b 100644 --- a/.github/workflows/feature-request.yml +++ b/.github/workflows/feature-request.yml @@ -18,7 +18,7 @@ jobs: with: repository: "microsoft/vscode-github-triage-actions" path: ./actions - ref: v42 + ref: stable - name: Install Actions if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'feature-request') run: npm install --production --prefix ./actions diff --git a/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml index bc4b6b55..34148088 100644 --- a/.github/workflows/latest-release-monitor.yml +++ b/.github/workflows/latest-release-monitor.yml @@ -14,7 +14,7 @@ jobs: with: repository: "microsoft/vscode-github-triage-actions" path: ./actions - ref: v42 + ref: stable - name: Install Actions run: npm install --production --prefix ./actions - name: Install Storage Module diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index 3cdf09ba..d0840daf 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -14,7 +14,7 @@ jobs: with: repository: "microsoft/vscode-github-triage-actions" path: ./actions - ref: v42 + ref: stable - name: Install Actions run: npm install --production --prefix ./actions - name: Run Locker diff --git a/.github/workflows/needs-more-info-closer.yml b/.github/workflows/needs-more-info-closer.yml index d1f9a824..bff4ce82 100644 --- a/.github/workflows/needs-more-info-closer.yml +++ b/.github/workflows/needs-more-info-closer.yml @@ -14,7 +14,7 @@ jobs: with: repository: "microsoft/vscode-github-triage-actions" path: ./actions - ref: v42 + ref: stable - name: Install Actions run: npm install --production --prefix ./actions - name: Run Needs More Info Closer diff --git a/.github/workflows/no-yarn-lock-changes.yml b/.github/workflows/no-yarn-lock-changes.yml new file mode 100644 index 00000000..7bceb299 --- /dev/null +++ b/.github/workflows/no-yarn-lock-changes.yml @@ -0,0 +1,14 @@ +name: Prevent yarn.lock changes in PRs +on: [pull_request] + +jobs: + main: + name: Prevent yarn.lock changes in PRs + runs-on: ubuntu-latest + steps: + - id: file_changes + uses: trilom/file-changes-action@v1.2.4 + - name: Check for yarn.lock changes + run: | + cat $HOME/files.json | jq -e '.[] | test("yarn\\.lock$") | not' \ + || (echo "Changes to yarn.lock files aren't allowed in PRs." && exit 1) diff --git a/.github/workflows/commands.yml b/.github/workflows/on-comment.yml similarity index 63% rename from .github/workflows/commands.yml rename to .github/workflows/on-comment.yml index f189a10a..8d661336 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/on-comment.yml @@ -1,4 +1,4 @@ -name: Commands +name: On Comment on: issue_comment: types: [created] @@ -13,7 +13,7 @@ jobs: with: repository: "microsoft/vscode-github-triage-actions" path: ./actions - ref: v42 + ref: stable - name: Install Actions run: npm install --production --prefix ./actions - name: Run Commands @@ -22,3 +22,10 @@ jobs: appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} config-path: commands + - name: "Run Release Pipeline Labeler" + uses: ./actions/release-pipeline + with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + notYetReleasedLabel: unreleased + insidersReleasedLabel: insiders-released diff --git a/.github/workflows/on-label.yml b/.github/workflows/on-label.yml index 86bbecb6..9d62de8e 100644 --- a/.github/workflows/on-label.yml +++ b/.github/workflows/on-label.yml @@ -11,29 +11,25 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions run: npm install --production --prefix ./actions # source of truth in ./author-verified.yml - - name: Checkout Repo - if: contains(github.event.issue.labels.*.name, 'author-verification-requested') - uses: actions/checkout@v2 - with: - path: ./repo - fetch-depth: 0 - name: Run Author Verified - if: contains(github.event.issue.labels.*.name, 'author-verification-requested') + if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released') uses: ./actions/author-verified with: appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} - requestVerificationComment: "This bug has been fixed in to the latest release of [VS Code Insiders](https://code.visualstudio.com/insiders/)!\n\n@${author}, you can help us out by confirming things are working as expected in the latest Insiders release. If things look good, please leave a comment with the text `/verified` to let us know. If not, please ensure you're on version ${commit} of Insiders (today's or later - you can use `Help: About` in the command palette to check), and leave a comment letting us know what isn't working as expected.\n\nHappy Coding!" - pendingReleaseLabel: awaiting-insiders-release + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + requestVerificationComment: "This bug has been fixed in the latest release of [VS Code Insiders](https://code.visualstudio.com/insiders/)!\n\n@${author}, you can help us out by commenting `/verified` if things are now working as expected.\n\nIf things still don't seem right, please ensure you're on version ${commit} of Insiders (today's or later - you can use `Help: About` in the command palette to check), and leave a comment letting us know what isn't working as expected.\n\nHappy Coding!" + releasedLabel: insiders-released verifiedLabel: verified authorVerificationRequestedLabel: author-verification-requested - # source of truth in ./commands.yml + + # also make changes in ./on-comment.yml - name: Run Commands uses: ./actions/commands with: diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index c500a0e2..e5dc42ac 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/release-pipeline-labeler.yml b/.github/workflows/release-pipeline-labeler.yml index edb01fa5..0124667d 100644 --- a/.github/workflows/release-pipeline-labeler.yml +++ b/.github/workflows/release-pipeline-labeler.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: "microsoft/vscode-github-triage-actions" - ref: v42 + ref: stable path: ./actions - name: Checkout Repo if: github.event_name != 'issues' diff --git a/.github/workflows/rich-navigation.yml b/.github/workflows/rich-navigation.yml index aee0796f..71824cab 100644 --- a/.github/workflows/rich-navigation.yml +++ b/.github/workflows/rich-navigation.yml @@ -3,7 +3,7 @@ on: pull_request: push: branches: - - master + - main jobs: richnav: diff --git a/.github/workflows/test-plan-item-validator.yml b/.github/workflows/test-plan-item-validator.yml index 72c21346..3d381236 100644 --- a/.github/workflows/test-plan-item-validator.yml +++ b/.github/workflows/test-plan-item-validator.yml @@ -14,7 +14,7 @@ jobs: with: repository: "microsoft/vscode-github-triage-actions" path: ./actions - ref: v42 + ref: stable - name: Install Actions if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item') run: npm install --production --prefix ./actions diff --git a/.mailmap b/.mailmap index d54a71fd..d4542abf 100644 --- a/.mailmap +++ b/.mailmap @@ -1,2 +1,6 @@ Eric Amodio Eric Amodio +Eric Amodio Eric Amodio Daniel Imms Daniel Imms +Tanha Kabir Tanha Kabir +Raymond Zhao +Tyler Leonhardt Tyler Leonhardt diff --git a/.vscode/launch.json b/.vscode/launch.json index 11c578b9..b1db49c2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -110,7 +110,8 @@ // "${workspaceFolder}", // Uncomment for running out of sources. "${workspaceFolder}/extensions/vscode-api-tests/testWorkspace", "--extensionDevelopmentPath=${workspaceFolder}/extensions/vscode-api-tests", - "--extensionTestsPath=${workspaceFolder}/extensions/vscode-api-tests/out/singlefolder-tests" + "--extensionTestsPath=${workspaceFolder}/extensions/vscode-api-tests/out/singlefolder-tests", + "--disable-extensions" ], "outFiles": [ "${workspaceFolder}/out/**/*.js" diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues index 36ac402d..c0154336 100644 --- a/.vscode/notebooks/api.github-issues +++ b/.vscode/notebooks/api.github-issues @@ -3,36 +3,1329 @@ "kind": 1, "language": "markdown", "value": "#### Config", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"January 2021\"", - "editable": true + "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"February 2021\"", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### Finalization", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repo $milestone label:api-finalization", - "editable": true + "editable": true, + "outputs": [ + { + "mime": "text/markdown", + "value": "- [#88309](https://github.com/microsoft/vscode/issues/88309 \"Authentication Provider API\") Authentication Provider API [api-finalization, authentication, feature-request, settings-sync]- [@RMacfarlane](https://github.com/RMacfarlane \"Issue 88309 is assigned to RMacfarlane\")\n\n" + }, + { + "mime": "x-application/github-issues", + "value": [ + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/88309", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/88309/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/88309/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/88309/events", + "html_url": "https://github.com/microsoft/vscode/issues/88309", + "id": 547141160, + "node_id": "MDU6SXNzdWU1NDcxNDExNjA=", + "number": 88309, + "title": "Authentication Provider API", + "user": { + "login": "RMacfarlane", + "id": 3672607, + "node_id": "MDQ6VXNlcjM2NzI2MDc=", + "avatar_url": "https://avatars.githubusercontent.com/u/3672607?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/RMacfarlane", + "html_url": "https://github.com/RMacfarlane", + "followers_url": "https://api.github.com/users/RMacfarlane/followers", + "following_url": "https://api.github.com/users/RMacfarlane/following{/other_user}", + "gists_url": "https://api.github.com/users/RMacfarlane/gists{/gist_id}", + "starred_url": "https://api.github.com/users/RMacfarlane/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/RMacfarlane/subscriptions", + "organizations_url": "https://api.github.com/users/RMacfarlane/orgs", + "repos_url": "https://api.github.com/users/RMacfarlane/repos", + "events_url": "https://api.github.com/users/RMacfarlane/events{/privacy}", + "received_events_url": "https://api.github.com/users/RMacfarlane/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 974714207, + "node_id": "MDU6TGFiZWw5NzQ3MTQyMDc=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-finalization", + "name": "api-finalization", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 1702048079, + "node_id": "MDU6TGFiZWwxNzAyMDQ4MDc5", + "url": "https://api.github.com/repos/microsoft/vscode/labels/authentication", + "name": "authentication", + "color": "c5def5", + "default": false, + "description": "Authentication issues" + }, + { + "id": 272689392, + "node_id": "MDU6TGFiZWwyNzI2ODkzOTI=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/feature-request", + "name": "feature-request", + "color": "dcdcdc", + "default": false, + "description": "Request for new features or functionality" + }, + { + "id": 1684021718, + "node_id": "MDU6TGFiZWwxNjg0MDIxNzE4", + "url": "https://api.github.com/repos/microsoft/vscode/labels/settings-sync", + "name": "settings-sync", + "color": "1d76db", + "default": false, + "description": "" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "RMacfarlane", + "id": 3672607, + "node_id": "MDQ6VXNlcjM2NzI2MDc=", + "avatar_url": "https://avatars.githubusercontent.com/u/3672607?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/RMacfarlane", + "html_url": "https://github.com/RMacfarlane", + "followers_url": "https://api.github.com/users/RMacfarlane/followers", + "following_url": "https://api.github.com/users/RMacfarlane/following{/other_user}", + "gists_url": "https://api.github.com/users/RMacfarlane/gists{/gist_id}", + "starred_url": "https://api.github.com/users/RMacfarlane/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/RMacfarlane/subscriptions", + "organizations_url": "https://api.github.com/users/RMacfarlane/orgs", + "repos_url": "https://api.github.com/users/RMacfarlane/repos", + "events_url": "https://api.github.com/users/RMacfarlane/events{/privacy}", + "received_events_url": "https://api.github.com/users/RMacfarlane/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "RMacfarlane", + "id": 3672607, + "node_id": "MDQ6VXNlcjM2NzI2MDc=", + "avatar_url": "https://avatars.githubusercontent.com/u/3672607?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/RMacfarlane", + "html_url": "https://github.com/RMacfarlane", + "followers_url": "https://api.github.com/users/RMacfarlane/followers", + "following_url": "https://api.github.com/users/RMacfarlane/following{/other_user}", + "gists_url": "https://api.github.com/users/RMacfarlane/gists{/gist_id}", + "starred_url": "https://api.github.com/users/RMacfarlane/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/RMacfarlane/subscriptions", + "organizations_url": "https://api.github.com/users/RMacfarlane/orgs", + "repos_url": "https://api.github.com/users/RMacfarlane/repos", + "events_url": "https://api.github.com/users/RMacfarlane/events{/privacy}", + "received_events_url": "https://api.github.com/users/RMacfarlane/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 23, + "created_at": "2020-01-08T22:31:35Z", + "updated_at": "2021-02-10T20:41:11Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "### Problem\r\n\r\nThere are currently some extensions that attempt to provide authentication abilities that can be reused by other extensions. (An example being the Azure Account extension). Now that we've begun working on login for settings sync, it's worth revisiting if authentication should be a first-class concept in VS Code. By exposing an API to contribute an authentication flow\r\n\r\n- the core of VSCode can potentially leverage authentication\r\n- other extensions can leverage authentication\r\n- UI for account management could be centralized\r\n\r\n### Proposal\r\n\r\nI propose introducing a concept of an \"AuthenticationProvider\". Such a provider implements methods for logging in and logging out of a specified account, and exposes a list of accounts that are currently available with an event listener for changes to these. This abstracts away refreshing tokens from consumers - the AuthenticationProvider extension can manage refreshing in the background and fire an event when the accessToken has been changed.\r\n\r\n```ts\r\nexport interface Account {\r\n\treadonly id: string;\r\n\treadonly accessToken: string;\r\n\treadonly displayName: string;\r\n}\r\n\r\nexport interface AuthenticationProvider {\r\n\treadonly id: string; // perhaps \"type\"? Would be something like \"GitHub\", \"MSA\", etc.\r\n\treadonly displayName: string;\r\n\r\n\taccounts: ReadonlyArray;\r\n\tonDidChangeAccounts: Event>;\r\n\r\n\tlogin(): Promise;\r\n\tlogout(accountId: string): Promise;\r\n}\r\n\r\nexport namespace authentication {\r\n\texport function registerAuthenticationProvider(provider: AuthenticationProvider): Disposable;\r\n\texport const authenticationProviders: ReadonlyArray;\r\n}\r\n```\r\n\r\nConsumers would need to know the id of the provider they're looking for. For example, the settings sync code would look for an \"MSA\" provider since this is what the setting sync backend currently needs.\r\n\r\nSince the authentication provider extension would be activated in each VS Code window, the extension would be responsible for synchronizing state across instances. By default, such extensions would have [\"ui\", \"workspace\"] extensionKind, so that they can store and read credentials on the local machine in both the desktop and web case.", + "performed_via_github_app": null, + "score": 1 + } + ] + } + ] }, { "kind": 1, "language": "markdown", "value": "### Proposals", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repo $milestone is:open label:api-proposal ", - "editable": true + "editable": true, + "outputs": [ + { + "mime": "text/markdown", + "value": "- [#115631](https://github.com/microsoft/vscode/issues/115631 \"Provide a way for custom editors to process untitled files without relying on textDocument\") Provide a way for custom editors to process untitled files without relying on textDocument [api-proposal, custom-editors, notebook]- [@lramos15](https://github.com/lramos15 \"Issue 115631 is assigned to lramos15\")\n\n- [#115626](https://github.com/microsoft/vscode/issues/115626 \"Microsoft Auth Provider should support overriding client id and tenant id\") Microsoft Auth Provider should support overriding client id and tenant id [api-proposal, authentication]- [@TylerLeonhardt](https://github.com/TylerLeonhardt \"Issue 115626 is assigned to TylerLeonhardt\")\n\n- [#115616](https://github.com/microsoft/vscode/issues/115616 \"Provide extension API to exclude ports from forwarding\") Provide extension API to exclude ports from forwarding [api, api-proposal, feature-request, remote-explorer]\n- [#114123](https://github.com/microsoft/vscode/issues/114123 \"Resolve the conflict run button in editor context menu\") Resolve the conflict run button in editor context menu [api-proposal, feature-request, menus]- [@jrieken](https://github.com/jrieken \"Issue 114123 is assigned to jrieken\")\n\n- [#109277](https://github.com/microsoft/vscode/issues/109277 \"Let extensions hook into url opening\") Let extensions hook into url opening [api, api-proposal, under-discussion]- [@mjbvz](https://github.com/mjbvz \"Issue 109277 is assigned to mjbvz\")\n\n- [#107467](https://github.com/microsoft/vscode/issues/107467 \"Testing in VS Code\") Testing in VS Code [api-proposal, plan-item, under-discussion]- [@connor4312](https://github.com/connor4312 \"Issue 107467 is assigned to connor4312\")\n\n- [#105690](https://github.com/microsoft/vscode/issues/105690 \"Extension API for Inline Values\") Extension API for Inline Values [api, api-proposal, debug, feature-request]- [@weinand](https://github.com/weinand \"Issue 105690 is assigned to weinand\")\n\n" + }, + { + "mime": "x-application/github-issues", + "value": [ + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/115631", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/115631/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/115631/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/115631/events", + "html_url": "https://github.com/microsoft/vscode/issues/115631", + "id": 799606785, + "node_id": "MDU6SXNzdWU3OTk2MDY3ODU=", + "number": 115631, + "title": "Provide a way for custom editors to process untitled files without relying on textDocument", + "user": { + "login": "lramos15", + "id": 4544166, + "node_id": "MDQ6VXNlcjQ1NDQxNjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4544166?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/lramos15", + "html_url": "https://github.com/lramos15", + "followers_url": "https://api.github.com/users/lramos15/followers", + "following_url": "https://api.github.com/users/lramos15/following{/other_user}", + "gists_url": "https://api.github.com/users/lramos15/gists{/gist_id}", + "starred_url": "https://api.github.com/users/lramos15/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/lramos15/subscriptions", + "organizations_url": "https://api.github.com/users/lramos15/orgs", + "repos_url": "https://api.github.com/users/lramos15/repos", + "events_url": "https://api.github.com/users/lramos15/events{/privacy}", + "received_events_url": "https://api.github.com/users/lramos15/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 1713330180, + "node_id": "MDU6TGFiZWwxNzEzMzMwMTgw", + "url": "https://api.github.com/repos/microsoft/vscode/labels/custom-editors", + "name": "custom-editors", + "color": "c5def5", + "default": false, + "description": "Custom editor API (webview based editors)" + }, + { + "id": 1839857516, + "node_id": "MDU6TGFiZWwxODM5ODU3NTE2", + "url": "https://api.github.com/repos/microsoft/vscode/labels/notebook", + "name": "notebook", + "color": "c5def5", + "default": false, + "description": "" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "lramos15", + "id": 4544166, + "node_id": "MDQ6VXNlcjQ1NDQxNjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4544166?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/lramos15", + "html_url": "https://github.com/lramos15", + "followers_url": "https://api.github.com/users/lramos15/followers", + "following_url": "https://api.github.com/users/lramos15/following{/other_user}", + "gists_url": "https://api.github.com/users/lramos15/gists{/gist_id}", + "starred_url": "https://api.github.com/users/lramos15/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/lramos15/subscriptions", + "organizations_url": "https://api.github.com/users/lramos15/orgs", + "repos_url": "https://api.github.com/users/lramos15/repos", + "events_url": "https://api.github.com/users/lramos15/events{/privacy}", + "received_events_url": "https://api.github.com/users/lramos15/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "lramos15", + "id": 4544166, + "node_id": "MDQ6VXNlcjQ1NDQxNjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4544166?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/lramos15", + "html_url": "https://github.com/lramos15", + "followers_url": "https://api.github.com/users/lramos15/followers", + "following_url": "https://api.github.com/users/lramos15/following{/other_user}", + "gists_url": "https://api.github.com/users/lramos15/gists{/gist_id}", + "starred_url": "https://api.github.com/users/lramos15/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/lramos15/subscriptions", + "organizations_url": "https://api.github.com/users/lramos15/orgs", + "repos_url": "https://api.github.com/users/lramos15/repos", + "events_url": "https://api.github.com/users/lramos15/events{/privacy}", + "received_events_url": "https://api.github.com/users/lramos15/received_events", + "type": "User", + "site_admin": false + }, + { + "login": "mjbvz", + "id": 12821956, + "node_id": "MDQ6VXNlcjEyODIxOTU2", + "avatar_url": "https://avatars.githubusercontent.com/u/12821956?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mjbvz", + "html_url": "https://github.com/mjbvz", + "followers_url": "https://api.github.com/users/mjbvz/followers", + "following_url": "https://api.github.com/users/mjbvz/following{/other_user}", + "gists_url": "https://api.github.com/users/mjbvz/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mjbvz/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mjbvz/subscriptions", + "organizations_url": "https://api.github.com/users/mjbvz/orgs", + "repos_url": "https://api.github.com/users/mjbvz/repos", + "events_url": "https://api.github.com/users/mjbvz/events{/privacy}", + "received_events_url": "https://api.github.com/users/mjbvz/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 1, + "created_at": "2021-02-02T19:29:05Z", + "updated_at": "2021-02-02T21:58:36Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "Currently the \"Reopen with\" experience for untitled files and custom binary editors needs better support. See #114711. After discussion in the API call the best proposal seems to be placing the untitled file data in the OpenEditor / OpenNotebook context. There interface would be modified as shown:\r\n```ts\r\n\t/**\r\n\t * Additional information about the opening custom document.\r\n\t */\r\n\tinterface CustomDocumentOpenContext {\r\n\t\t/**\r\n\t\t * The id of the backup to restore the document from or `undefined` if there is no backup.\r\n\t\t *\r\n\t\t * If this is provided, your extension should restore the editor from the backup instead of reading the file\r\n\t\t * from the user's workspace.\r\n\t\t */\r\n\t\treadonly backupId?: string;\r\n\t\t/**\r\n\t\t * If the URI is an untitled file, this will be populated with the byte data of that file\r\n\t\t *\r\n\t\t * If this is provided, your extension should utilize this byte data rather than executing fs APIs on the URI passed in\r\n\t\t */\r\n\t\treadonly untitledDocumentData?: Uint8Array;\r\n\t}\r\n\r\n\tinterface NotebookDocumentOpenContext {\r\n\t\treadonly backupId?: string;\r\n\t\treadonly untitledDocumentData?: Uint8Array;\r\n\t}\r\n```\r\nThe extension other would then not be required to resolve the URI to a text document (which would have been disposed of). ", + "performed_via_github_app": null, + "score": 1 + }, + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/115626", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/115626/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/115626/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/115626/events", + "html_url": "https://github.com/microsoft/vscode/issues/115626", + "id": 799566516, + "node_id": "MDU6SXNzdWU3OTk1NjY1MTY=", + "number": 115626, + "title": "Microsoft Auth Provider should support overriding client id and tenant id", + "user": { + "login": "TylerLeonhardt", + "id": 2644648, + "node_id": "MDQ6VXNlcjI2NDQ2NDg=", + "avatar_url": "https://avatars.githubusercontent.com/u/2644648?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/TylerLeonhardt", + "html_url": "https://github.com/TylerLeonhardt", + "followers_url": "https://api.github.com/users/TylerLeonhardt/followers", + "following_url": "https://api.github.com/users/TylerLeonhardt/following{/other_user}", + "gists_url": "https://api.github.com/users/TylerLeonhardt/gists{/gist_id}", + "starred_url": "https://api.github.com/users/TylerLeonhardt/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/TylerLeonhardt/subscriptions", + "organizations_url": "https://api.github.com/users/TylerLeonhardt/orgs", + "repos_url": "https://api.github.com/users/TylerLeonhardt/repos", + "events_url": "https://api.github.com/users/TylerLeonhardt/events{/privacy}", + "received_events_url": "https://api.github.com/users/TylerLeonhardt/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 1702048079, + "node_id": "MDU6TGFiZWwxNzAyMDQ4MDc5", + "url": "https://api.github.com/repos/microsoft/vscode/labels/authentication", + "name": "authentication", + "color": "c5def5", + "default": false, + "description": "Authentication issues" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "TylerLeonhardt", + "id": 2644648, + "node_id": "MDQ6VXNlcjI2NDQ2NDg=", + "avatar_url": "https://avatars.githubusercontent.com/u/2644648?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/TylerLeonhardt", + "html_url": "https://github.com/TylerLeonhardt", + "followers_url": "https://api.github.com/users/TylerLeonhardt/followers", + "following_url": "https://api.github.com/users/TylerLeonhardt/following{/other_user}", + "gists_url": "https://api.github.com/users/TylerLeonhardt/gists{/gist_id}", + "starred_url": "https://api.github.com/users/TylerLeonhardt/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/TylerLeonhardt/subscriptions", + "organizations_url": "https://api.github.com/users/TylerLeonhardt/orgs", + "repos_url": "https://api.github.com/users/TylerLeonhardt/repos", + "events_url": "https://api.github.com/users/TylerLeonhardt/events{/privacy}", + "received_events_url": "https://api.github.com/users/TylerLeonhardt/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "TylerLeonhardt", + "id": 2644648, + "node_id": "MDQ6VXNlcjI2NDQ2NDg=", + "avatar_url": "https://avatars.githubusercontent.com/u/2644648?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/TylerLeonhardt", + "html_url": "https://github.com/TylerLeonhardt", + "followers_url": "https://api.github.com/users/TylerLeonhardt/followers", + "following_url": "https://api.github.com/users/TylerLeonhardt/following{/other_user}", + "gists_url": "https://api.github.com/users/TylerLeonhardt/gists{/gist_id}", + "starred_url": "https://api.github.com/users/TylerLeonhardt/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/TylerLeonhardt/subscriptions", + "organizations_url": "https://api.github.com/users/TylerLeonhardt/orgs", + "repos_url": "https://api.github.com/users/TylerLeonhardt/repos", + "events_url": "https://api.github.com/users/TylerLeonhardt/events{/privacy}", + "received_events_url": "https://api.github.com/users/TylerLeonhardt/received_events", + "type": "User", + "site_admin": false + }, + { + "login": "RMacfarlane", + "id": 3672607, + "node_id": "MDQ6VXNlcjM2NzI2MDc=", + "avatar_url": "https://avatars.githubusercontent.com/u/3672607?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/RMacfarlane", + "html_url": "https://github.com/RMacfarlane", + "followers_url": "https://api.github.com/users/RMacfarlane/followers", + "following_url": "https://api.github.com/users/RMacfarlane/following{/other_user}", + "gists_url": "https://api.github.com/users/RMacfarlane/gists{/gist_id}", + "starred_url": "https://api.github.com/users/RMacfarlane/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/RMacfarlane/subscriptions", + "organizations_url": "https://api.github.com/users/RMacfarlane/orgs", + "repos_url": "https://api.github.com/users/RMacfarlane/repos", + "events_url": "https://api.github.com/users/RMacfarlane/events{/privacy}", + "received_events_url": "https://api.github.com/users/RMacfarlane/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 0, + "created_at": "2021-02-02T18:42:12Z", + "updated_at": "2021-02-02T18:58:50Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "\r\n\r\n\r\n\r\n\r\n\r\nThe Microsoft Auth Provider uses a specific AAD application with client id hardcoded here:\r\nhttps://github.com/microsoft/vscode/blob/582ea371c2bf785d88458dab95828387ad94a63d/extensions/microsoft-authentication/src/AADHelper.ts#L25-L26\r\n\r\nHowever, this application only has access to a handful of scopes, and to add _allowed_ scopes to this client id is a manual process (which for an external extension author means opening an issue here and then having one of us add that scope to the _allowed_ scopes for the application)\r\n\r\nAs an extension author, I should easily be able to create my own AAD application (in the Azure Portal for example) and use that client id instead of the one vscode uses so that I can have control over the scopes I care about and, if this exists, I can get telemetry when my client id is used.\r\n\r\nSince we have abstracted auth providers, I think it's fitting to be able to pass additional auth provider specific options down to an auth provider. For example, the Microsoft auth provider would take a client id and tenant that would replace the hard coded string above.\r\n\r\nProposal:\r\n\r\n```ts\r\n /**\r\n\t * Options to be used when getting an [AuthenticationSession](#AuthenticationSession) from an [AuthenticationProvider](#AuthenticationProvider).\r\n\t */\r\n\texport interface AuthenticationGetSessionOptions {\r\n\t\t/**\r\n\t\t * Whether login should be performed if there is no matching session.\r\n\t\t *\r\n\t\t * If true, a modal dialog will be shown asking the user to sign in. If false, a numbered badge will be shown\r\n\t\t * on the accounts activity bar icon. An entry for the extension will be added under the menu to sign in. This\r\n\t\t * allows quietly prompting the user to sign in.\r\n\t\t *\r\n\t\t * Defaults to false.\r\n\t\t */\r\n\t\tcreateIfNone?: boolean;\r\n\r\n\t\t/**\r\n\t\t * Whether the existing user session preference should be cleared.\r\n\t\t *\r\n\t\t * For authentication providers that support being signed into multiple accounts at once, the user will be\r\n\t\t * prompted to select an account to use when [getSession](#authentication.getSession) is called. This preference\r\n\t\t * is remembered until [getSession](#authentication.getSession) is called with this flag.\r\n\t\t *\r\n\t\t * Defaults to false.\r\n\t\t */\r\n\t\tclearSessionPreference?: boolean;\r\n\r\n\t\t/*************/\r\n\t\t/*** NEW ***/\r\n\t\t/*************/\r\n /**\r\n * Provider specific options for getting this session (i.e. client id, tenant)\r\n */\r\n\t\tproviderOptions?: { [key: string]: any; }\r\n\t}\r\n```\r\n\r\nThe Auth Provider would then need to be responsible for deciding if it already has created a session with these options or if it needs to create a new session based on these options.", + "performed_via_github_app": null, + "score": 1 + }, + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/115616", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/115616/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/115616/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/115616/events", + "html_url": "https://github.com/microsoft/vscode/issues/115616", + "id": 799392757, + "node_id": "MDU6SXNzdWU3OTkzOTI3NTc=", + "number": 115616, + "title": "Provide extension API to exclude ports from forwarding", + "user": { + "login": "alexr00", + "id": 38270282, + "node_id": "MDQ6VXNlcjM4MjcwMjgy", + "avatar_url": "https://avatars.githubusercontent.com/u/38270282?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/alexr00", + "html_url": "https://github.com/alexr00", + "followers_url": "https://api.github.com/users/alexr00/followers", + "following_url": "https://api.github.com/users/alexr00/following{/other_user}", + "gists_url": "https://api.github.com/users/alexr00/gists{/gist_id}", + "starred_url": "https://api.github.com/users/alexr00/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/alexr00/subscriptions", + "organizations_url": "https://api.github.com/users/alexr00/orgs", + "repos_url": "https://api.github.com/users/alexr00/repos", + "events_url": "https://api.github.com/users/alexr00/events{/privacy}", + "received_events_url": "https://api.github.com/users/alexr00/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 290465400, + "node_id": "MDU6TGFiZWwyOTA0NjU0MDA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api", + "name": "api", + "color": "1d76db", + "default": false, + "description": "" + }, + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 272689392, + "node_id": "MDU6TGFiZWwyNzI2ODkzOTI=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/feature-request", + "name": "feature-request", + "color": "dcdcdc", + "default": false, + "description": "Request for new features or functionality" + }, + { + "id": 1772775110, + "node_id": "MDU6TGFiZWwxNzcyNzc1MTEw", + "url": "https://api.github.com/repos/microsoft/vscode/labels/remote-explorer", + "name": "remote-explorer", + "color": "1d76db", + "default": false, + "description": "Remote explorer view" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [ + { + "login": "alexr00", + "id": 38270282, + "node_id": "MDQ6VXNlcjM4MjcwMjgy", + "avatar_url": "https://avatars.githubusercontent.com/u/38270282?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/alexr00", + "html_url": "https://github.com/alexr00", + "followers_url": "https://api.github.com/users/alexr00/followers", + "following_url": "https://api.github.com/users/alexr00/following{/other_user}", + "gists_url": "https://api.github.com/users/alexr00/gists{/gist_id}", + "starred_url": "https://api.github.com/users/alexr00/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/alexr00/subscriptions", + "organizations_url": "https://api.github.com/users/alexr00/orgs", + "repos_url": "https://api.github.com/users/alexr00/repos", + "events_url": "https://api.github.com/users/alexr00/events{/privacy}", + "received_events_url": "https://api.github.com/users/alexr00/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 15, + "created_at": "2021-02-02T15:37:45Z", + "updated_at": "2021-02-12T16:08:10Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "From @weinand:\r\nToday the tunneling service blindly forwards all communication ports.\r\nThis includes ports that are used for debugging (even if our remote debugging feature does not need these ports to be forwarded).\r\nThis is confusing for users because they see ports that they are not really interested in.\r\n\r\nI propose to add extension API so that individual ports or port ranges can be excluded from forwarding.\r\nDebug extensions could use this API.\r\n\r\n", + "performed_via_github_app": null, + "score": 1 + }, + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/114123", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/114123/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/114123/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/114123/events", + "html_url": "https://github.com/microsoft/vscode/issues/114123", + "id": 783094648, + "node_id": "MDU6SXNzdWU3ODMwOTQ2NDg=", + "number": 114123, + "title": "Resolve the conflict run button in editor context menu", + "user": { + "login": "jdneo", + "id": 6193897, + "node_id": "MDQ6VXNlcjYxOTM4OTc=", + "avatar_url": "https://avatars.githubusercontent.com/u/6193897?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/jdneo", + "html_url": "https://github.com/jdneo", + "followers_url": "https://api.github.com/users/jdneo/followers", + "following_url": "https://api.github.com/users/jdneo/following{/other_user}", + "gists_url": "https://api.github.com/users/jdneo/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jdneo/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jdneo/subscriptions", + "organizations_url": "https://api.github.com/users/jdneo/orgs", + "repos_url": "https://api.github.com/users/jdneo/repos", + "events_url": "https://api.github.com/users/jdneo/events{/privacy}", + "received_events_url": "https://api.github.com/users/jdneo/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 272689392, + "node_id": "MDU6TGFiZWwyNzI2ODkzOTI=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/feature-request", + "name": "feature-request", + "color": "dcdcdc", + "default": false, + "description": "Request for new features or functionality" + }, + { + "id": 795791582, + "node_id": "MDU6TGFiZWw3OTU3OTE1ODI=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/menus", + "name": "menus", + "color": "1d76db", + "default": false, + "description": "Menu items and widget issues" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "jrieken", + "id": 1794099, + "node_id": "MDQ6VXNlcjE3OTQwOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/1794099?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/jrieken", + "html_url": "https://github.com/jrieken", + "followers_url": "https://api.github.com/users/jrieken/followers", + "following_url": "https://api.github.com/users/jrieken/following{/other_user}", + "gists_url": "https://api.github.com/users/jrieken/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jrieken/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jrieken/subscriptions", + "organizations_url": "https://api.github.com/users/jrieken/orgs", + "repos_url": "https://api.github.com/users/jrieken/repos", + "events_url": "https://api.github.com/users/jrieken/events{/privacy}", + "received_events_url": "https://api.github.com/users/jrieken/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "jrieken", + "id": 1794099, + "node_id": "MDQ6VXNlcjE3OTQwOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/1794099?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/jrieken", + "html_url": "https://github.com/jrieken", + "followers_url": "https://api.github.com/users/jrieken/followers", + "following_url": "https://api.github.com/users/jrieken/following{/other_user}", + "gists_url": "https://api.github.com/users/jrieken/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jrieken/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jrieken/subscriptions", + "organizations_url": "https://api.github.com/users/jrieken/orgs", + "repos_url": "https://api.github.com/users/jrieken/repos", + "events_url": "https://api.github.com/users/jrieken/events{/privacy}", + "received_events_url": "https://api.github.com/users/jrieken/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 15, + "created_at": "2021-01-11T06:09:50Z", + "updated_at": "2021-02-09T13:40:28Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "\r\n\r\n\r\n\r\n\r\n\r\n### Problem\r\nSince the contribution point: `editor/title` is open for all the extensions, sometimes different extensions may have conflicts at this area. For example, in Java, such conflicts affect the run experience when the user installs both the Java extensions and the Code Runner extension:\r\n\r\n![image](https://user-images.githubusercontent.com/6193897/104149682-30373100-5412-11eb-84be-8f05bfa9c042.png)\r\n\r\nThis is a very open and big topic, as a author of VS Code extensions, it will be great if VS Code as a platform, can provide solutions for this issue.\r\n\r\n### Potential Solutions\r\nBelow are just rough ideas on this, it's open for discussion!\r\n\r\n#### Editor Metadata\r\nExtensions can register context value per document/editor, and register command on the editor title area according to the context value. For example. the Java Debugger can use this to mark if the current Java file is executable or not. And register the run/debug command into the editor context area if it's executable.\r\n\r\n> This can somehow achieved by using the `in` expression of the when clause, something like `resource in hasMainMethodFiles`. But we also need to [get the context value dynamically from the code](https://github.com/microsoft/vscode/issues/10471#issuecomment-718548790) to handle with the corporation between multiple extensions. \r\n\r\nMeanwhile the Java feature team can contribute changes to the Code Runner extension to align the UX (for example, hide the run button from Code Runner if the current Java file contains an executable Main class).\r\n\r\n#### Official Support for the run experience in the editor title area.\r\nThis also may have some opportunity since I believe it's somehow related with #85759, if VS Code team will consider provide official `run/debug` functionality area in the editor title.\r\n\r\n", + "performed_via_github_app": null, + "score": 1 + }, + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/109277", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/109277/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/109277/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/109277/events", + "html_url": "https://github.com/microsoft/vscode/issues/109277", + "id": 728636389, + "node_id": "MDU6SXNzdWU3Mjg2MzYzODk=", + "number": 109277, + "title": "Let extensions hook into url opening", + "user": { + "login": "mjbvz", + "id": 12821956, + "node_id": "MDQ6VXNlcjEyODIxOTU2", + "avatar_url": "https://avatars.githubusercontent.com/u/12821956?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mjbvz", + "html_url": "https://github.com/mjbvz", + "followers_url": "https://api.github.com/users/mjbvz/followers", + "following_url": "https://api.github.com/users/mjbvz/following{/other_user}", + "gists_url": "https://api.github.com/users/mjbvz/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mjbvz/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mjbvz/subscriptions", + "organizations_url": "https://api.github.com/users/mjbvz/orgs", + "repos_url": "https://api.github.com/users/mjbvz/repos", + "events_url": "https://api.github.com/users/mjbvz/events{/privacy}", + "received_events_url": "https://api.github.com/users/mjbvz/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 290465400, + "node_id": "MDU6TGFiZWwyOTA0NjU0MDA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api", + "name": "api", + "color": "1d76db", + "default": false, + "description": "" + }, + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 578047123, + "node_id": "MDU6TGFiZWw1NzgwNDcxMjM=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/under-discussion", + "name": "under-discussion", + "color": "dcdcdc", + "default": false, + "description": "Issue is under discussion for relevance, priority, approach" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "mjbvz", + "id": 12821956, + "node_id": "MDQ6VXNlcjEyODIxOTU2", + "avatar_url": "https://avatars.githubusercontent.com/u/12821956?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mjbvz", + "html_url": "https://github.com/mjbvz", + "followers_url": "https://api.github.com/users/mjbvz/followers", + "following_url": "https://api.github.com/users/mjbvz/following{/other_user}", + "gists_url": "https://api.github.com/users/mjbvz/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mjbvz/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mjbvz/subscriptions", + "organizations_url": "https://api.github.com/users/mjbvz/orgs", + "repos_url": "https://api.github.com/users/mjbvz/repos", + "events_url": "https://api.github.com/users/mjbvz/events{/privacy}", + "received_events_url": "https://api.github.com/users/mjbvz/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "mjbvz", + "id": 12821956, + "node_id": "MDQ6VXNlcjEyODIxOTU2", + "avatar_url": "https://avatars.githubusercontent.com/u/12821956?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mjbvz", + "html_url": "https://github.com/mjbvz", + "followers_url": "https://api.github.com/users/mjbvz/followers", + "following_url": "https://api.github.com/users/mjbvz/following{/other_user}", + "gists_url": "https://api.github.com/users/mjbvz/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mjbvz/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mjbvz/subscriptions", + "organizations_url": "https://api.github.com/users/mjbvz/orgs", + "repos_url": "https://api.github.com/users/mjbvz/repos", + "events_url": "https://api.github.com/users/mjbvz/events{/privacy}", + "received_events_url": "https://api.github.com/users/mjbvz/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 10, + "created_at": "2020-10-24T02:27:26Z", + "updated_at": "2021-02-11T23:51:08Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "## Overview\r\nLet extensions hook into url opening. Motivating use case: I click on a link in the integrated terminal and it opens in my [browser preview extension](https://marketplace.visualstudio.com/items?itemName=auchenberg.vscode-browser-preview)\r\n\r\nPotential places to handle links:\r\n\r\n- Links in the terminal\r\n- Links in documents\r\n- Links from the remote port forwarding views\r\n- Debugger launch?\r\n- Open external?\r\n\r\n## Additional requirements\r\n\r\n- A url opener should be able to decline opening a link\r\n\r\n Some openers may only support specific types of links, such as `localhost`\r\n\r\n- Clicking a link should activate relevant extensions\r\n\r\n We'd need a new activation event so that extensions can make sure they handle link opening\r\n\r\n- Let users fallback to VS Code's default behavior\r\n\r\n This typically is to open using the default browser\r\n\r\n- Handle multiple url openers being registered at the same time\r\n\r\n Users should be able to select which opener to use in this case. They should potentially be able to specify a default opener.\r\n", + "performed_via_github_app": null, + "score": 1 + }, + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/107467", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/107467/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/107467/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/107467/events", + "html_url": "https://github.com/microsoft/vscode/issues/107467", + "id": 709128519, + "node_id": "MDU6SXNzdWU3MDkxMjg1MTk=", + "number": 107467, + "title": "Testing in VS Code", + "user": { + "login": "connor4312", + "id": 2230985, + "node_id": "MDQ6VXNlcjIyMzA5ODU=", + "avatar_url": "https://avatars.githubusercontent.com/u/2230985?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/connor4312", + "html_url": "https://github.com/connor4312", + "followers_url": "https://api.github.com/users/connor4312/followers", + "following_url": "https://api.github.com/users/connor4312/following{/other_user}", + "gists_url": "https://api.github.com/users/connor4312/gists{/gist_id}", + "starred_url": "https://api.github.com/users/connor4312/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/connor4312/subscriptions", + "organizations_url": "https://api.github.com/users/connor4312/orgs", + "repos_url": "https://api.github.com/users/connor4312/repos", + "events_url": "https://api.github.com/users/connor4312/events{/privacy}", + "received_events_url": "https://api.github.com/users/connor4312/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 293426086, + "node_id": "MDU6TGFiZWwyOTM0MjYwODY=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/plan-item", + "name": "plan-item", + "color": "dcdcdc", + "default": false, + "description": "VS Code - planned item for upcoming" + }, + { + "id": 578047123, + "node_id": "MDU6TGFiZWw1NzgwNDcxMjM=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/under-discussion", + "name": "under-discussion", + "color": "dcdcdc", + "default": false, + "description": "Issue is under discussion for relevance, priority, approach" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "connor4312", + "id": 2230985, + "node_id": "MDQ6VXNlcjIyMzA5ODU=", + "avatar_url": "https://avatars.githubusercontent.com/u/2230985?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/connor4312", + "html_url": "https://github.com/connor4312", + "followers_url": "https://api.github.com/users/connor4312/followers", + "following_url": "https://api.github.com/users/connor4312/following{/other_user}", + "gists_url": "https://api.github.com/users/connor4312/gists{/gist_id}", + "starred_url": "https://api.github.com/users/connor4312/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/connor4312/subscriptions", + "organizations_url": "https://api.github.com/users/connor4312/orgs", + "repos_url": "https://api.github.com/users/connor4312/repos", + "events_url": "https://api.github.com/users/connor4312/events{/privacy}", + "received_events_url": "https://api.github.com/users/connor4312/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "connor4312", + "id": 2230985, + "node_id": "MDQ6VXNlcjIyMzA5ODU=", + "avatar_url": "https://avatars.githubusercontent.com/u/2230985?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/connor4312", + "html_url": "https://github.com/connor4312", + "followers_url": "https://api.github.com/users/connor4312/followers", + "following_url": "https://api.github.com/users/connor4312/following{/other_user}", + "gists_url": "https://api.github.com/users/connor4312/gists{/gist_id}", + "starred_url": "https://api.github.com/users/connor4312/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/connor4312/subscriptions", + "organizations_url": "https://api.github.com/users/connor4312/orgs", + "repos_url": "https://api.github.com/users/connor4312/repos", + "events_url": "https://api.github.com/users/connor4312/events{/privacy}", + "received_events_url": "https://api.github.com/users/connor4312/received_events", + "type": "User", + "site_admin": false + }, + { + "login": "sandy081", + "id": 10746682, + "node_id": "MDQ6VXNlcjEwNzQ2Njgy", + "avatar_url": "https://avatars.githubusercontent.com/u/10746682?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sandy081", + "html_url": "https://github.com/sandy081", + "followers_url": "https://api.github.com/users/sandy081/followers", + "following_url": "https://api.github.com/users/sandy081/following{/other_user}", + "gists_url": "https://api.github.com/users/sandy081/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sandy081/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sandy081/subscriptions", + "organizations_url": "https://api.github.com/users/sandy081/orgs", + "repos_url": "https://api.github.com/users/sandy081/repos", + "events_url": "https://api.github.com/users/sandy081/events{/privacy}", + "received_events_url": "https://api.github.com/users/sandy081/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 53, + "created_at": "2020-09-25T17:19:53Z", + "updated_at": "2021-02-16T21:11:36Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "## State of the World\r\n\r\nTesting support in VS Code has been a feature request for [a long time](https://github.com/microsoft/vscode/issues/9505). The VS Code community has build excellent extensions around testing, for example:\r\n\r\n- The [Test Explorer UI](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-test-explorer) from @hbenl\r\n- [Wallaby.js](https://wallabyjs.com/) from the Wallaby team\r\n- [Jest](https://marketplace.visualstudio.com/items?itemName=Orta.vscode-jest) from @orta\r\n- ...and many more\r\n\r\nEach implementation of testing presents a different set of features, UI, and idiomaticity. Because there is no sanctioned approach to tests in VS Code, extension developers tend to make bespoke implementations, as we've seen in the Python and Java language extensions. Ideally, like in debugging, a VS Code user would have just about the same experience as they work between projects and languages.\r\n\r\n## VS Code's Approach\r\n\r\n> Investigate how VS Code can improve the testing support. Several extensions are already providing testing support, explore what APIs/UIs could be added to improve these testing extensions and the test running experience. -- [2020 Roadmap](https://github.com/microsoft/vscode/wiki/Roadmap#testing)\r\n\r\nThe Test Explorer UI presents the best point of inspiration for us, as there are many existing extensions built on its API: it's capable and proven. Regardless of the direction we take in VS Code, we should have a way for its Test Adapters to be upgraded to the new world.\r\n\r\nWallaby is an excellent extension, but it's tailored and purpose-built to JavaScript, and includes functionality which is not readily portable to other languages. While it is a good source for inspiration, we're not aiming to encompass Wallaby's feature set in the extension points we provide, at least not yet.\r\n\r\nWe're prototyping an API in the extension host, but there are a number of approaches we can take:\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
Extension Host ('traditional' VS Code API)'Test Protocol' (like DAP/LSP)Extension (like existing test explorer)
\r\n\t\t\t+ Simple to adopt for extension authors
\r\n\t\t\t+ Easier to manage state
\r\n\t\t\t+ Clear way to build 'official' test extensions
\r\n\t\t
\r\n\t\t\t+ Encourages keeping expensive work in child processes
\r\n\t\t\t+ Could be theoretically shared with VS and other editors
\r\n\t\t
\r\n\t\t\t+ Keep VS Code core slim
\r\n\t\t\t+ Unclear whether there's significant functionality we'd want that's not already possible in exthost api
\r\n\t\t
\r\n\t\t\t- The 'obvious path' is doing heavy lifting in the extension host process, which is undesirable
\r\n\t\t
\r\n\t\t\t- Additional implementation and maintainence complexity for VS Code
\r\n\t\t\t- Less friendly, additional complexity than TS APIs for extension authors
\r\n\t\t
\r\n\t\t\t- Additional extension and set of libraries to maintain+version for types and implementation
\r\n\t\t\t- Less clear there's an official pathway for test extensions
\r\n\t\t
\r\n\r\n## API Design\r\n\r\nThe following is a working draft of an API design. It should not be considered final, or anything close to final. This post will be edited as it evolves.\r\n\r\n#### Changes versus the [Test Adapter API](https://github.com/hbenl/vscode-test-adapter-api)\r\n\r\nAs mentioned, the test adapter API and this one provide a similar end user experience. Here are the notable changes we made:\r\n\r\n- The test adapter API does not distinguish between watching a workspace and watching a file. In some cases, there is an existing process that reads workspace tests (such as a language server in Java) or it's not much more expensive to get workspace tests than file tests (such as mocha, perhaps). However, some cases, like Go, providing tests for a single file can be done very cheaply and efficiently without needing to involve the workspace.\r\n\r\n\tIn this API we expect the `TestProvider` to, after activation, always provide tests for the visible text editors, and we only request tests for the entire workspace when required (i.e. when the UI needs to enumerate them).\r\n\r\n- We have modeled the test state more closely after the existing `DiagnosticCollection`, where the Test Adapter API uses only events to enumerate tests and does not have a central collection.\r\n\r\n- The Test Adapter API makes the distinction between suites and tests, we do not. They have almost identical capabilities, and in [at least one scenario](https://blog.golang.org/subtests) the 'suites' are more like tests and the leaf 'tests' cannot be run individually.\r\n\r\n- We use object identity rather than ID for referencing tests. This is in line with other items in the VS Code API, including Diagnostics.\r\n\r\n#### Ideas and Open Questions\r\n\r\n- We do not (yet) have a concept of test invalidation and auto-run, which in the test adapter API via the \"retire\" event. We are still looking into how this can best be implemented.\r\n\t\r\n\tIn a golden scenario, invalidation of tests would be done by a language server which can intelligently determine specific tests that should be invalidated when a file or a file dependency changes. Maybe this is still handled by an event on the TestProvider, but if we take a \"Test Protocol\" approach then coordination will be harder.\r\n- As marked in the `todo`, we will expose APIs for other extensions to read test state and build UI, but this is not yet included in the API design.\r\n- How should errors loading tests be handled? Emit diagnostics or have some test-specific code?\r\n\r\n- We would like to support code coverage in testing as well, but that is further down the line.\r\n\r\n- How can we let users learn about/onboard to testing from within VS Code?\r\n\r\n### API\r\n\r\nSee the current working proposal in https://github.com/microsoft/vscode/blob/master/src/vs/vscode.proposed.d.ts (ctrl+f for 107467)", + "performed_via_github_app": null, + "score": 1 + }, + { + "url": "https://api.github.com/repos/microsoft/vscode/issues/105690", + "repository_url": "https://api.github.com/repos/microsoft/vscode", + "labels_url": "https://api.github.com/repos/microsoft/vscode/issues/105690/labels{/name}", + "comments_url": "https://api.github.com/repos/microsoft/vscode/issues/105690/comments", + "events_url": "https://api.github.com/repos/microsoft/vscode/issues/105690/events", + "html_url": "https://github.com/microsoft/vscode/issues/105690", + "id": 688793797, + "node_id": "MDU6SXNzdWU2ODg3OTM3OTc=", + "number": 105690, + "title": "Extension API for Inline Values", + "user": { + "login": "weinand", + "id": 1898161, + "node_id": "MDQ6VXNlcjE4OTgxNjE=", + "avatar_url": "https://avatars.githubusercontent.com/u/1898161?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/weinand", + "html_url": "https://github.com/weinand", + "followers_url": "https://api.github.com/users/weinand/followers", + "following_url": "https://api.github.com/users/weinand/following{/other_user}", + "gists_url": "https://api.github.com/users/weinand/gists{/gist_id}", + "starred_url": "https://api.github.com/users/weinand/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/weinand/subscriptions", + "organizations_url": "https://api.github.com/users/weinand/orgs", + "repos_url": "https://api.github.com/users/weinand/repos", + "events_url": "https://api.github.com/users/weinand/events{/privacy}", + "received_events_url": "https://api.github.com/users/weinand/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 290465400, + "node_id": "MDU6TGFiZWwyOTA0NjU0MDA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api", + "name": "api", + "color": "1d76db", + "default": false, + "description": "" + }, + { + "id": 869332220, + "node_id": "MDU6TGFiZWw4NjkzMzIyMjA=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/api-proposal", + "name": "api-proposal", + "color": "c5def5", + "default": false, + "description": "" + }, + { + "id": 291054922, + "node_id": "MDU6TGFiZWwyOTEwNTQ5MjI=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/debug", + "name": "debug", + "color": "1d76db", + "default": false, + "description": "Debug viewlet, configurations, breakpoints, adapter issues" + }, + { + "id": 272689392, + "node_id": "MDU6TGFiZWwyNzI2ODkzOTI=", + "url": "https://api.github.com/repos/microsoft/vscode/labels/feature-request", + "name": "feature-request", + "color": "dcdcdc", + "default": false, + "description": "Request for new features or functionality" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "weinand", + "id": 1898161, + "node_id": "MDQ6VXNlcjE4OTgxNjE=", + "avatar_url": "https://avatars.githubusercontent.com/u/1898161?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/weinand", + "html_url": "https://github.com/weinand", + "followers_url": "https://api.github.com/users/weinand/followers", + "following_url": "https://api.github.com/users/weinand/following{/other_user}", + "gists_url": "https://api.github.com/users/weinand/gists{/gist_id}", + "starred_url": "https://api.github.com/users/weinand/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/weinand/subscriptions", + "organizations_url": "https://api.github.com/users/weinand/orgs", + "repos_url": "https://api.github.com/users/weinand/repos", + "events_url": "https://api.github.com/users/weinand/events{/privacy}", + "received_events_url": "https://api.github.com/users/weinand/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "weinand", + "id": 1898161, + "node_id": "MDQ6VXNlcjE4OTgxNjE=", + "avatar_url": "https://avatars.githubusercontent.com/u/1898161?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/weinand", + "html_url": "https://github.com/weinand", + "followers_url": "https://api.github.com/users/weinand/followers", + "following_url": "https://api.github.com/users/weinand/following{/other_user}", + "gists_url": "https://api.github.com/users/weinand/gists{/gist_id}", + "starred_url": "https://api.github.com/users/weinand/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/weinand/subscriptions", + "organizations_url": "https://api.github.com/users/weinand/orgs", + "repos_url": "https://api.github.com/users/weinand/repos", + "events_url": "https://api.github.com/users/weinand/events{/privacy}", + "received_events_url": "https://api.github.com/users/weinand/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": { + "url": "https://api.github.com/repos/microsoft/vscode/milestones/142", + "html_url": "https://github.com/microsoft/vscode/milestone/142", + "labels_url": "https://api.github.com/repos/microsoft/vscode/milestones/142/labels", + "id": 6286096, + "node_id": "MDk6TWlsZXN0b25lNjI4NjA5Ng==", + "number": 142, + "title": "February 2021", + "description": "", + "creator": { + "login": "Tyriar", + "id": 2193314, + "node_id": "MDQ6VXNlcjIxOTMzMTQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/2193314?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Tyriar", + "html_url": "https://github.com/Tyriar", + "followers_url": "https://api.github.com/users/Tyriar/followers", + "following_url": "https://api.github.com/users/Tyriar/following{/other_user}", + "gists_url": "https://api.github.com/users/Tyriar/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Tyriar/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Tyriar/subscriptions", + "organizations_url": "https://api.github.com/users/Tyriar/orgs", + "repos_url": "https://api.github.com/users/Tyriar/repos", + "events_url": "https://api.github.com/users/Tyriar/events{/privacy}", + "received_events_url": "https://api.github.com/users/Tyriar/received_events", + "type": "User", + "site_admin": false + }, + "open_issues": 232, + "closed_issues": 300, + "state": "open", + "created_at": "2021-01-07T18:23:10Z", + "updated_at": "2021-02-17T10:48:47Z", + "due_on": null, + "closed_at": null + }, + "comments": 7, + "created_at": "2020-08-30T21:21:23Z", + "updated_at": "2021-02-08T05:21:59Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "Today the \"Show Inline Values\" feature of VS Code's debugger is based on a generic implementation in the VS Code core and provides neither customisability through settings, nor extensibility via extensions.\r\n\r\nAs a consequence, it is not a perfect fit for all languages (e.g. #101797) and sometimes even shows incorrect values because it doesn't understand the scope regions of the underlying language. \r\n\r\nThis features asks for an extension API that either replaces the built-in implementation completely or allows to replace parts of the implementation with custom code.\r\n", + "performed_via_github_app": null, + "score": 1 + } + ] + } + ] } ] \ No newline at end of file diff --git a/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues index 387b4579..b39519d8 100644 --- a/.vscode/notebooks/endgame.github-issues +++ b/.vscode/notebooks/endgame.github-issues @@ -3,108 +3,147 @@ "kind": 1, "language": "markdown", "value": "#### Macros", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-emmet-helper\n\n$MILESTONE=milestone:\"January 2021\"", - "editable": true + "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-emmet-helper\n\n$MILESTONE=milestone:\"February 2021\"", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Preparation", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Open Pull Requests on the Milestone", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:pr is:open", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Open Issues on the Milestone", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:issue is:open -label:iteration-plan -label:endgame-plan -label:testplan-item", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Feature Requests Missing Labels", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:issue is:closed label:feature-request -label:verification-needed -label:on-testplan -label:verified -label:*duplicate", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Testing", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Test Plan Items", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:issue is:open label:testplan-item", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Verification Needed", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:issue is:closed label:feature-request label:verification-needed -label:verified", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Verification", - "editable": true + "editable": true, + "outputs": [] + }, + { + "kind": 1, + "language": "markdown", + "value": "## Verifiable Fixes", + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE is:issue is:closed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -label:z-author-verified -label:unreleased", - "editable": true + "value": "$REPOS $MILESTONE is:issue is:closed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -label:z-author-verified -label:unreleased", + "editable": true, + "outputs": [] + }, + { + "kind": 1, + "language": "markdown", + "value": "## Unreleased Fixes", + "editable": true, + "outputs": [] + }, + { + "kind": 2, + "language": "github-issues", + "value": "$REPOS $MILESTONE is:issue is:closed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -label:z-author-verified label:unreleased", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Candidates", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:open label:candidate", - "editable": true + "editable": true, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/notebooks/grooming-delta.github-issues b/.vscode/notebooks/grooming-delta.github-issues index 8bc9d38b..6602ea4b 100644 --- a/.vscode/notebooks/grooming-delta.github-issues +++ b/.vscode/notebooks/grooming-delta.github-issues @@ -176,17 +176,20 @@ { "kind": 1, "language": "markdown", - "value": "# vscode-pull-request-github" + "value": "# vscode-pull-request-github", + "editable": true }, { "kind": 2, "language": "github-issues", - "value": "repo:microsoft/vscode-pull-request-github is:issue closed:>$since" + "value": "repo:microsoft/vscode-pull-request-github is:issue closed:>$since", + "editable": true }, { "kind": 2, "language": "github-issues", - "value": "repo:microsoft/vscode-test is:issue created:>$since" + "value": "repo:microsoft/vscode-test is:issue created:>$since", + "editable": true }, { "kind": 1, diff --git a/.vscode/notebooks/grooming.github-issues b/.vscode/notebooks/grooming.github-issues index f44b2c71..407895ec 100644 --- a/.vscode/notebooks/grooming.github-issues +++ b/.vscode/notebooks/grooming.github-issues @@ -3,24 +3,28 @@ "kind": 1, "language": "markdown", "value": "### Categorizing Issues\n\nEach issue must have a type label. Most type labels are grey, some are yellow. Bugs are grey with a touch of red.", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "repo:microsoft/vscode is:open is:issue assignee:@me -label:\"needs more info\" -label:bug -label:feature-request -label:under-discussion -label:debt -label:*question -label:upstream -label:electron -label:engineering -label:plan-item ", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### Feature Areas\n\nEach issue should be assigned to a feature area", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "repo:microsoft/vscode is:open is:issue assignee:@me -label:L10N -label:VIM -label:api -label:api-finalization -label:api-proposal -label:authentication -label:breadcrumbs -label:callhierarchy -label:code-lens -label:color-palette -label:comments -label:config -label:context-keys -label:css-less-scss -label:custom-editors -label:debug -label:debug-console -label:dialogs -label:diff-editor -label:dropdown -label:editor -label:editor-RTL -label:editor-autoclosing -label:editor-autoindent -label:editor-bracket-matching -label:editor-clipboard -label:editor-code-actions -label:editor-color-picker -label:editor-columnselect -label:editor-commands -label:editor-comments -label:editor-contrib -label:editor-core -label:editor-drag-and-drop -label:editor-error-widget -label:editor-find -label:editor-folding -label:editor-highlight -label:editor-hover -label:editor-indent-detection -label:editor-indent-guides -label:editor-input -label:editor-input-IME -label:editor-insets -label:editor-minimap -label:editor-multicursor -label:editor-parameter-hints -label:editor-render-whitespace -label:editor-rendering -label:editor-scrollbar -label:editor-symbols -label:editor-synced-region -label:editor-textbuffer -label:editor-theming -label:editor-wordnav -label:editor-wrapping -label:emmet -label:error-list -label:explorer-custom -label:extension-host -label:extension-recommendations -label:extensions -label:extensions-development -label:file-decorations -label:file-encoding -label:file-explorer -label:file-glob -label:file-guess-encoding -label:file-io -label:file-watcher -label:font-rendering -label:formatting -label:git -label:github -label:gpu -label:grammar -label:grid-view -label:html -label:i18n -label:icon-brand -label:icons-product -label:install-update -label:integrated-terminal -label:integrated-terminal-conpty -label:integrated-terminal-links -label:integrated-terminal-rendering -label:integrated-terminal-winpty -label:intellisense-config -label:ipc -label:issue-bot -label:issue-reporter -label:javascript -label:json -label:keybindings -label:keybindings-editor -label:keyboard-layout -label:label-provider -label:languages-basic -label:languages-diagnostics -label:languages-guessing -label:layout -label:lcd-text-rendering -label:list -label:log -label:markdown -label:marketplace -label:menus -label:merge-conflict -label:notebook -label:outline -label:output -label:perf -label:perf-bloat -label:perf-startup -label:php -label:portable-mode -label:proxy -label:quick-pick -label:references-viewlet -label:release-notes -label:remote -label:remote-explorer -label:rename -label:sandbox -label:scm -label:screencast-mode -label:search -label:search-api -label:search-editor -label:search-replace -label:semantic-tokens -label:settings-editor -label:settings-sync -label:settings-sync-server -label:shared-process -label:simple-file-dialog -label:smart-select -label:snap -label:snippets -label:splitview -label:suggest -label:sync-error-handling -label:tasks -label:telemetry -label:themes -label:timeline -label:timeline-git -label:titlebar -label:tokenization -label:touch/pointer -label:trackpad/scroll -label:tree -label:typescript -label:undo-redo -label:uri -label:ux -label:variable-resolving -label:vscode-build -label:vscode-website -label:web -label:webview -label:workbench-actions -label:workbench-cli -label:workbench-diagnostics -label:workbench-dnd -label:workbench-editor-grid -label:workbench-editors -label:workbench-electron -label:workbench-feedback -label:workbench-history -label:workbench-hot-exit -label:workbench-hover -label:workbench-launch -label:workbench-link -label:workbench-multiroot -label:workbench-notifications -label:workbench-os-integration -label:workbench-rapid-render -label:workbench-run-as-admin -label:workbench-state -label:workbench-status -label:workbench-tabs -label:workbench-touchbar -label:workbench-views -label:workbench-welcome -label:workbench-window -label:workbench-zen -label:workspace-edit -label:workspace-symbols -label:zoom", - "editable": true + "editable": true, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/notebooks/inbox.github-issues b/.vscode/notebooks/inbox.github-issues index c7134b3a..69c1b7b0 100644 --- a/.vscode/notebooks/inbox.github-issues +++ b/.vscode/notebooks/inbox.github-issues @@ -3,48 +3,56 @@ "kind": 1, "language": "markdown", "value": "## tl;dr: Triage Inbox\n\nAll inbox issues but not those that need more information. These issues need to be triaged, e.g assigned to a user or ask for more information", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$inbox -label:\"needs more info\"", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "##### `Config`: defines the inbox query", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$inbox=repo:microsoft/vscode is:open no:assignee -label:feature-request -label:testplan-item -label:plan-item ", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Inbox tracking and Issue triage", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", - "value": "New issues or pull requests submitted by the community are initially triaged by an [automatic classification bot](https://github.com/microsoft/vscode-github-triage-actions/tree/master/classifier-deep). Issues that the bot does not correctly triage are then triaged by a team member. The team rotates the inbox tracker on a weekly basis.\n\nA [mirror](https://github.com/JacksonKearl/testissues/issues) of the VS Code issue stream is available with details about how the bot classifies issues, including feature-area classifications and confidence ratings. Per-category confidence thresholds and feature-area ownership data is maintained in [.github/classifier.json](https://github.com/microsoft/vscode/blob/master/.github/classifier.json). \n\n💡 The bot is being run through a GitHub action that runs every 30 minutes. Give the bot the opportunity to classify an issue before doing it manually.\n\n### Inbox Tracking\n\nThe inbox tracker is responsible for the [global inbox](https://github.com/microsoft/vscode/issues?utf8=%E2%9C%93&q=is%3Aopen+no%3Aassignee+-label%3Afeature-request+-label%3Atestplan-item+-label%3Aplan-item) containing all **open issues and pull requests** that\n- are neither **feature requests** nor **test plan items** nor **plan items** and\n- have **no owner assignment**.\n\nThe **inbox tracker** may perform any step described in our [issue triaging documentation](https://github.com/microsoft/vscode/wiki/Issues-Triaging) but its main responsibility is to route issues to the actual feature area owner.\n\nFeature area owners track the **feature area inbox** containing all **open issues and pull requests** that\n- are personally assigned to them and are not assigned to any milestone\n- are labeled with their feature area label and are not assigned to any milestone.\nThis secondary triage may involve any of the steps described in our [issue triaging documentation](https://github.com/microsoft/vscode/wiki/Issues-Triaging) and results in a fully triaged or closed issue.\n\nThe [github triage extension](https://github.com/microsoft/vscode-github-triage-extension) can be used to assist with triaging — it provides a \"Command Palette\"-style list of triaging actions like assignment, labeling, and triggers for various bot actions.", - "editable": true + "value": "New issues or pull requests submitted by the community are initially triaged by an [automatic classification bot](https://github.com/microsoft/vscode-github-triage-actions/tree/master/classifier-deep). Issues that the bot does not correctly triage are then triaged by a team member. The team rotates the inbox tracker on a weekly basis.\n\nA [mirror](https://github.com/JacksonKearl/testissues/issues) of the VS Code issue stream is available with details about how the bot classifies issues, including feature-area classifications and confidence ratings. Per-category confidence thresholds and feature-area ownership data is maintained in [.github/classifier.json](https://github.com/microsoft/vscode/blob/main/.github/classifier.json). \n\n💡 The bot is being run through a GitHub action that runs every 30 minutes. Give the bot the opportunity to classify an issue before doing it manually.\n\n### Inbox Tracking\n\nThe inbox tracker is responsible for the [global inbox](https://github.com/microsoft/vscode/issues?utf8=%E2%9C%93&q=is%3Aopen+no%3Aassignee+-label%3Afeature-request+-label%3Atestplan-item+-label%3Aplan-item) containing all **open issues and pull requests** that\n- are neither **feature requests** nor **test plan items** nor **plan items** and\n- have **no owner assignment**.\n\nThe **inbox tracker** may perform any step described in our [issue triaging documentation](https://github.com/microsoft/vscode/wiki/Issues-Triaging) but its main responsibility is to route issues to the actual feature area owner.\n\nFeature area owners track the **feature area inbox** containing all **open issues and pull requests** that\n- are personally assigned to them and are not assigned to any milestone\n- are labeled with their feature area label and are not assigned to any milestone.\nThis secondary triage may involve any of the steps described in our [issue triaging documentation](https://github.com/microsoft/vscode/wiki/Issues-Triaging) and results in a fully triaged or closed issue.\n\nThe [github triage extension](https://github.com/microsoft/vscode-github-triage-extension) can be used to assist with triaging — it provides a \"Command Palette\"-style list of triaging actions like assignment, labeling, and triggers for various bot actions.", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## All Inbox Items\n\nAll issues that have no assignee and that have neither **feature requests** nor **test plan items** nor **plan items**.", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$inbox", - "editable": true + "editable": true, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues index f22e2980..a384d1a1 100644 --- a/.vscode/notebooks/my-endgame.github-issues +++ b/.vscode/notebooks/my-endgame.github-issues @@ -3,216 +3,252 @@ "kind": 1, "language": "markdown", "value": "#### Macros", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server\n\n$MILESTONE=milestone:\"January 2021\"\n\n$MINE=assignee:@me", - "editable": true + "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server\n\n$MILESTONE=milestone:\"February 2021\"\n\n$MINE=assignee:@me", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Preparation", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Open Pull Requests on the Milestone", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE $MINE is:pr is:open", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Open Issues on the Milestone", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE $MINE is:issue is:open -label:iteration-plan -label:endgame-plan -label:testplan-item", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Feature Requests Missing Labels", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE $MINE is:issue is:closed label:feature-request -label:verification-needed -label:on-testplan -label:verified -label:*duplicate", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Test Plan Items", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE is:issue is:open author:@me label:testplan-item", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Verification Needed", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE $MINE is:issue is:closed label:feature-request label:verification-needed", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Testing", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Test Plan Items", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE $MINE is:issue is:open label:testplan-item", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Verification Needed", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE -$MINE is:issue is:closed -assignee:@me -label:verified label:feature-request label:verification-needed", - "editable": true + "value": "$REPOS $MILESTONE -$MINE is:issue is:closed -assignee:@me -label:verified -label:z-author-verified label:feature-request label:verification-needed", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Fixing", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Open Issues", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE $MINE is:issue is:open -label:endgame-plan", - "editable": true + "value": "$REPOS $MILESTONE $MINE is:issue is:open -label:endgame-plan -label:testplan-item -label:iteration-plan", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Open Bugs", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$REPOS $MILESTONE $MINE is:issue is:open label:bug", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Verification", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## My Issues (verification-steps-needed)", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE $MINE is:issue is:open label:bug label:verification-steps-needed", - "editable": true + "value": "$REPOS $MILESTONE $MINE is:issue label:bug label:verification-steps-needed", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## My Issues (verification-found)", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE $MINE is:issue is:open label:bug label:verification-found", - "editable": true + "value": "$REPOS $MILESTONE $MINE is:issue label:bug label:verification-found", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Issues filed by me", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE -$MINE is:issue is:closed author:@me sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found", - "editable": true + "value": "$REPOS $MILESTONE -$MINE is:issue is:closed author:@me sort:updated-asc label:bug -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Issues filed from outside team", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE -$MINE is:issue is:closed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:bamurtaugh -author:bpasero -author:btholt -author:chrisdias -author:chrmarti -author:Chuxel -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:eamodio -author:egamma -author:fiveisprime -author:gregvanl -author:isidorn -author:ItalyPaleAle -author:JacksonKearl -author:joaomoreno -author:jrieken -author:kieferrm -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:ornellaalt -author:orta -author:rebornix -author:RMacfarlane -author:roblourens -author:rzhao271 -author:sana-ajani -author:sandy081 -author:sbatten -author:stevencl -author:Tyriar -author:weinand -author:TylerLeonhardt -author:lramos15", - "editable": true + "value": "$REPOS $MILESTONE -$MINE is:issue is:closed sort:updated-asc label:bug -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:bamurtaugh -author:bpasero -author:btholt -author:chrisdias -author:chrmarti -author:Chuxel -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:eamodio -author:egamma -author:fiveisprime -author:gregvanl -author:isidorn -author:ItalyPaleAle -author:JacksonKearl -author:joaomoreno -author:jrieken -author:kieferrm -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:ornellaalt -author:orta -author:rebornix -author:RMacfarlane -author:roblourens -author:rzhao271 -author:sana-ajani -author:sandy081 -author:sbatten -author:stevencl -author:Tyriar -author:weinand -author:TylerLeonhardt -author:lramos15", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Issues filed by others", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE -$MINE is:issue is:closed -author:@me sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found", - "editable": true + "value": "$REPOS $MILESTONE -$MINE is:issue is:closed -author:@me sort:updated-asc label:bug -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "# Release Notes", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "repo:microsoft/vscode $MILESTONE is:issue is:closed label:feature-request -label:on-release-notes", - "editable": true + "value": "repo:microsoft/vscode $MILESTONE $MINE is:issue is:closed label:feature-request -label:on-release-notes", + "editable": true, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues index 91f337b9..4cb58bad 100644 --- a/.vscode/notebooks/my-work.github-issues +++ b/.vscode/notebooks/my-work.github-issues @@ -3,114 +3,133 @@ "kind": 1, "language": "markdown", "value": "##### `Config`: This should be changed every month/milestone", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "// list of repos we work in\n$repos=repo:microsoft/vscode repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-internalbacklog\n\n// current milestone name\n$milestone=milestone:\"January 2021\"", - "editable": true + "value": "// list of repos we work in\n$repos=repo:microsoft/vscode repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-internalbacklog\n\n// current milestone name\n$milestone=milestone:\"February 2021\"", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "github-issues", "value": "## Milestone Work", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos $milestone assignee:@me is:open", - "editable": false + "editable": true, + "outputs": [] }, { "kind": 1, "language": "github-issues", "value": "## Bugs, Debt, Features...", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "#### My Bugs", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open label:bug", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "#### Debt & Engineering", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open label:debt OR $repos assignee:@me is:open label:engineering", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "#### Performance 🐌 🔜 🏎", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open label:perf OR $repos assignee:@me is:open label:perf-startup OR $repos assignee:@me is:open label:perf-bloat OR $repos assignee:@me is:open label:freeze-slow-crash-leak", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "#### Feature Requests", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open label:feature-request milestone:Backlog sort:reactions-+1-desc", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open milestone:\"Backlog Candidates\"", - "editable": false + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### Personal Inbox\n", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "\n#### Missing Type label", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open type:issue -label:bug -label:\"needs more info\" -label:feature-request -label:under-discussion -label:debt -label:plan-item -label:upstream", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "#### Not Actionable", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos assignee:@me is:open label:\"needs more info\"", - "editable": false + "editable": true, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/notebooks/papercuts.github-issues b/.vscode/notebooks/papercuts.github-issues index 7c20cd73..01bb2151 100644 --- a/.vscode/notebooks/papercuts.github-issues +++ b/.vscode/notebooks/papercuts.github-issues @@ -2,43 +2,50 @@ { "kind": 1, "language": "markdown", - "value": "## Papercuts\n\nThis notebook serves as an ongoing collection of paper cut issues that we encounter while dogfooding. With that in mind only promote issues that really turn you off, e.g issues that make you wanna stop use VS Code or its extensions. To mark an issue (bug, feature-request, etc) as paper cut add the labels: `papercut :drop_of_blood:`", - "editable": true + "value": "## Papercuts\n\nThis notebook serves as an ongoing collection of papercut issues that we encounter while dogfooding. With that in mind only promote issues that really turn you off, e.g. issues that make you want to stop using VS Code or its extensions. To mark an issue (bug, feature-request, etc.) as papercut add the labels: `papercut :drop_of_blood:`", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", - "value": "## All Papercuts\n\nThese are all papercut issues that we encounter while dogfoodingf vscode or extensions that we author. ", - "editable": true + "value": "## All Papercuts\n\nThese are all papercut issues that we encounter while dogfooding vscode or extensions that we author.", + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "repo:microsoft/vscode is:open -label:notebook label:\"papercut :drop_of_blood:\"", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "## Native Notebook", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "repo:microsoft/vscode is:open label:notebook label:\"papercut :drop_of_blood:\"", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### My Papercuts", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "repo:microsoft/vscode is:open assignee:@me label:\"papercut :drop_of_blood:\"", - "editable": true + "editable": true, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/notebooks/verification.github-issues b/.vscode/notebooks/verification.github-issues index e223523d..5724e73c 100644 --- a/.vscode/notebooks/verification.github-issues +++ b/.vscode/notebooks/verification.github-issues @@ -3,54 +3,63 @@ "kind": 1, "language": "markdown", "value": "### Bug Verification Queries\n\nBefore shipping we want to verify _all_ bugs. That means when a bug is fixed we check that the fix actually works. It's always best to start with bugs that you have filed and the proceed with bugs that have been filed from users outside the development team. ", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "#### Config: update list of `repos` and the `milestone`", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", - "value": "$repos=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks \n$milestone=milestone:\"January 2021\"", - "editable": true + "value": "$repos=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks \n$milestone=milestone:\"February 2021\"", + "editable": true, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### Bugs You Filed", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate author:@me", - "editable": false + "editable": false, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### Bugs From Outside", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate -author:@me -assignee:@me label:bug -label:verified -author:@me -author:aeschli -author:alexdima -author:alexr00 -author:bpasero -author:chrisdias -author:chrmarti -author:connor4312 -author:dbaeumer -author:deepak1556 -author:eamodio -author:egamma -author:gregvanl -author:isidorn -author:JacksonKearl -author:joaomoreno -author:jrieken -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:RMacfarlane -author:roblourens -author:sana-ajani -author:sandy081 -author:sbatten -author:Tyriar -author:weinand", - "editable": false + "editable": false, + "outputs": [] }, { "kind": 1, "language": "markdown", "value": "### All", - "editable": true + "editable": true, + "outputs": [] }, { "kind": 2, "language": "github-issues", "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate", - "editable": false + "editable": false, + "outputs": [] } ] \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 0222b24c..eabef169 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -43,7 +43,9 @@ } ], "eslint.options": { - "rulePaths": ["./build/lib/eslint"] + "rulePaths": [ + "./build/lib/eslint" + ] }, "typescript.tsdk": "node_modules/typescript/lib", "npm.exclude": "**/extensions/**", @@ -53,11 +55,15 @@ "typescript.preferences.quoteStyle": "single", "json.schemas": [ { - "fileMatch": ["cgmanifest.json"], + "fileMatch": [ + "cgmanifest.json" + ], "url": "./.vscode/cgmanifest.schema.json" }, { - "fileMatch": ["cglicenses.json"], + "fileMatch": [ + "cglicenses.json" + ], "url": "./.vscode/cglicenses.schema.json" } ], @@ -78,5 +84,6 @@ "editor.defaultFormatter": "vscode.typescript-language-features", "editor.formatOnSave": true, }, - "typescript.tsc.autoDetect": "off" + "typescript.tsc.autoDetect": "off", + "notebook.experimental.useMarkdownRenderer": true, } diff --git a/.yarnrc b/.yarnrc index 83146ea6..0c5cf55a 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://electronjs.org/headers" -target "11.2.1" +target "11.3.0" runtime "electron" diff --git a/README.md b/README.md index ec206f09..eb792510 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## The Repository -This repository ("`Code - OSS`") is where we (Microsoft) develop the [Visual Studio Code](https://code.visualstudio.com) product. Not only do we work on code and issues here, we also publish our [roadmap](https://github.com/microsoft/vscode/wiki/Roadmap), [monthly iteration plans](https://github.com/microsoft/vscode/wiki/Iteration-Plans), and our [endgame plans](https://github.com/microsoft/vscode/wiki/Running-the-Endgame). This source code is available to everyone under the standard [MIT license](https://github.com/microsoft/vscode/blob/master/LICENSE.txt). +This repository ("`Code - OSS`") is where we (Microsoft) develop the [Visual Studio Code](https://code.visualstudio.com) product. Not only do we work on code and issues here, we also publish our [roadmap](https://github.com/microsoft/vscode/wiki/Roadmap), [monthly iteration plans](https://github.com/microsoft/vscode/wiki/Iteration-Plans), and our [endgame plans](https://github.com/microsoft/vscode/wiki/Running-the-Endgame). This source code is available to everyone under the standard [MIT license](https://github.com/microsoft/vscode/blob/main/LICENSE.txt). ## Visual Studio Code @@ -30,7 +30,7 @@ There are many ways in which you can participate in the project, for example: If you are interested in fixing issues and contributing directly to the code base, please see the document [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute), which covers the following: -* [How to build and run from source](https://github.com/microsoft/vscode/wiki/How-to-Contribute#build-and-run) +* [How to build and run from source](https://github.com/microsoft/vscode/wiki/How-to-Contribute) * [The development workflow, including debugging and running tests](https://github.com/microsoft/vscode/wiki/How-to-Contribute#debugging) * [Coding guidelines](https://github.com/microsoft/vscode/wiki/Coding-Guidelines) * [Submitting pull requests](https://github.com/microsoft/vscode/wiki/How-to-Contribute#pull-requests) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 5633bc5a..4d290f90 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -5,70 +5,98 @@ Do Not Translate or Localize This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. -1. atom/language-clojure version 0.22.7 (https://github.com/atom/language-clojure) -2. atom/language-coffee-script version 0.49.3 (https://github.com/atom/language-coffee-script) -3. atom/language-java version 0.32.0 (https://github.com/atom/language-java) -4. atom/language-sass version 0.62.1 (https://github.com/atom/language-sass) -5. atom/language-shellscript version 0.26.0 (https://github.com/atom/language-shellscript) -6. atom/language-xml version 0.35.2 (https://github.com/atom/language-xml) -7. better-go-syntax version 1.0.0 (https://github.com/jeff-hykin/better-go-syntax/ ) -8. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes) -9. daaain/Handlebars version 1.8.0 (https://github.com/daaain/Handlebars) -10. davidrios/pug-tmbundle (https://github.com/davidrios/pug-tmbundle) -11. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped) -12. demyte/language-cshtml version 0.3.0 (https://github.com/demyte/language-cshtml) -13. Document Object Model version 4.0.0 (https://www.w3.org/DOM/) -14. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage) -15. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation) -16. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle) -17. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift) -18. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/) -19. Ikuyadeu/vscode-R version 1.3.0 (https://github.com/Ikuyadeu/vscode-R) -20. insane version 2.6.2 (https://github.com/bevacqua/insane) -21. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site) -22. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar) -23. jeff-hykin/cpp-textmate-grammar version 1.12.11 (https://github.com/jeff-hykin/cpp-textmate-grammar) -24. jeff-hykin/cpp-textmate-grammar version 1.15.5 (https://github.com/jeff-hykin/cpp-textmate-grammar) -25. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) -26. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) -27. language-docker (https://github.com/moby/moby) -28. language-less version 0.34.2 (https://github.com/atom/language-less) -29. language-php version 0.46.0 (https://github.com/atom/language-php) -30. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython) -31. marked version 1.1.0 (https://github.com/markedjs/marked) -32. mdn-data version 1.1.12 (https://github.com/mdn/data) -33. microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/microsoft/TypeScript-TmLanguage) -34. microsoft/vscode-JSON.tmLanguage (https://github.com/microsoft/vscode-JSON.tmLanguage) -35. microsoft/vscode-markdown-tm-grammar version 1.0.0 (https://github.com/microsoft/vscode-markdown-tm-grammar) -36. microsoft/vscode-mssql version 1.9.0 (https://github.com/microsoft/vscode-mssql) -37. mmims/language-batchfile version 0.7.5 (https://github.com/mmims/language-batchfile) -38. octref/language-css version 0.42.11 (https://github.com/octref/language-css) -39. PowerShell/EditorSyntax version 1.0.0 (https://github.com/PowerShell/EditorSyntax) -40. rust-syntax version 0.4.3 (https://github.com/dustypomerleau/rust-syntax) -41. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) -42. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) -43. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) -44. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) -45. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) -46. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) -47. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) -48. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) -49. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) -50. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) -51. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) -52. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) -53. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) -54. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) -55. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) -56. TypeScript-TmLanguage version 0.1.8 (https://github.com/microsoft/TypeScript-TmLanguage) -57. TypeScript-TmLanguage version 1.0.0 (https://github.com/microsoft/TypeScript-TmLanguage) -58. Unicode version 12.0.0 (https://home.unicode.org/) -59. vscode-codicons version 0.0.1 (https://github.com/microsoft/vscode-codicons) -60. vscode-logfile-highlighter version 2.9.0 (https://github.com/emilast/vscode-logfile-highlighter) -61. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) -62. Web Background Synchronization (https://github.com/WICG/background-sync) +1. JuliaEditorSupport/atom-language-julia version 0.21.0 (https://github.com/JuliaEditorSupport/atom-language-julia) +2. atom/language-clojure version 0.22.7 (https://github.com/atom/language-clojure) +3. atom/language-coffee-script version 0.49.3 (https://github.com/atom/language-coffee-script) +4. atom/language-java version 0.32.1 (https://github.com/atom/language-java) +5. atom/language-sass version 0.62.1 (https://github.com/atom/language-sass) +6. atom/language-shellscript version 0.26.0 (https://github.com/atom/language-shellscript) +7. atom/language-xml version 0.35.2 (https://github.com/atom/language-xml) +8. better-go-syntax version 1.0.0 (https://github.com/jeff-hykin/better-go-syntax/ ) +9. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes) +10. daaain/Handlebars version 1.8.0 (https://github.com/daaain/Handlebars) +11. davidrios/pug-tmbundle (https://github.com/davidrios/pug-tmbundle) +12. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped) +13. demyte/language-cshtml version 0.3.0 (https://github.com/demyte/language-cshtml) +14. Document Object Model version 4.0.0 (https://www.w3.org/DOM/) +15. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage) +16. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation) +17. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle) +18. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift) +19. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/) +20. Ikuyadeu/vscode-R version 1.3.0 (https://github.com/Ikuyadeu/vscode-R) +21. insane version 2.6.2 (https://github.com/bevacqua/insane) +22. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site) +23. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar) +24. jeff-hykin/cpp-textmate-grammar version 1.12.11 (https://github.com/jeff-hykin/cpp-textmate-grammar) +25. jeff-hykin/cpp-textmate-grammar version 1.15.5 (https://github.com/jeff-hykin/cpp-textmate-grammar) +26. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) +27. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) +28. language-docker (https://github.com/moby/moby) +29. language-less version 0.34.2 (https://github.com/atom/language-less) +30. language-php version 0.46.0 (https://github.com/atom/language-php) +31. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython) +32. marked version 1.1.0 (https://github.com/markedjs/marked) +33. mdn-data version 1.1.12 (https://github.com/mdn/data) +34. microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/microsoft/TypeScript-TmLanguage) +35. microsoft/vscode-JSON.tmLanguage (https://github.com/microsoft/vscode-JSON.tmLanguage) +36. microsoft/vscode-markdown-tm-grammar version 1.0.0 (https://github.com/microsoft/vscode-markdown-tm-grammar) +37. microsoft/vscode-mssql version 1.9.0 (https://github.com/microsoft/vscode-mssql) +38. mmims/language-batchfile version 0.7.5 (https://github.com/mmims/language-batchfile) +39. octref/language-css version 0.42.11 (https://github.com/octref/language-css) +40. PowerShell/EditorSyntax version 1.0.0 (https://github.com/PowerShell/EditorSyntax) +41. rust-syntax version 0.4.3 (https://github.com/dustypomerleau/rust-syntax) +42. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) +43. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) +44. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) +45. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) +46. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) +47. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) +48. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) +49. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) +50. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) +51. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) +52. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) +53. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) +54. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) +55. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) +56. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) +57. TypeScript-TmLanguage version 0.1.8 (https://github.com/microsoft/TypeScript-TmLanguage) +58. TypeScript-TmLanguage version 1.0.0 (https://github.com/microsoft/TypeScript-TmLanguage) +59. Unicode version 12.0.0 (https://home.unicode.org/) +60. vscode-codicons version 0.0.14 (https://github.com/microsoft/vscode-codicons) +61. vscode-logfile-highlighter version 2.11.0 (https://github.com/emilast/vscode-logfile-highlighter) +62. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) +63. Web Background Synchronization (https://github.com/WICG/background-sync) +%% JuliaEditorSupport/atom-language-julia NOTICES AND INFORMATION BEGIN HERE +========================================= +The atom-language-julia package is licensed under the MIT "Expat" License: + +> Copyright (c) 2015 +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF JuliaEditorSupport/atom-language-julia NOTICES AND INFORMATION + %% atom/language-clojure NOTICES AND INFORMATION BEGIN HERE ========================================= Copyright (c) 2014 GitHub Inc. diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 283cb474..2c6cf3dd 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -71,6 +71,7 @@ steps: condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true')) - script: | + set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) @@ -180,14 +181,14 @@ steps: set -e ./scripts/test.sh --build --tfs "Unit Tests" displayName: Run unit tests (Electron) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e yarn test-browser --build --browser chromium --browser webkit --browser firefox --tfs "Browser Unit Tests" displayName: Run unit tests (Browser) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -207,7 +208,7 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \ ./scripts/test-integration.sh --build --tfs "Integration Tests" displayName: Run integration tests (Electron) - timeoutInMinutes: 5 + timeoutInMinutes: 10 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -215,7 +216,7 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \ ./resources/server/test/test-web-integration.sh --browser webkit displayName: Run integration tests (Browser) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -226,7 +227,7 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \ ./resources/server/test/test-remote-integration.sh displayName: Run remote integration tests (Electron) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -244,6 +245,16 @@ steps: displayName: Run smoke tests (Electron) condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + - script: | + set -e + APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH) + APP_NAME="`ls $APP_ROOT | head -n 1`" + VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \ + yarn smoketest-no-compile --build "$APP_ROOT/$APP_NAME" --remote + timeoutInMinutes: 5 + displayName: Run smoke tests (Remote) + condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + - script: | set -e VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \ @@ -377,7 +388,3 @@ steps: displayName: Upload configuration (for Bing settings search) condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false')) continueOnError: true - - - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: "Component Detection" - continueOnError: true diff --git a/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml index 331fbf96..22d6983e 100644 --- a/build/azure-pipelines/distro-build.yml +++ b/build/azure-pipelines/distro-build.yml @@ -1,9 +1,9 @@ trigger: branches: - include: ["master", "release/*"] + include: ["main", "release/*"] pr: branches: - include: ["master", "release/*"] + include: ["main", "release/*"] steps: - task: NodeTool@0 @@ -31,8 +31,8 @@ steps: git remote add distro "https://github.com/$VSCODE_MIXIN_REPO.git" git fetch distro - # Push master branch into oss/master - git push distro origin/master:refs/heads/oss/master + # Push main branch into oss/main + git push distro origin/main:refs/heads/oss/main # Push every release branch into oss/release git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push distro diff --git a/build/azure-pipelines/exploration-build.yml b/build/azure-pipelines/exploration-build.yml index 22e2602d..719e6e46 100644 --- a/build/azure-pipelines/exploration-build.yml +++ b/build/azure-pipelines/exploration-build.yml @@ -28,9 +28,9 @@ steps: git config user.name "VSCode" git checkout origin/electron-11.x.y - git merge origin/master + git merge origin/main - # Push master branch into exploration branch + # Push main branch into exploration branch git push origin HEAD:electron-11.x.y displayName: Sync & Merge Exploration diff --git a/build/azure-pipelines/linux/product-build-alpine.yml b/build/azure-pipelines/linux/product-build-alpine.yml index a2bbb119..4a1b8a2c 100644 --- a/build/azure-pipelines/linux/product-build-alpine.yml +++ b/build/azure-pipelines/linux/product-build-alpine.yml @@ -69,6 +69,7 @@ steps: displayName: Extract node_modules cache - script: | + set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) @@ -132,7 +133,3 @@ steps: artifact: vscode-server-linux-alpine-web displayName: Publish web server archive condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) - - - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: "Component Detection" - continueOnError: true diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index b704d953..28f509cb 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -67,6 +67,7 @@ steps: condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['VSCODE_ARCH'], 'x64')) - script: | + set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) @@ -144,14 +145,14 @@ steps: set -e DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" displayName: Run unit tests (Electron) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e DISPLAY=:10 yarn test-browser --build --browser chromium --tfs "Browser Unit Tests" displayName: Run unit tests (Browser) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -172,7 +173,7 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \ DISPLAY=:10 ./scripts/test-integration.sh --build --tfs "Integration Tests" displayName: Run integration tests (Electron) - timeoutInMinutes: 5 + timeoutInMinutes: 10 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -180,7 +181,7 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-linux-$(VSCODE_ARCH)" \ DISPLAY=:10 ./resources/server/test/test-web-integration.sh --browser chromium displayName: Run integration tests (Browser) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -192,7 +193,7 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \ DISPLAY=:10 ./resources/server/test/test-remote-integration.sh displayName: Run remote integration tests (Electron) - timeoutInMinutes: 5 + timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - task: PublishPipelineArtifact@0 @@ -286,7 +287,3 @@ steps: artifactName: "snap-$(VSCODE_ARCH)" targetPath: .build/linux/snap-tarball condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) - - - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: "Component Detection" - continueOnError: true diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 4d376246..011f8d4f 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -5,7 +5,7 @@ schedules: displayName: Mon-Fri at 7:00 branches: include: - - master + - main parameters: - name: VSCODE_QUALITY diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 08e3f694..5c386c94 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -50,6 +50,7 @@ steps: displayName: Extract node_modules cache - script: | + set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) @@ -136,3 +137,15 @@ steps: targetPath: $(Build.ArtifactStagingDirectory)/compilation.tar.gz artifactName: Compilation displayName: Publish compilation artifact + + - script: | + set -e + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn download-builtin-extensions-cg + displayName: Built-in extensions component details + + - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: "Component Detection" + inputs: + sourceScanPath: $(Build.SourcesDirectory) + continueOnError: true diff --git a/build/azure-pipelines/publish-types/publish-types.yml b/build/azure-pipelines/publish-types/publish-types.yml index 0e3f4e4d..09964dc6 100644 --- a/build/azure-pipelines/publish-types/publish-types.yml +++ b/build/azure-pipelines/publish-types/publish-types.yml @@ -61,7 +61,7 @@ steps: TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`) CHANNEL="G1C14HJ2F" - MESSAGE="DefinitelyTyped/DefinitelyTyped#vscode-types-$TAG_VERSION created. Endgame master, please open this link, examine changes and create a PR:" + MESSAGE="DefinitelyTyped/DefinitelyTyped#vscode-types-$TAG_VERSION created. Endgame champion, please open this link, examine changes and create a PR:" LINK="https://github.com/DefinitelyTyped/DefinitelyTyped/compare/vscode-types-$TAG_VERSION?quick_pull=1&body=Updating%20VS%20Code%20Extension%20API.%20See%20https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fvscode%2Fissues%2F70175%20for%20details." MESSAGE2="[@eamodio, @jrieken, @kmaetzel, @egamma]. Please review and merge PR to publish @types/vscode." diff --git a/build/azure-pipelines/publish-types/update-types.ts b/build/azure-pipelines/publish-types/update-types.ts index bbce6722..eae002e2 100644 --- a/build/azure-pipelines/publish-types/update-types.ts +++ b/build/azure-pipelines/publish-types/update-types.ts @@ -72,7 +72,7 @@ function getNewFileHeader(tag: string) { `/*---------------------------------------------------------------------------------------------`, ` * Copyright (c) Microsoft Corporation. All rights reserved.`, ` * Licensed under the MIT License.`, - ` * See https://github.com/microsoft/vscode/blob/master/LICENSE.txt for license information.`, + ` * See https://github.com/microsoft/vscode/blob/main/LICENSE.txt for license information.`, ` *--------------------------------------------------------------------------------------------*/`, ``, `/**`, diff --git a/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml index 05aa68fe..0a8e1c36 100644 --- a/build/azure-pipelines/web/product-build-web.yml +++ b/build/azure-pipelines/web/product-build-web.yml @@ -60,6 +60,7 @@ steps: displayName: Extract node_modules cache - script: | + set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 03558003..5ca1f825 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -65,8 +65,10 @@ steps: condition: and(succeeded(), eq(variables.NODE_MODULES_RESTORED, 'true')) displayName: Extract node_modules cache - - script: | - npx https://aka.ms/enablesecurefeed standAlone + - powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { npx https://aka.ms/enablesecurefeed standAlone } timeoutInMinutes: 5 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -320,7 +322,3 @@ steps: artifact: vscode-server-win32-$(VSCODE_ARCH)-web displayName: Publish web server archive condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - - - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: "Component Detection" - continueOnError: true diff --git a/build/ext.js b/build/ext.js deleted file mode 100644 index 11bd9f27..00000000 --- a/build/ext.js +++ /dev/null @@ -1,207 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const fs = require('fs').promises; -const path = require('path'); -const cp = require('child_process'); -const os = require('os'); -const mkdirp = require('mkdirp'); -const product = require('../product.json'); -const root = path.resolve(path.join(__dirname, '..', '..')); -const exists = (path) => fs.stat(path).then(() => true, () => false); - -const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json'); - -async function readControlFile() { - try { - return JSON.parse(await fs.readFile(controlFilePath, 'utf8')); - } catch (err) { - return {}; - } -} - -async function writeControlFile(control) { - await mkdirp(path.dirname(controlFilePath)); - await fs.writeFile(controlFilePath, JSON.stringify(control, null, ' ')); -} - -async function exec(cmd, args, opts = {}) { - return new Promise((c, e) => { - const child = cp.spawn(cmd, args, { stdio: 'inherit', env: process.env, ...opts }); - child.on('close', code => code === 0 ? c() : e(`Returned ${code}`)); - }); -} - -function getFolderPath(extDesc) { - const folder = extDesc.repo.replace(/.*\//, ''); - return folderPath = path.join(root, folder); -} - -async function getExtensionType(folderPath) { - const pkg = JSON.parse(await fs.readFile(path.join(folderPath, 'package.json'), 'utf8')); - - if (pkg['contributes']['themes'] || pkg['contributes']['iconThemes']) { - return 'theme'; - } else if (pkg['contributes']['grammars']) { - return 'grammar'; - } else { - return 'misc'; - } -} - -async function initExtension(extDesc) { - const folderPath = getFolderPath(extDesc); - - if (!await exists(folderPath)) { - console.log(`⏳ git clone: ${extDesc.name}`); - await exec('git', ['clone', `${extDesc.repo}.git`], { cwd: root }); - } - - const type = await getExtensionType(folderPath); - return { path: folderPath, type, ...extDesc }; -} - -async function createWorkspace(type, extensions) { - const workspaceName = `vscode-${type}-extensions.code-workspace`; - const workspacePath = path.join(root, workspaceName); - const workspace = { folders: extensions.map(ext => ({ path: path.basename(ext.path) })) }; - - if (!await exists(workspacePath)) { - console.log(`✅ create workspace: ${workspaceName}`); - } - - await fs.writeFile(workspacePath, JSON.stringify(workspace, undefined, ' ')); -} - -async function init() { - const extensions = []; - - for (const extDesc of product.builtInExtensions) { - extensions.push(await initExtension(extDesc)); - } - - await createWorkspace('all', extensions); - - const byType = extensions - .reduce((m, e) => m.set(e.type, [...(m.get(e.type) || []), e]), new Map()); - - for (const [type, extensions] of byType) { - await createWorkspace(type, extensions); - } - - return byType; -} - -async function status() { - const byType = await init(); - const control = await readControlFile(); - - for (const [type, extensions] of byType) { - console.log(`${type} (${extensions.length} extensions):`); - - const maxWidth = Math.max(...extensions.map(e => e.name.length)); - for (const ext of extensions) { - console.log(` ${ext.name.padEnd(maxWidth, ' ')} ➡ ${control[ext.name]}`); - } - } - - console.log(`total: ${product.builtInExtensions.length} extensions`); -} - -async function each([cmd, ...args], opts) { - await init(); - - for (const extDesc of product.builtInExtensions) { - const folderPath = getFolderPath(extDesc); - - if (opts.type) { - const type = await getExtensionType(folderPath); - - if (type !== opts.type) { - continue; - } - } - - console.log(`👉 ${extDesc.name}`); - await exec(cmd, args, { cwd: folderPath }); - } -} - -async function _link(extensions, opts, fn) { - await init(); - - const control = await readControlFile(); - - for (const extDesc of product.builtInExtensions) { - if (extensions.length > 0 && extensions.indexOf(extDesc.name) === -1) { - continue; - } - - if (opts.type) { - const folderPath = getFolderPath(extDesc); - const type = await getExtensionType(folderPath); - - if (type !== opts.type) { - continue; - } - } - - await fn(control, extDesc); - } - - await writeControlFile(control); -} - -async function link(extensions, opts) { - await _link(extensions, opts, async (control, extDesc) => { - const ext = await initExtension(extDesc); - control[extDesc.name] = ext.path; - console.log(`👉 link: ${extDesc.name} ➡ ${ext.path}`); - }); -} - -async function unlink(extensions, opts) { - await _link(extensions, opts, async (control, extDesc) => { - control[extDesc.name] = 'marketplace'; - console.log(`👉 unlink: ${extDesc.name}`); - }); -} - -if (require.main === module) { - const { program } = require('commander'); - - program.version('0.0.1'); - - program - .command('init') - .description('Initialize workspace with built-in extensions') - .action(init); - - program - .command('status') - .description('Print extension status') - .action(status); - - program - .command('each ') - .option('-t, --type ', 'Specific type only') - .description('Run a command in each extension repository') - .allowUnknownOption() - .action(each); - - program - .command('link [extensions...]') - .option('-t, --type ', 'Specific type only') - .description('Link with code-oss') - .action(link); - - program - .command('unlink [extensions...]') - .option('-t, --type ', 'Specific type only') - .description('Unlink from code-oss') - .action(unlink); - - program.parseAsync(process.argv); -} diff --git a/build/filters.js b/build/filters.js index 968a3085..07bdfcbc 100644 --- a/build/filters.js +++ b/build/filters.js @@ -44,6 +44,7 @@ module.exports.indentationFilter = [ '!src/vs/base/node/cpuUsage.sh', '!test/unit/assert.js', '!resources/linux/snap/electron-launch', + '!build/ext.js', // except specific folders '!test/automation/out/**', @@ -85,6 +86,8 @@ module.exports.indentationFilter = [ '!**/*.Dockerfile', '!**/*.dockerfile', '!extensions/markdown-language-features/media/*.js', + '!extensions/markdown-language-features/notebook-out/*.js', + '!extensions/notebook-markdown-extensions/notebook-out/*.js', '!extensions/simple-browser/media/*.js', ]; diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index 7ef97f15..230082e4 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -49,7 +49,7 @@ let BUNDLED_FILE_HEADER = [ ' * Copyright (c) Microsoft Corporation. All rights reserved.', ' * Version: ' + headerVersion, ' * Released under the MIT license', - ' * https://github.com/microsoft/vscode/blob/master/LICENSE.txt', + ' * https://github.com/microsoft/vscode/blob/main/LICENSE.txt', ' *-----------------------------------------------------------*/', '' ].join('\n'); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 6d3a3690..e3ca3514 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -52,13 +52,13 @@ const vscodeResources = [ 'out-build/bootstrap-amd.js', 'out-build/bootstrap-node.js', 'out-build/bootstrap-window.js', - 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,html,jpg}', '!out-build/vs/code/browser/**/*.html', '!out-build/vs/editor/standalone/**/*.svg', 'out-build/vs/base/common/performance.js', 'out-build/vs/base/node/languagePacks.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', + 'out-build/vs/base/node/userDataPath.js', 'out-build/vs/base/browser/ui/codicons/codicon/**', 'out-build/vs/base/parts/sandbox/electron-browser/preload.js', 'out-build/vs/workbench/browser/media/*-theme.css', @@ -284,6 +284,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op let result = all .pipe(util.skipDirectories()) .pipe(util.fixWin32DirectoryPermissions()) + .pipe(filter(['**', '!**/.github/**'], { dot: true })) // https://github.com/microsoft/vscode/issues/116523 .pipe(electron(_.extend({}, config, { platform, arch: arch === 'armhf' ? 'arm' : arch, ffmpegChromium: true }))) .pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version'], { dot: true })); @@ -526,7 +527,7 @@ gulp.task(task.define( if (!shouldSetupSettingsSearch()) { const branch = process.env.BUILD_SOURCEBRANCH; - console.log(`Only runs on master and release branches, not ${branch}`); + console.log(`Only runs on main and release branches, not ${branch}`); return; } @@ -552,21 +553,21 @@ gulp.task(task.define( function shouldSetupSettingsSearch() { const branch = process.env.BUILD_SOURCEBRANCH; - return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0); + return branch && (/\/main$/.test(branch) || branch.indexOf('/release/') >= 0); } function getSettingsSearchBuildId(packageJson) { try { const branch = process.env.BUILD_SOURCEBRANCH; const branchId = branch.indexOf('/release/') >= 0 ? 0 : - /\/master$/.test(branch) ? 1 : + /\/main$/.test(branch) ? 1 : 2; // Some unexpected branch const out = cp.execSync(`git rev-list HEAD --count`); const count = parseInt(out.toString()); // - // 1.25.1, 1,234,567 commits, master = 1250112345671 + // 1.25.1, 1,234,567 commits, main = 1250112345671 return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId; } catch (e) { throw new Error('Could not determine build number: ' + e.toString()); diff --git a/build/lib/builtInExtensions.ts b/build/lib/builtInExtensions.ts index 20f2ee0a..af444def 100644 --- a/build/lib/builtInExtensions.ts +++ b/build/lib/builtInExtensions.ts @@ -17,7 +17,7 @@ import { Stream } from 'stream'; const mkdirp = require('mkdirp'); -interface IExtensionDefinition { +export interface IExtensionDefinition { name: string; version: string; repo: string; diff --git a/build/lib/builtInExtensionsCG.js b/build/lib/builtInExtensionsCG.js new file mode 100644 index 00000000..10bf38f8 --- /dev/null +++ b/build/lib/builtInExtensionsCG.js @@ -0,0 +1,79 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +const got_1 = require("got"); +const fs = require("fs"); +const path = require("path"); +const url = require("url"); +const ansiColors = require("ansi-colors"); +const root = path.dirname(path.dirname(__dirname)); +const rootCG = path.join(root, 'extensionsCG'); +const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8')); +const builtInExtensions = productjson.builtInExtensions; +const webBuiltInExtensions = productjson.webBuiltInExtensions; +const token = process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || undefined; +const contentBasePath = 'raw.githubusercontent.com'; +const contentFileNames = ['package.json', 'package-lock.json', 'yarn.lock']; +async function downloadExtensionDetails(extension) { + var _a, _b, _c; + const extensionLabel = `${extension.name}@${extension.version}`; + const repository = url.parse(extension.repo).path.substr(1); + const repositoryContentBaseUrl = `https://${token ? `${token}@` : ''}${contentBasePath}/${repository}/v${extension.version}`; + const promises = []; + for (const fileName of contentFileNames) { + promises.push(new Promise(resolve => { + got_1.default(`${repositoryContentBaseUrl}/${fileName}`) + .then(response => { + resolve({ fileName, body: response.rawBody }); + }) + .catch(error => { + if (error.response.statusCode === 404) { + resolve({ fileName, body: undefined }); + } + else { + resolve({ fileName, body: null }); + } + }); + })); + } + console.log(extensionLabel); + const results = await Promise.all(promises); + for (const result of results) { + if (result.body) { + const extensionFolder = path.join(rootCG, extension.name); + fs.mkdirSync(extensionFolder, { recursive: true }); + fs.writeFileSync(path.join(extensionFolder, result.fileName), result.body); + console.log(` - ${result.fileName} ${ansiColors.green('✔︎')}`); + } + else if (result.body === undefined) { + console.log(` - ${result.fileName} ${ansiColors.yellow('⚠️')}`); + } + else { + console.log(` - ${result.fileName} ${ansiColors.red('🛑')}`); + } + } + // Validation + if (!((_a = results.find(r => r.fileName === 'package.json')) === null || _a === void 0 ? void 0 : _a.body)) { + // throw new Error(`The "package.json" file could not be found for the built-in extension - ${extensionLabel}`); + } + if (!((_b = results.find(r => r.fileName === 'package-lock.json')) === null || _b === void 0 ? void 0 : _b.body) && + !((_c = results.find(r => r.fileName === 'yarn.lock')) === null || _c === void 0 ? void 0 : _c.body)) { + // throw new Error(`The "package-lock.json"/"yarn.lock" could not be found for the built-in extension - ${extensionLabel}`); + } +} +async function main() { + for (const extension of [...builtInExtensions, ...webBuiltInExtensions]) { + await downloadExtensionDetails(extension); + } +} +main().then(() => { + console.log(`Built-in extensions component data downloaded ${ansiColors.green('✔︎')}`); + process.exit(0); +}, err => { + console.log(`Built-in extensions component data could not be downloaded ${ansiColors.red('🛑')}`); + console.error(err); + process.exit(1); +}); diff --git a/build/lib/builtInExtensionsCG.ts b/build/lib/builtInExtensionsCG.ts new file mode 100644 index 00000000..45785529 --- /dev/null +++ b/build/lib/builtInExtensionsCG.ts @@ -0,0 +1,83 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import got from 'got'; +import * as fs from 'fs'; +import * as path from 'path'; +import * as url from 'url'; +import ansiColors = require('ansi-colors'); +import { IExtensionDefinition } from './builtInExtensions'; + +const root = path.dirname(path.dirname(__dirname)); +const rootCG = path.join(root, 'extensionsCG'); +const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8')); +const builtInExtensions = productjson.builtInExtensions; +const webBuiltInExtensions = productjson.webBuiltInExtensions; +const token = process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || undefined; + +const contentBasePath = 'raw.githubusercontent.com'; +const contentFileNames = ['package.json', 'package-lock.json', 'yarn.lock']; + +async function downloadExtensionDetails(extension: IExtensionDefinition): Promise { + const extensionLabel = `${extension.name}@${extension.version}`; + const repository = url.parse(extension.repo).path!.substr(1); + const repositoryContentBaseUrl = `https://${token ? `${token}@` : ''}${contentBasePath}/${repository}/v${extension.version}`; + + const promises = []; + for (const fileName of contentFileNames) { + promises.push(new Promise<{ fileName: string, body: Buffer | undefined | null }>(resolve => { + got(`${repositoryContentBaseUrl}/${fileName}`) + .then(response => { + resolve({ fileName, body: response.rawBody }); + }) + .catch(error => { + if (error.response.statusCode === 404) { + resolve({ fileName, body: undefined }); + } else { + resolve({ fileName, body: null }); + } + }); + })); + } + + console.log(extensionLabel); + const results = await Promise.all(promises); + for (const result of results) { + if (result.body) { + const extensionFolder = path.join(rootCG, extension.name); + fs.mkdirSync(extensionFolder, { recursive: true }); + fs.writeFileSync(path.join(extensionFolder, result.fileName), result.body); + console.log(` - ${result.fileName} ${ansiColors.green('✔︎')}`); + } else if (result.body === undefined) { + console.log(` - ${result.fileName} ${ansiColors.yellow('⚠️')}`); + } else { + console.log(` - ${result.fileName} ${ansiColors.red('🛑')}`); + } + } + + // Validation + if (!results.find(r => r.fileName === 'package.json')?.body) { + // throw new Error(`The "package.json" file could not be found for the built-in extension - ${extensionLabel}`); + } + if (!results.find(r => r.fileName === 'package-lock.json')?.body && + !results.find(r => r.fileName === 'yarn.lock')?.body) { + // throw new Error(`The "package-lock.json"/"yarn.lock" could not be found for the built-in extension - ${extensionLabel}`); + } +} + +async function main(): Promise { + for (const extension of [...builtInExtensions, ...webBuiltInExtensions]) { + await downloadExtensionDetails(extension); + } +} + +main().then(() => { + console.log(`Built-in extensions component data downloaded ${ansiColors.green('✔︎')}`); + process.exit(0); +}, err => { + console.log(`Built-in extensions component data could not be downloaded ${ansiColors.red('🛑')}`); + console.error(err); + process.exit(1); +}); diff --git a/build/lib/electron.ts b/build/lib/electron.ts index beb1b571..06c8033e 100644 --- a/build/lib/electron.ts +++ b/build/lib/electron.ts @@ -32,7 +32,7 @@ export const config = { version: util.getElectronVersion(), productAppName: product.nameLong, companyName: 'Microsoft Corporation', - copyright: 'Copyright (C) 2019 Microsoft. All rights reserved', + copyright: 'Copyright (C) 2021 Microsoft. All rights reserved', darwinIcon: 'resources/darwin/code.icns', darwinBundleIdentifier: product.darwinBundleIdentifier, darwinApplicationCategoryType: 'public.app-category.developer-tools', diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index bb2ed8a7..aae62a1a 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -218,6 +218,10 @@ "name": "vs/workbench/contrib/webviewPanel", "project": "vscode-workbench" }, + { + "name": "vs/workbench/contrib/workspace", + "project": "vscode-workbench" + }, { "name": "vs/workbench/contrib/workspaces", "project": "vscode-workbench" @@ -294,6 +298,10 @@ "name": "vs/workbench/services/files", "project": "vscode-workbench" }, + { + "name": "vs/workbench/services/history", + "project": "vscode-workbench" + }, { "name": "vs/workbench/services/log", "project": "vscode-workbench" diff --git a/build/monaco/README-npm.md b/build/monaco/README-npm.md index ee0ffc6e..737e06bb 100644 --- a/build/monaco/README-npm.md +++ b/build/monaco/README-npm.md @@ -11,4 +11,4 @@ a good page describing the code editor's features is [here](https://code.visuals This npm module contains the core editor functionality, as it comes from the [vscode repository](https://github.com/microsoft/vscode). ## License -[MIT](https://github.com/microsoft/vscode/blob/master/LICENSE.txt) +[MIT](https://github.com/microsoft/vscode/blob/main/LICENSE.txt) diff --git a/build/npm/dirs.js b/build/npm/dirs.js index 17e97a0c..202219eb 100644 --- a/build/npm/dirs.js +++ b/build/npm/dirs.js @@ -31,6 +31,7 @@ exports.dirs = [ 'extensions/markdown-language-features', 'extensions/merge-conflict', 'extensions/microsoft-authentication', + 'extensions/notebook-markdown-extensions', 'extensions/npm', 'extensions/php-language-features', 'extensions/search-result', diff --git a/build/npm/update-all-grammars.js b/build/npm/update-all-grammars.js index 9ca9f856..ec7d2e84 100644 --- a/build/npm/update-all-grammars.js +++ b/build/npm/update-all-grammars.js @@ -7,40 +7,41 @@ const cp = require('child_process'); const fs = require('fs'); const path = require('path'); -/** - * @param {string} location - */ -function updateGrammar(location) { - const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; - const result = cp.spawnSync(npm, ['run', 'update-grammar'], { - cwd: location, - stdio: 'inherit' +async function spawn(cmd, args, opts) { + return new Promise((c, e) => { + const child = cp.spawn(cmd, args, { shell: true, stdio: 'inherit', env: process.env, ...opts }); + child.on('close', code => code === 0 ? c() : e(`Returned ${code}`)); }); +} - if (result.error || result.status !== 0) { +async function main() { + await spawn('yarn', [], { cwd: 'extensions' }); + + for (const extension of fs.readdirSync('extensions')) { + try { + let packageJSON = JSON.parse(fs.readFileSync(path.join('extensions', extension, 'package.json')).toString()); + if (!(packageJSON && packageJSON.scripts && packageJSON.scripts['update-grammar'])) { + continue; + } + } catch { + continue; + } + + await spawn(`npm`, ['run', 'update-grammar'], { cwd: `extensions/${extension}` }); + } + + // run integration tests + + if (process.platform === 'win32') { + cp.spawn('.\\scripts\\test-integration.bat', [], { env: process.env, stdio: 'inherit' }); + } else { + cp.spawn('/bin/bash', ['./scripts/test-integration.sh'], { env: process.env, stdio: 'inherit' }); + } +} + +if (require.main === module) { + main().catch(err => { + console.error(err); process.exit(1); - } + }); } - -const allExtensionFolders = fs.readdirSync('extensions'); -const extensions = allExtensionFolders.filter(e => { - try { - let packageJSON = JSON.parse(fs.readFileSync(path.join('extensions', e, 'package.json')).toString()); - return packageJSON && packageJSON.scripts && packageJSON.scripts['update-grammar']; - } catch (e) { - return false; - } -}); - -console.log(`Updating ${extensions.length} grammars...`); - -extensions.forEach(extension => updateGrammar(`extensions/${extension}`)); - -// run integration tests - -if (process.platform === 'win32') { - cp.spawn('.\\scripts\\test-integration.bat', [], { env: process.env, stdio: 'inherit' }); -} else { - cp.spawn('/bin/bash', ['./scripts/test-integration.sh'], { env: process.env, stdio: 'inherit' }); -} - diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js deleted file mode 100644 index ff568a61..00000000 --- a/build/npm/update-grammar.js +++ /dev/null @@ -1,176 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -var path = require('path'); -var fs = require('fs'); -var plist = require('fast-plist'); -var cson = require('cson-parser'); -var https = require('https'); -var url = require('url'); - -let commitDate = '0000-00-00'; - -/** - * @param {string} urlString - */ -function getOptions(urlString) { - var _url = url.parse(urlString); - var headers = { - 'User-Agent': 'VSCode' - }; - var token = process.env['GITHUB_TOKEN']; - if (token) { - headers['Authorization'] = 'token ' + token; - } - return { - protocol: _url.protocol, - host: _url.host, - port: _url.port, - path: _url.path, - headers: headers - }; -} - -/** - * @param {string} url - * @param {number} redirectCount - */ -function download(url, redirectCount) { - return new Promise((c, e) => { - var content = ''; - https.get(getOptions(url), function (response) { - response.on('data', function (data) { - content += data.toString(); - }).on('end', function () { - if (response.statusCode === 403 && response.headers['x-ratelimit-remaining'] === '0') { - e('GitHub API rate exceeded. Set GITHUB_TOKEN environment variable to increase rate limit.'); - return; - } - let count = redirectCount || 0; - if (count < 5 && response.statusCode >= 300 && response.statusCode <= 303 || response.statusCode === 307) { - let location = response.headers['location']; - if (location) { - console.log("Redirected " + url + " to " + location); - download(location, count + 1).then(c, e); - return; - } - } - c(content); - }); - }).on('error', function (err) { - e(err.message); - }); - }); -} - -function getCommitSha(repoId, repoPath) { - var commitInfo = 'https://api.github.com/repos/' + repoId + '/commits?path=' + repoPath; - return download(commitInfo).then(function (content) { - try { - let lastCommit = JSON.parse(content)[0]; - return Promise.resolve({ - commitSha: lastCommit.sha, - commitDate: lastCommit.commit.author.date - }); - } catch (e) { - return Promise.reject(new Error("Failed extracting the SHA: " + content)); - } - }); -} - -exports.update = function (repoId, repoPath, dest, modifyGrammar, version = 'master', packageJsonPathOverride = '') { - var contentPath = 'https://raw.githubusercontent.com/' + repoId + `/${version}/` + repoPath; - console.log('Reading from ' + contentPath); - return download(contentPath).then(function (content) { - var ext = path.extname(repoPath); - var grammar; - if (ext === '.tmLanguage' || ext === '.plist') { - grammar = plist.parse(content); - } else if (ext === '.cson') { - grammar = cson.parse(content); - } else if (ext === '.json' || ext === '.JSON-tmLanguage') { - grammar = JSON.parse(content); - } else { - return Promise.reject(new Error('Unknown file extension: ' + ext)); - } - if (modifyGrammar) { - modifyGrammar(grammar); - } - return getCommitSha(repoId, repoPath).then(function (info) { - let result = { - information_for_contributors: [ - 'This file has been converted from https://github.com/' + repoId + '/blob/master/' + repoPath, - 'If you want to provide a fix or improvement, please create a pull request against the original repository.', - 'Once accepted there, we are happy to receive an update request.' - ] - }; - - if (info) { - result.version = 'https://github.com/' + repoId + '/commit/' + info.commitSha; - } - - let keys = ['name', 'scopeName', 'comment', 'injections', 'patterns', 'repository']; - for (let key of keys) { - if (grammar.hasOwnProperty(key)) { - result[key] = grammar[key]; - } - } - - try { - fs.writeFileSync(dest, JSON.stringify(result, null, '\t').replace(/\n/g, '\r\n')); - let cgmanifestRead = JSON.parse(fs.readFileSync('./cgmanifest.json').toString()); - let promises = new Array(); - const currentCommitDate = info.commitDate.substr(0, 10); - - // Add commit sha to cgmanifest. - if (currentCommitDate > commitDate) { - let packageJsonPath = 'https://raw.githubusercontent.com/' + repoId + `/${info.commitSha}/`; - if (packageJsonPathOverride) { - packageJsonPath += packageJsonPathOverride; - } - packageJsonPath += 'package.json'; - for (let i = 0; i < cgmanifestRead.registrations.length; i++) { - if (cgmanifestRead.registrations[i].component.git.repositoryUrl.substr(cgmanifestRead.registrations[i].component.git.repositoryUrl.length - repoId.length, repoId.length) === repoId) { - cgmanifestRead.registrations[i].component.git.commitHash = info.commitSha; - commitDate = currentCommitDate; - promises.push(download(packageJsonPath).then(function (packageJson) { - if (packageJson) { - try { - cgmanifestRead.registrations[i].version = JSON.parse(packageJson).version; - } catch (e) { - console.log('Cannot get version. File does not exist at ' + packageJsonPath); - } - } - })); - break; - } - } - } - Promise.all(promises).then(function (allResult) { - fs.writeFileSync('./cgmanifest.json', JSON.stringify(cgmanifestRead, null, '\t').replace(/\n/g, '\r\n')); - }); - if (info) { - console.log('Updated ' + path.basename(dest) + ' to ' + repoId + '@' + info.commitSha.substr(0, 7) + ' (' + currentCommitDate + ')'); - } else { - console.log('Updated ' + path.basename(dest)); - } - } catch (e) { - return Promise.reject(e); - } - }); - - }, console.error).catch(e => { - console.error(e); - process.exit(1); - }); -}; - -if (path.basename(process.argv[1]) === 'update-grammar.js') { - for (var i = 3; i < process.argv.length; i += 2) { - exports.update(process.argv[2], process.argv[i], process.argv[i + 1]); - } -} diff --git a/build/package.json b/build/package.json index d1d0b42e..cb70e429 100644 --- a/build/package.json +++ b/build/package.json @@ -4,8 +4,10 @@ "license": "MIT", "devDependencies": { "@azure/cosmos": "^3.9.3", + "@azure/storage-blob": "^12.4.0", "@types/ansi-colors": "^3.2.0", "@types/azure": "0.9.19", + "@types/byline": "^4.2.32", "@types/debounce": "^1.0.0", "@types/eslint": "4.16.1", "@types/fancy-log": "^1.3.0", @@ -20,8 +22,10 @@ "@types/mime": "0.0.29", "@types/minimatch": "^3.0.3", "@types/minimist": "^1.2.1", + "@types/mkdirp": "^1.0.1", "@types/mocha": "^8.2.0", "@types/node": "^12.19.9", + "@types/p-limit": "^2.2.0", "@types/plist": "^3.0.2", "@types/pump": "^1.0.1", "@types/request": "^2.47.0", @@ -34,17 +38,21 @@ "@typescript-eslint/parser": "^3.3.0", "applicationinsights": "1.0.8", "azure-storage": "^2.1.0", + "byline": "^5.0.0", + "colors": "^1.4.0", "commander": "^7.0.0", "electron-osx-sign": "^0.4.16", "esbuild": "^0.8.30", "fs-extra": "^9.1.0", + "got": "11.8.1", "iconv-lite-umd": "0.6.8", "jsonc-parser": "^2.3.0", "mime": "^1.4.1", "mkdirp": "^1.0.4", + "p-limit": "^3.1.0", "plist": "^3.0.1", "source-map": "0.6.1", - "typescript": "4.2.0-dev.20201207", + "typescript": "^4.3.0-dev.20210216", "vsce": "1.48.0", "vscode-universal": "deepak1556/universal#61454d96223b774c53cda10f72c2098c0ce02d58" }, diff --git a/build/yarn.lock b/build/yarn.lock index d958ed21..67dd26a7 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -2,6 +2,73 @@ # yarn lockfile v1 +"@azure/abort-controller@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.0.2.tgz#822405c966b2aec16fb62c1b19d37eaccf231995" + integrity sha512-XUyTo+bcyxHEf+jlN2MXA7YU9nxVehaubngHV1MIZZaqYmZqykkoeAz/JMMEeR7t3TcyDwbFa3Zw8BZywmIx4g== + dependencies: + tslib "^2.0.0" + +"@azure/core-asynciterator-polyfill@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz#dcccebb88406e5c76e0e1d52e8cc4c43a68b3ee7" + integrity sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg== + +"@azure/core-auth@^1.1.3": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.1.4.tgz#af9a334acf3cb9c49e6013e6caf6dc9d43476030" + integrity sha512-+j1embyH1jqf04AIfJPdLafd5SC1y6z1Jz4i+USR1XkTp6KM8P5u4/AjmWMVoEQdM/M29PJcRDZcCEWjK9S1bw== + dependencies: + "@azure/abort-controller" "^1.0.0" + tslib "^2.0.0" + +"@azure/core-http@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-1.2.2.tgz#a6f7717184fd2657d3acabd1d64dfdc0bd531ce3" + integrity sha512-9eu2OcbR7e44gqBy4U1Uv8NTWgLIMwKXMEGgO2MahsJy5rdTiAhs5fJHQffPq8uX2MFh21iBODwO9R/Xlov88A== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-auth" "^1.1.3" + "@azure/core-tracing" "1.0.0-preview.9" + "@azure/logger" "^1.0.0" + "@opentelemetry/api" "^0.10.2" + "@types/node-fetch" "^2.5.0" + "@types/tunnel" "^0.0.1" + form-data "^3.0.0" + node-fetch "^2.6.0" + process "^0.11.10" + tough-cookie "^4.0.0" + tslib "^2.0.0" + tunnel "^0.0.6" + uuid "^8.3.0" + xml2js "^0.4.19" + +"@azure/core-lro@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@azure/core-lro/-/core-lro-1.0.3.tgz#1ddfb4ecdb81ce87b5f5d972ffe2acbbc46e524e" + integrity sha512-Py2crJ84qx1rXkzIwfKw5Ni4WJuzVU7KAF6i1yP3ce8fbynUeu8eEWS4JGtSQgU7xv02G55iPDROifmSDbxeHA== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-http" "^1.2.0" + events "^3.0.0" + tslib "^2.0.0" + +"@azure/core-paging@^1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.1.3.tgz#3587c9898a0530cacb64bab216d7318468aa5efc" + integrity sha512-his7Ah40ThEYORSpIAwuh6B8wkGwO/zG7gqVtmSE4WAJ46e36zUDXTKReUCLBDc6HmjjApQQxxcRFy5FruG79A== + dependencies: + "@azure/core-asynciterator-polyfill" "^1.0.0" + +"@azure/core-tracing@1.0.0-preview.9": + version "1.0.0-preview.9" + resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.0.0-preview.9.tgz#84f3b85572013f9d9b85e1e5d89787aa180787eb" + integrity sha512-zczolCLJ5QG42AEPQ+Qg9SRYNUyB+yZ5dzof4YEc+dyWczO9G2sBqbAjLB7IqrsdHN2apkiB2oXeDKCsq48jug== + dependencies: + "@opencensus/web-types" "0.0.7" + "@opentelemetry/api" "^0.10.2" + tslib "^2.0.0" + "@azure/cosmos@^3.9.3": version "3.9.3" resolved "https://registry.yarnpkg.com/@azure/cosmos/-/cosmos-3.9.3.tgz#7e95ff92e5c3e9da7e8316bc50c9cc928be6c1d6" @@ -19,6 +86,28 @@ universal-user-agent "^6.0.0" uuid "^8.3.0" +"@azure/logger@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.0.1.tgz#19b333203d1b2931353d8879e814b64a7274837a" + integrity sha512-QYQeaJ+A5x6aMNu8BG5qdsVBnYBop9UMwgUvGihSjf1PdZZXB+c/oMdM2ajKwzobLBh9e9QuMQkN9iL+IxLBLA== + dependencies: + tslib "^2.0.0" + +"@azure/storage-blob@^12.4.0": + version "12.4.0" + resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.4.0.tgz#7127ddd9f413105e2c3688691bc4c6245d0806b3" + integrity sha512-OnhVSoKD1HzBB79/rFzPbC4w9TdzFXeoOwkX+aIu3rb8qvN0VaqvUqZXSrBCyG2LcLyVkY4MPCJQBrmEUm9kvw== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-http" "^1.2.0" + "@azure/core-lro" "^1.0.2" + "@azure/core-paging" "^1.1.1" + "@azure/core-tracing" "1.0.0-preview.9" + "@azure/logger" "^1.0.0" + "@opentelemetry/api" "^0.10.2" + events "^3.0.0" + tslib "^2.0.0" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -26,6 +115,35 @@ dependencies: cross-spawn "^7.0.1" +"@opencensus/web-types@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@opencensus/web-types/-/web-types-0.0.7.tgz#4426de1fe5aa8f624db395d2152b902874f0570a" + integrity sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g== + +"@opentelemetry/api@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.10.2.tgz#9647b881f3e1654089ff7ea59d587b2d35060654" + integrity sha512-GtpMGd6vkzDMYcpu2t9LlhEgMy/SzBwRnz48EejlRArYqZzqSzAsKmegUK7zHgl+EOIaK9mKHhnRaQu3qw20cA== + dependencies: + "@opentelemetry/context-base" "^0.10.2" + +"@opentelemetry/context-base@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.10.2.tgz#55bea904b2b91aa8a8675df9eaba5961bddb1def" + integrity sha512-hZNKjKOYsckoOEgBziGMnBcX0M7EtstnCmwz5jZUOUYwlZ+/xxX6z3jPu1XVO2Jivk0eLfuP9GP+vFD49CMetw== + +"@sindresorhus/is@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" + integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== + +"@szmarczak/http-timer@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" + integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + dependencies: + defer-to-connect "^2.0.0" + "@types/ansi-colors@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@types/ansi-colors/-/ansi-colors-3.2.0.tgz#3e4fe85d9131ce1c6994f3040bd0b25306c16a6e" @@ -38,6 +156,23 @@ dependencies: "@types/node" "*" +"@types/byline@^4.2.32": + version "4.2.32" + resolved "https://registry.yarnpkg.com/@types/byline/-/byline-4.2.32.tgz#9d35ec15968056118548412ee24c2c3026c997dc" + integrity sha512-qtlm/J6XOO9p+Ep/ZB5+mCFEDhzWDDHWU4a1eReN7lkPZXW9rkloq2jcAhvKKmlO5tL2GSvKROb+PTsNVhBiyQ== + dependencies: + "@types/node" "*" + +"@types/cacheable-request@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" + integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/caseless@*": version "0.12.1" resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" @@ -174,6 +309,11 @@ "@types/undertaker" "*" "@types/vinyl-fs" "*" +"@types/http-cache-semantics@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" + integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + "@types/js-beautify@*": version "1.8.0" resolved "https://registry.yarnpkg.com/@types/js-beautify/-/js-beautify-1.8.0.tgz#0369d3d0e1f35a6aec07cb4da2ee2bcda111367c" @@ -184,6 +324,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/keyv@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" + integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + dependencies: + "@types/node" "*" + "@types/mime@0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" @@ -199,11 +346,26 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== +"@types/mkdirp@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6" + integrity sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q== + dependencies: + "@types/node" "*" + "@types/mocha@^8.2.0": version "8.2.0" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== +"@types/node-fetch@^2.5.0": + version "2.5.8" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" + integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node@*": version "8.0.51" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" @@ -219,6 +381,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== +"@types/p-limit@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/p-limit/-/p-limit-2.2.0.tgz#94a608e9b258a6c6156a13d1a14fd720dba70b97" + integrity sha512-fGFbybl1r0oE9mqgfc2EHHUin9ZL5rbQIexWI6jYRU1ADVn4I3LHzT+g/kpPpZsfp8PB94CQ655pfAjNF8LP6A== + dependencies: + p-limit "*" + "@types/plist@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" @@ -244,6 +413,13 @@ "@types/node" "*" "@types/tough-cookie" "*" +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/rimraf@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" @@ -271,6 +447,13 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.2.tgz#e0d481d8bb282ad8a8c9e100ceb72c995fb5e709" integrity sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA== +"@types/tunnel@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@types/tunnel/-/tunnel-0.0.1.tgz#0d72774768b73df26f25df9184273a42da72b19c" + integrity sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A== + dependencies: + "@types/node" "*" + "@types/underscore@^1.8.9": version "1.8.9" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.8.9.tgz#fef41f800cd23db1b4f262ddefe49cd952d82323" @@ -536,6 +719,29 @@ buffer-fill@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" + integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^2.0.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -558,12 +764,24 @@ chromium-pickle-js@^0.2.0: resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -combined-stream@^1.0.6, combined-stream@~1.0.6: +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -652,6 +870,18 @@ debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +defer-to-connect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" + integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -750,6 +980,13 @@ electron-osx-sign@^0.4.16: minimist "^1.2.0" plist "^3.0.1" +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -792,6 +1029,11 @@ estraverse@^4.1.0, estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -829,6 +1071,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -853,6 +1104,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -884,6 +1142,23 @@ glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +got@11.8.1: + version "11.8.1" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d" + integrity sha512-9aYdZL+6nHmvJwHALLwKSUZ0hMwGaJGYv3hoPLPgnT8BoBXm1SjnZeky+91tfwJaDzun2s4RsBRy48IEYv2q2Q== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -928,6 +1203,11 @@ htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^3.0.6" +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -937,6 +1217,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.0-beta.5.2" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" + integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + iconv-lite-umd@0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0" @@ -1009,6 +1297,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-edm-parser@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/json-edm-parser/-/json-edm-parser-0.1.2.tgz#1e60b0fef1bc0af67bc0d146dfdde5486cd615b4" @@ -1060,6 +1353,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +keyv@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" + integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== + dependencies: + json-buffer "3.0.1" + linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" @@ -1082,6 +1382,11 @@ lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -1135,6 +1440,16 @@ mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -1177,6 +1492,11 @@ node-fetch@^2.6.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -1189,7 +1509,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -1214,6 +1534,18 @@ osenv@^0.1.3: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + +p-limit@*, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + parse-semver@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" @@ -1267,11 +1599,24 @@ process-nextick-args@~1.0.6: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= -psl@^1.1.28: +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -1287,6 +1632,11 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + read@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -1350,6 +1700,18 @@ request@^2.86.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +resolve-alpn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" + integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -1370,6 +1732,11 @@ sax@0.5.x: resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + semaphore@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" @@ -1448,6 +1815,15 @@ tmp@0.0.29: dependencies: os-tmpdir "~1.0.1" +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -1485,6 +1861,11 @@ tunnel@0.0.4: resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213" integrity sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM= +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -1498,16 +1879,16 @@ typed-rest-client@^0.9.0: tunnel "0.0.4" underscore "1.8.3" -typescript@4.2.0-dev.20201207: - version "4.2.0-dev.20201207" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.0-dev.20201207.tgz#19a34bc7d2d42a7467c512c63f135587ac848807" - integrity sha512-fPHBDi/fgdX4WiRC7cFVv/aL069PgUaDWuLYUSHatWZujz/Lkc9bkf/zL3rKdNSCxlNKAMs3fhJv/yompOphZA== - typescript@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +typescript@^4.3.0-dev.20210216: + version "4.3.0-dev.20210216" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.0-dev.20210216.tgz#233327e6094008c02265ba140f8d9ece9133421e" + integrity sha512-pJLcC/kqnE+0rftTRc2/gYBkz9nl+kJfaU8sSOLYnzUvD8p+LOZMzXfaLoKPdGFJ6U9+Ox/sYV9HBTJVEjSTYg== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" @@ -1528,6 +1909,11 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -1640,6 +2026,14 @@ xml2js@0.2.8: dependencies: sax "0.5.x" +xml2js@^0.4.19: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + xmlbuilder@>=11.0.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" @@ -1650,6 +2044,11 @@ xmlbuilder@^9.0.7: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmldom@0.1.x: version "0.1.31" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" @@ -1675,6 +2074,11 @@ yazl@^2.2.2: dependencies: buffer-crc32 "~0.2.3" +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + zone.js@0.7.6: version "0.7.6" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" diff --git a/cgmanifest.json b/cgmanifest.json index a47ba0d6..3349aa8b 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "8805b996e0d8cfb6e3921f9b586366bafb125b59" + "commitHash": "1631fc9b0c0d84283105a669c98bbeb8bab39109" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "11.2.1" + "version": "11.3.0" }, { "component": { diff --git a/extensions/bat/package.json b/extensions/bat/package.json index dc543aef..f01e5d35 100644 --- a/extensions/bat/package.json +++ b/extensions/bat/package.json @@ -1,29 +1,47 @@ { - "name": "bat", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "bat", - "extensions": [ ".bat", ".cmd"], - "aliases": [ "Batch", "bat" ], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "bat", - "scopeName": "source.batchfile", - "path": "./syntaxes/batchfile.tmLanguage.json" - }], - "snippets": [{ - "language": "bat", - "path": "./snippets/batchfile.code-snippets" - }] - } + "name": "bat", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "^1.52.0" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "bat", + "extensions": [ + ".bat", + ".cmd" + ], + "aliases": [ + "Batch", + "bat" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "bat", + "scopeName": "source.batchfile", + "path": "./syntaxes/batchfile.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "bat", + "path": "./snippets/batchfile.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/bat/package.nls.json b/extensions/bat/package.nls.json index c5052ca0..00a69b39 100644 --- a/extensions/bat/package.nls.json +++ b/extensions/bat/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Windows Bat Language Basics", "description": "Provides snippets, syntax highlighting, bracket matching and folding in Windows batch files." -} \ No newline at end of file +} diff --git a/extensions/bat/yarn.lock b/extensions/bat/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/bat/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/clojure/package.json b/extensions/clojure/package.json index 33427843..4ea659b3 100644 --- a/extensions/clojure/package.json +++ b/extensions/clojure/package.json @@ -1,25 +1,45 @@ { - "name": "clojure", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js atom/language-clojure grammars/clojure.cson ./syntaxes/clojure.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "clojure", - "aliases": ["Clojure", "clojure"], - "extensions": [".clj", ".cljs", ".cljc", ".cljx", ".clojure", ".edn"], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "clojure", - "scopeName": "source.clojure", - "path": "./syntaxes/clojure.tmLanguage.json" - }] - } -} \ No newline at end of file + "name": "clojure", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-clojure grammars/clojure.cson ./syntaxes/clojure.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "clojure", + "aliases": [ + "Clojure", + "clojure" + ], + "extensions": [ + ".clj", + ".cljs", + ".cljc", + ".cljx", + ".clojure", + ".edn" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "clojure", + "scopeName": "source.clojure", + "path": "./syntaxes/clojure.tmLanguage.json" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/clojure/package.nls.json b/extensions/clojure/package.nls.json index 30bff280..b1396de7 100644 --- a/extensions/clojure/package.nls.json +++ b/extensions/clojure/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Clojure Language Basics", "description": "Provides syntax highlighting and bracket matching in Clojure files." -} \ No newline at end of file +} diff --git a/extensions/clojure/yarn.lock b/extensions/clojure/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/clojure/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/coffeescript/package.json b/extensions/coffeescript/package.json index 9bc96cca..e8fda02d 100644 --- a/extensions/coffeescript/package.json +++ b/extensions/coffeescript/package.json @@ -1,34 +1,54 @@ { - "name": "coffeescript", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js atom/language-coffee-script grammars/coffeescript.cson ./syntaxes/coffeescript.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "coffeescript", - "extensions": [ ".coffee", ".cson", ".iced" ], - "aliases": [ "CoffeeScript", "coffeescript", "coffee" ], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "coffeescript", - "scopeName": "source.coffee", - "path": "./syntaxes/coffeescript.tmLanguage.json" - }], - "breakpoints": [ - { - "language": "coffeescript" - } - ], - "snippets": [{ - "language": "coffeescript", - "path": "./snippets/coffeescript.code-snippets" - }] - } + "name": "coffeescript", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-coffee-script grammars/coffeescript.cson ./syntaxes/coffeescript.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "coffeescript", + "extensions": [ + ".coffee", + ".cson", + ".iced" + ], + "aliases": [ + "CoffeeScript", + "coffeescript", + "coffee" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "coffeescript", + "scopeName": "source.coffee", + "path": "./syntaxes/coffeescript.tmLanguage.json" + } + ], + "breakpoints": [ + { + "language": "coffeescript" + } + ], + "snippets": [ + { + "language": "coffeescript", + "path": "./snippets/coffeescript.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/coffeescript/yarn.lock b/extensions/coffeescript/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/coffeescript/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 26348576..f1670e83 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -40,8 +40,12 @@ "keybindings.json", "extensions.json", "argv.json", - "profiles.json" - ] + "profiles.json", + ".devcontainer.json" + ], + "filenamePatterns": [ + "**/.devcontainer/devcontainer.json" + ] } ], "jsonValidation": [ @@ -129,5 +133,9 @@ }, "devDependencies": { "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/configuration-editing/package.nls.json b/extensions/configuration-editing/package.nls.json index 20a9c1af..860ed491 100644 --- a/extensions/configuration-editing/package.nls.json +++ b/extensions/configuration-editing/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Configuration Editing", "description": "Provides capabilities (advanced IntelliSense, auto-fixing) in configuration files like settings, launch, and extension recommendation files." -} \ No newline at end of file +} diff --git a/extensions/configuration-editing/schemas/attachContainer.schema.json b/extensions/configuration-editing/schemas/attachContainer.schema.json index b3b86533..d7846aad 100644 --- a/extensions/configuration-editing/schemas/attachContainer.schema.json +++ b/extensions/configuration-editing/schemas/attachContainer.schema.json @@ -19,6 +19,63 @@ "type": "integer" } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + } + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "settings": { "$ref": "vscode://schemas/settings/machine", "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time." diff --git a/extensions/configuration-editing/schemas/devContainer.schema.generated.json b/extensions/configuration-editing/schemas/devContainer.schema.generated.json index 8cdf4009..91f9249a 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.generated.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.generated.json @@ -127,6 +127,64 @@ "minimum": 0 } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + }, + "additionalProperties": false + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "remoteEnv": { "type": "object", "additionalProperties": { @@ -326,6 +384,64 @@ "minimum": 0 } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + }, + "additionalProperties": false + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "remoteEnv": { "type": "object", "additionalProperties": { @@ -501,6 +617,64 @@ "minimum": 0 } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + }, + "additionalProperties": false + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "remoteEnv": { "type": "object", "additionalProperties": { @@ -642,6 +816,64 @@ "minimum": 0 } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + }, + "additionalProperties": false + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "remoteEnv": { "type": "object", "additionalProperties": { @@ -752,6 +984,64 @@ "minimum": 0 } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + }, + "additionalProperties": false + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "remoteEnv": { "type": "object", "additionalProperties": { diff --git a/extensions/configuration-editing/schemas/devContainer.schema.src.json b/extensions/configuration-editing/schemas/devContainer.schema.src.json index ba140ba9..bac86dc8 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.src.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.src.json @@ -33,6 +33,63 @@ "minimum": 0 } }, + "portsAttributes": { + "type": "object", + "patternProperties": { + "^\\d+(\\-\\d+)?$": { + "type": "object", + "description": "A port, or range of ports (ex. \"40000-55000\") that the attributes should apply to", + "properties": { + "onAutoForward": { + "type": "string", + "enum": [ + "notify", + "openBrowser", + "openPreview", + "silent", + "ignore" + ], + "enumDescriptions": [ + "Shows a notification when a port is automatically forwarded.", + "Opens the browser when the port is automatically forwarded. Depending on your settings, this could open an embedded browser.", + "Opens a preview in the same window when the port is automatically forwarded.", + "Shows no notification and takes no action when this port is automatically forwarded.", + "This port will not be automatically forwarded." + ], + "description": "Defines the action that occurs when the port is discovered for automatic forwarding", + "default": "notify" + }, + "elevateIfNeeded": { + "type": "boolean", + "description": "Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port.", + "default": false + }, + "label": { + "type": "string", + "description": "Label that will be shown in the UI for this port.", + "default": "Labeled Port" + } + }, + "default": { + "label": "Labeled Port", + "onAutoForward": "notify" + } + } + }, + "markdownDescription": "Set default properties that are applied when a specific port number is forwarded. For example:\n\n```\n\"3000\": {\n \"label\": \"Labeled Port\"\n},\n\"40000-55000\": {\n \"onAutoForward\": \"ignore\"\n}\n```", + "defaultSnippets": [ + { + "body": { + "${1:3000}": { + "label": "${2:My Port}", + "onAutoForward": "notify" + } + } + } + ], + "errorMessage": "Must be a port number or a range of port numbers", + "additionalProperties": false + }, "remoteEnv": { "type": "object", "additionalProperties": { @@ -205,7 +262,7 @@ "$ref": "#/definitions/buildOptions" } ] - } + } }, "required": [ "build" diff --git a/extensions/configuration-editing/src/configurationEditingMain.ts b/extensions/configuration-editing/src/configurationEditingMain.ts index a3ef34f3..822668f6 100644 --- a/extensions/configuration-editing/src/configurationEditingMain.ts +++ b/extensions/configuration-editing/src/configurationEditingMain.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getLocation, parse, visit } from 'jsonc-parser'; +import { getLocation, JSONPath, parse, visit } from 'jsonc-parser'; import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { SettingsDocument } from './settingsDocumentHelper'; @@ -22,6 +22,9 @@ export function activate(context: vscode.ExtensionContext): void { // task.json variable suggestions context.subscriptions.push(registerVariableCompletions('**/tasks.json')); + + // keybindings.json/package.json context key suggestions + context.subscriptions.push(registerContextKeyCompletions()); } function registerSettingsCompletions(): vscode.Disposable { @@ -136,3 +139,83 @@ vscode.languages.registerDocumentSymbolProvider({ pattern: '**/launch.json', lan return result; } }, { label: 'Launch Targets' }); + +function registerContextKeyCompletions(): vscode.Disposable { + type ContextKeyInfo = { key: string, type?: string, description?: string }; + + const paths = new Map([ + [{ language: 'jsonc', pattern: '**/keybindings.json' }, [ + ['*', 'when'] + ]], + [{ language: 'json', pattern: '**/package.json' }, [ + ['contributes', 'menus', '*', '*', 'when'], + ['contributes', 'views', '*', '*', 'when'], + ['contributes', 'viewsWelcome', '*', 'when'], + ['contributes', 'keybindings', '*', 'when'], + ['contributes', 'keybindings', 'when'], + ]] + ]); + + return vscode.languages.registerCompletionItemProvider( + [...paths.keys()], + { + async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken) { + + const location = getLocation(document.getText(), document.offsetAt(position)); + + if (location.isAtPropertyKey) { + return; + } + + let isValidLocation = false; + for (const [key, value] of paths) { + if (vscode.languages.match(key, document)) { + if (value.some(location.matches.bind(location))) { + isValidLocation = true; + break; + } + } + } + + if (!isValidLocation) { + return; + } + + // for JSON everything with quotes is a word + const jsonWord = document.getWordRangeAtPosition(position); + if (!jsonWord || jsonWord.start.isEqual(position) || jsonWord.end.isEqual(position)) { + // we aren't inside a "JSON word" or on its quotes + return; + } + + let replacing: vscode.Range | undefined; + if (jsonWord.end.character - jsonWord.start.character === 2 || document.getWordRangeAtPosition(position, /\s+/)) { + // empty json word or on whitespace + replacing = new vscode.Range(position, position); + } else { + replacing = document.getWordRangeAtPosition(position, /[a-zA-Z.]+/); + } + + if (!replacing) { + return; + } + const inserting = replacing.with(undefined, position); + + const data = await vscode.commands.executeCommand('getContextKeyInfo'); + if (token.isCancellationRequested || !data) { + return; + } + + const result = new vscode.CompletionList(); + for (const item of data) { + const completion = new vscode.CompletionItem(item.key, vscode.CompletionItemKind.Constant); + completion.detail = item.type; + completion.range = { replacing, inserting }; + completion.documentation = item.description; + result.items.push(completion); + } + return result; + } + } + ); +} diff --git a/extensions/cpp/build/update-grammars.js b/extensions/cpp/build/update-grammars.js index 28b4ca92..a09e9470 100644 --- a/extensions/cpp/build/update-grammars.js +++ b/extensions/cpp/build/update-grammars.js @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -var updateGrammar = require('../../../build/npm/update-grammar'); +var updateGrammar = require('vscode-grammar-updater'); updateGrammar.update('jeff-hykin/cpp-textmate-grammar', 'syntaxes/c.tmLanguage.json', './syntaxes/c.tmLanguage.json', undefined, 'master', 'source/languages/cpp/'); updateGrammar.update('jeff-hykin/cpp-textmate-grammar', 'syntaxes/cpp.tmLanguage.json', './syntaxes/cpp.tmLanguage.json', undefined, 'master', 'source/languages/cpp/'); diff --git a/extensions/cpp/package.json b/extensions/cpp/package.json index 1c8a244d..4d30a114 100644 --- a/extensions/cpp/package.json +++ b/extensions/cpp/package.json @@ -1,87 +1,91 @@ { - "name": "cpp", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "*" - }, - "scripts": { - "update-grammar": "node ./build/update-grammars.js" - }, - "contributes": { - "languages": [ - { - "id": "c", - "extensions": [ - ".c", - ".i" - ], - "aliases": [ - "C", - "c" - ], - "configuration": "./language-configuration.json" - }, - { - "id": "cpp", - "extensions": [ - ".cpp", - ".cc", - ".cxx", - ".c++", - ".hpp", - ".hh", + "name": "cpp", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ./build/update-grammars.js" + }, + "contributes": { + "languages": [ + { + "id": "c", + "extensions": [ + ".c", + ".i" + ], + "aliases": [ + "C", + "c" + ], + "configuration": "./language-configuration.json" + }, + { + "id": "cpp", + "extensions": [ + ".cpp", + ".cc", + ".cxx", + ".c++", + ".hpp", + ".hh", ".hxx", ".h++", - ".h", - ".ii", - ".ino", - ".inl", - ".ipp", - ".hpp.in", - ".h.in" - ], - "aliases": [ - "C++", - "Cpp", - "cpp" - ], - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "c", - "scopeName": "source.c", - "path": "./syntaxes/c.tmLanguage.json" - }, - { - "language": "cpp", - "scopeName": "source.cpp.embedded.macro", - "path": "./syntaxes/cpp.embedded.macro.tmLanguage.json" - }, - { - "language": "cpp", - "scopeName": "source.cpp", - "path": "./syntaxes/cpp.tmLanguage.json" - }, - { - "scopeName": "source.c.platform", - "path": "./syntaxes/platform.tmLanguage.json" - } - ], - "snippets": [ - { - "language": "c", - "path": "./snippets/c.code-snippets" - }, - { - "language": "cpp", - "path": "./snippets/cpp.code-snippets" - } - ] - } + ".h", + ".ii", + ".ino", + ".inl", + ".ipp", + ".hpp.in", + ".h.in" + ], + "aliases": [ + "C++", + "Cpp", + "cpp" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "c", + "scopeName": "source.c", + "path": "./syntaxes/c.tmLanguage.json" + }, + { + "language": "cpp", + "scopeName": "source.cpp.embedded.macro", + "path": "./syntaxes/cpp.embedded.macro.tmLanguage.json" + }, + { + "language": "cpp", + "scopeName": "source.cpp", + "path": "./syntaxes/cpp.tmLanguage.json" + }, + { + "scopeName": "source.c.platform", + "path": "./syntaxes/platform.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "c", + "path": "./snippets/c.code-snippets" + }, + { + "language": "cpp", + "path": "./snippets/cpp.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/cpp/package.nls.json b/extensions/cpp/package.nls.json index 558bf452..6c86a684 100644 --- a/extensions/cpp/package.nls.json +++ b/extensions/cpp/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "C/C++ Language Basics", "description": "Provides snippets, syntax highlighting, bracket matching and folding in C/C++ files." -} \ No newline at end of file +} diff --git a/extensions/cpp/yarn.lock b/extensions/cpp/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/cpp/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/csharp/package.json b/extensions/csharp/package.json index 74bbb283..df77c14c 100644 --- a/extensions/csharp/package.json +++ b/extensions/csharp/package.json @@ -1,7 +1,7 @@ { "name": "csharp", - "displayName": "%displayName%", - "description": "%description%", + "displayName": "%displayName%", + "description": "%description%", "version": "1.0.0", "publisher": "vscode", "license": "MIT", @@ -9,9 +9,8 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json" - }, - + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json" + }, "contributes": { "languages": [ { @@ -35,9 +34,15 @@ "path": "./syntaxes/csharp.tmLanguage.json" } ], - "snippets": [{ - "language": "csharp", - "path": "./snippets/csharp.code-snippets" - }] + "snippets": [ + { + "language": "csharp", + "path": "./snippets/csharp.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/csharp/package.nls.json b/extensions/csharp/package.nls.json index bdc20611..dff81ccd 100644 --- a/extensions/csharp/package.nls.json +++ b/extensions/csharp/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "C# Language Basics", "description": "Provides snippets, syntax highlighting, bracket matching and folding in C# files." -} \ No newline at end of file +} diff --git a/extensions/csharp/yarn.lock b/extensions/csharp/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/csharp/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 7450976d..174c668b 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -61,6 +61,18 @@ "default": true, "description": "%css.validate.desc%" }, + "css.hover.documentation": { + "type": "boolean", + "scope": "resource", + "default": true, + "description": "%css.hover.documentation%" + }, + "css.hover.references": { + "type": "boolean", + "scope": "resource", + "default": true, + "description": "%css.hover.references%" + }, "css.lint.compatibleVendorPrefixes": { "type": "string", "scope": "resource", @@ -316,6 +328,18 @@ "default": true, "description": "%scss.validate.desc%" }, + "scss.hover.documentation": { + "type": "boolean", + "scope": "resource", + "default": true, + "description": "%scss.hover.documentation%" + }, + "scss.hover.references": { + "type": "boolean", + "scope": "resource", + "default": true, + "description": "%scss.hover.references%" + }, "scss.lint.compatibleVendorPrefixes": { "type": "string", "scope": "resource", @@ -561,6 +585,18 @@ "default": true, "description": "%less.validate.desc%" }, + "less.hover.documentation": { + "type": "boolean", + "scope": "resource", + "default": true, + "description": "%less.hover.documentation%" + }, + "less.hover.references": { + "type": "boolean", + "scope": "resource", + "default": true, + "description": "%less.hover.references%" + }, "less.lint.compatibleVendorPrefixes": { "type": "string", "scope": "resource", @@ -812,5 +848,9 @@ }, "devDependencies": { "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/css-language-features/package.nls.json b/extensions/css-language-features/package.nls.json index 7f2ffb5c..b27b4163 100644 --- a/extensions/css-language-features/package.nls.json +++ b/extensions/css-language-features/package.nls.json @@ -28,6 +28,8 @@ "css.trace.server.desc": "Traces the communication between VS Code and the CSS language server.", "css.validate.title": "Controls CSS validation and problem severities.", "css.validate.desc": "Enables or disables all validations.", + "css.hover.documentation": "Show tag and attribute documentation in CSS hovers.", + "css.hover.references": "Show references to MDN in CSS hovers.", "less.title": "LESS", "less.completion.triggerPropertyValueCompletion.desc": "By default, VS Code triggers property value completion after selecting a CSS property. Use this setting to disable this behavior.", "less.completion.completePropertyWithSemicolon.desc": "Insert semicolon at end of line when completing CSS properties", @@ -53,6 +55,8 @@ "less.lint.zeroUnits.desc": "No unit for zero needed.", "less.validate.title": "Controls LESS validation and problem severities.", "less.validate.desc": "Enables or disables all validations.", + "less.hover.documentation": "Show tag and attribute documentation in LESS hovers.", + "less.hover.references": "Show references to MDN in LESS hovers.", "scss.title": "SCSS (Sass)", "scss.completion.triggerPropertyValueCompletion.desc": "By default, VS Code triggers property value completion after selecting a CSS property. Use this setting to disable this behavior.", "scss.completion.completePropertyWithSemicolon.desc": "Insert semicolon at end of line when completing CSS properties", @@ -78,6 +82,8 @@ "scss.lint.zeroUnits.desc": "No unit for zero needed.", "scss.validate.title": "Controls SCSS validation and problem severities.", "scss.validate.desc": "Enables or disables all validations.", + "scss.hover.documentation": "Show tag and attribute documentation in SCSS hovers.", + "scss.hover.references": "Show references to MDN in SCSS hovers.", "css.colorDecorators.enable.deprecationMessage": "The setting `css.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`.", "scss.colorDecorators.enable.deprecationMessage": "The setting `scss.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`.", "less.colorDecorators.enable.deprecationMessage": "The setting `less.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`." diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index e271bfd7..f33c90ca 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -10,7 +10,7 @@ "main": "./out/node/cssServerMain", "browser": "./dist/browser/cssServerMain", "dependencies": { - "vscode-css-languageservice": "^5.0.3", + "vscode-css-languageservice": "^5.1.0", "vscode-languageserver": "^7.0.0", "vscode-uri": "^3.0.2" }, diff --git a/extensions/css-language-features/server/src/cssServer.ts b/extensions/css-language-features/server/src/cssServer.ts index e62a8ecc..cdfe37ff 100644 --- a/extensions/css-language-features/server/src/cssServer.ts +++ b/extensions/css-language-features/server/src/cssServer.ts @@ -206,10 +206,10 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) return runSafeAsync(async () => { const document = documents.get(textDocumentPosition.textDocument.uri); if (document) { - await dataProvidersReady; + const [settings,] = await Promise.all([getDocumentSettings(document), dataProvidersReady]); const styleSheet = stylesheets.get(document); const documentContext = getDocumentContext(document.uri, workspaceFolders); - return getLanguageService(document).doComplete2(document, textDocumentPosition.position, styleSheet, documentContext); + return getLanguageService(document).doComplete2(document, textDocumentPosition.position, styleSheet, documentContext, settings?.completion); } return null; }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); @@ -219,9 +219,9 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) return runSafeAsync(async () => { const document = documents.get(textDocumentPosition.textDocument.uri); if (document) { - await dataProvidersReady; + const [settings,] = await Promise.all([getDocumentSettings(document), dataProvidersReady]); const styleSheet = stylesheets.get(document); - return getLanguageService(document).doHover(document, textDocumentPosition.position, styleSheet); + return getLanguageService(document).doHover(document, textDocumentPosition.position, styleSheet, settings?.hover); } return null; }, null, `Error while computing hover for ${textDocumentPosition.textDocument.uri}`, token); diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 62acbd46..5f49fd38 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -12,10 +12,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.9.tgz#990ad687ad8b26ef6dcc34a4f69c33d40c95b679" integrity sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q== -vscode-css-languageservice@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.0.3.tgz#2d400a47e73d0bfc5bc0d3fdf5be487cfdca341b" - integrity sha512-KJt4jhCxqrgGrC02UsQsKw90dPkFknMHsH5HTInT7gkDRRfGFwEd+e2O1/E75br3TdFhvRmzjljYz5thZ58L3A== +vscode-css-languageservice@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.0.tgz#cd172d13e9e7ae23ba567c73778aee10475ff716" + integrity sha512-iLHd/WjRKgaZBXMNeUooHG+r0qlhJBkXa+3MpQQR6Rpm928cis/3OV2Mp1R80yAQevIMeDL32RIJfHoJCT/RRg== dependencies: vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.16.0" diff --git a/extensions/css/package.json b/extensions/css/package.json index 117f759d..6b3d8aeb 100644 --- a/extensions/css/package.json +++ b/extensions/css/package.json @@ -1,7 +1,7 @@ { "name": "css", - "displayName": "%displayName%", - "description": "%description%", + "displayName": "%displayName%", + "description": "%description%", "version": "1.0.0", "publisher": "vscode", "license": "MIT", @@ -9,7 +9,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js octref/language-css grammars/css.cson ./syntaxes/css.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin octref/language-css grammars/css.cson ./syntaxes/css.tmLanguage.json" }, "contributes": { "languages": [ @@ -38,5 +38,9 @@ } } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/css/package.nls.json b/extensions/css/package.nls.json index b4ff0da7..c4f690a0 100644 --- a/extensions/css/package.nls.json +++ b/extensions/css/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "CSS Language Basics", "description": "Provides syntax highlighting and bracket matching for CSS, LESS and SCSS files." -} \ No newline at end of file +} diff --git a/extensions/css/yarn.lock b/extensions/css/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/css/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/debug-auto-launch/package.json b/extensions/debug-auto-launch/package.json index 0f349851..c472d1e2 100644 --- a/extensions/debug-auto-launch/package.json +++ b/extensions/debug-auto-launch/package.json @@ -1,40 +1,44 @@ { - "name": "debug-auto-launch", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "^1.5.0" - }, - "activationEvents": [ - "*" - ], - "main": "./out/extension", - "scripts": { - "compile": "gulp compile-extension:debug-auto-launch", - "watch": "gulp watch-extension:debug-auto-launch" - }, - "contributes": { - "commands": [ - { - "command": "extension.node-debug.toggleAutoAttach", - "title": "%toggle.auto.attach%", - "category": "Debug" - } - ] - }, - "dependencies": { - "vscode-nls": "^4.0.0" - }, - "devDependencies": { - "@types/node": "^12.19.9" - }, - "prettier": { - "printWidth": 100, - "trailingComma": "all", - "singleQuote": true, - "arrowParens": "avoid" - } + "name": "debug-auto-launch", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "^1.5.0" + }, + "activationEvents": [ + "*" + ], + "main": "./out/extension", + "scripts": { + "compile": "gulp compile-extension:debug-auto-launch", + "watch": "gulp watch-extension:debug-auto-launch" + }, + "contributes": { + "commands": [ + { + "command": "extension.node-debug.toggleAutoAttach", + "title": "%toggle.auto.attach%", + "category": "Debug" + } + ] + }, + "dependencies": { + "vscode-nls": "^4.0.0" + }, + "devDependencies": { + "@types/node": "^12.19.9" + }, + "prettier": { + "printWidth": 100, + "trailingComma": "all", + "singleQuote": true, + "arrowParens": "avoid" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/debug-server-ready/package.json b/extensions/debug-server-ready/package.json index ac199f05..a942b2a8 100644 --- a/extensions/debug-server-ready/package.json +++ b/extensions/debug-server-ready/package.json @@ -1,143 +1,149 @@ { - "name": "debug-server-ready", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "^1.32.0" - }, - "activationEvents": [ - "onDebugResolve" - ], - "enableProposedApi": true, - "main": "./out/extension", - "scripts": { - "compile": "gulp compile-extension:debug-server-ready", - "watch": "gulp watch-extension:debug-server-ready" - }, - "contributes": { - "debuggers": [ - { - "type": "*", - "configurationAttributes": { - "launch": { - "properties": { - "serverReadyAction": { - "oneOf": [ - { - "type": "object", - "additionalProperties": false, - "markdownDescription": "%debug.server.ready.serverReadyAction.description%", - "default": { - "action": "openExternally" - }, - "properties": { - "action": { - "type": "string", - "enum": [ - "openExternally" - ], - "enumDescriptions": [ - "%debug.server.ready.action.openExternally.description%" - ], - "markdownDescription": "%debug.server.ready.action.description%", - "default": "openExternally" - }, - "pattern": { - "type": "string", - "markdownDescription": "%debug.server.ready.pattern.description%", - "default": "listening on port ([0-9]+)" - }, - "uriFormat": { - "type": "string", - "markdownDescription": "%debug.server.ready.uriFormat.description%", - "default": "http://localhost:%s" - } - } - }, - { - "type": "object", - "additionalProperties": false, - "markdownDescription": "%debug.server.ready.serverReadyAction.description%", - "default": { - "action": "openExternally" - }, - "properties": { - "action": { - "type": "string", - "enum": [ - "debugWithChrome" - ], - "enumDescriptions": [ - "%debug.server.ready.action.debugWithChrome.description%" - ], - "markdownDescription": "%debug.server.ready.action.description%", - "default": "openExternally" - }, - "pattern": { - "type": "string", - "markdownDescription": "%debug.server.ready.pattern.description%", - "default": "listening on port ([0-9]+)" - }, - "uriFormat": { - "type": "string", - "markdownDescription": "%debug.server.ready.uriFormat.description%", - "default": "http://localhost:%s" - }, - "webRoot": { - "type": "string", - "markdownDescription": "%debug.server.ready.webRoot.description%", - "default": "${workspaceFolder}" - } - } - }, - { - "type": "object", - "additionalProperties": false, - "markdownDescription": "%debug.server.ready.serverReadyAction.description%", - "default": { + "name": "debug-server-ready", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "^1.32.0" + }, + "activationEvents": [ + "onDebugResolve" + ], + "enableProposedApi": true, + "main": "./out/extension", + "scripts": { + "compile": "gulp compile-extension:debug-server-ready", + "watch": "gulp watch-extension:debug-server-ready" + }, + "contributes": { + "debuggers": [ + { + "type": "*", + "configurationAttributes": { + "launch": { + "properties": { + "serverReadyAction": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "markdownDescription": "%debug.server.ready.serverReadyAction.description%", + "default": { + "action": "openExternally" + }, + "properties": { + "action": { + "type": "string", + "enum": [ + "openExternally" + ], + "enumDescriptions": [ + "%debug.server.ready.action.openExternally.description%" + ], + "markdownDescription": "%debug.server.ready.action.description%", + "default": "openExternally" + }, + "pattern": { + "type": "string", + "markdownDescription": "%debug.server.ready.pattern.description%", + "default": "listening on port ([0-9]+)" + }, + "uriFormat": { + "type": "string", + "markdownDescription": "%debug.server.ready.uriFormat.description%", + "default": "http://localhost:%s" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "markdownDescription": "%debug.server.ready.serverReadyAction.description%", + "default": { + "action": "openExternally" + }, + "properties": { + "action": { + "type": "string", + "enum": [ + "debugWithChrome" + ], + "enumDescriptions": [ + "%debug.server.ready.action.debugWithChrome.description%" + ], + "markdownDescription": "%debug.server.ready.action.description%", + "default": "openExternally" + }, + "pattern": { + "type": "string", + "markdownDescription": "%debug.server.ready.pattern.description%", + "default": "listening on port ([0-9]+)" + }, + "uriFormat": { + "type": "string", + "markdownDescription": "%debug.server.ready.uriFormat.description%", + "default": "http://localhost:%s" + }, + "webRoot": { + "type": "string", + "markdownDescription": "%debug.server.ready.webRoot.description%", + "default": "${workspaceFolder}" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "markdownDescription": "%debug.server.ready.serverReadyAction.description%", + "default": { "action": "startDebugging", "name": "" }, - "required": ["name"], - "properties": { - "action": { - "type": "string", - "enum": [ - "startDebugging" - ], - "enumDescriptions": [ - "%debug.server.ready.action.startDebugging.description%" - ], - "markdownDescription": "%debug.server.ready.action.description%", - "default": "startDebugging" - }, - "pattern": { - "type": "string", - "markdownDescription": "%debug.server.ready.pattern.description%", - "default": "listening on port ([0-9]+)" - }, - "name": { - "type": "string", - "markdownDescription": "%debug.server.ready.debugConfigName.description%", - "default": "Launch Browser" - } - } - } - ] - } - } - } - } - } - ] - }, - "dependencies": { - "vscode-nls": "^4.0.0" - }, - "devDependencies": { - "@types/node": "^12.19.9" - } + "required": [ + "name" + ], + "properties": { + "action": { + "type": "string", + "enum": [ + "startDebugging" + ], + "enumDescriptions": [ + "%debug.server.ready.action.startDebugging.description%" + ], + "markdownDescription": "%debug.server.ready.action.description%", + "default": "startDebugging" + }, + "pattern": { + "type": "string", + "markdownDescription": "%debug.server.ready.pattern.description%", + "default": "listening on port ([0-9]+)" + }, + "name": { + "type": "string", + "markdownDescription": "%debug.server.ready.debugConfigName.description%", + "default": "Launch Browser" + } + } + } + ] + } + } + } + } + } + ] + }, + "dependencies": { + "vscode-nls": "^4.0.0" + }, + "devDependencies": { + "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/docker/package.json b/extensions/docker/package.json index a1cc782d..cdda622a 100644 --- a/extensions/docker/package.json +++ b/extensions/docker/package.json @@ -1,34 +1,57 @@ { - "name": "docker", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "dockerfile", - "extensions": [ ".dockerfile", ".containerfile" ], - "filenames": [ "Dockerfile", "Containerfile" ], - "filenamePatterns": [ "Dockerfile.*", "Containerfile.*" ], - "aliases": [ "Docker", "Dockerfile", "Containerfile" ], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "dockerfile", - "scopeName": "source.dockerfile", - "path": "./syntaxes/docker.tmLanguage.json" - }], - "configurationDefaults": { - "[dockerfile]": { - "editor.quickSuggestions": { - "strings": true - } - } - } - } + "name": "docker", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "dockerfile", + "extensions": [ + ".dockerfile", + ".containerfile" + ], + "filenames": [ + "Dockerfile", + "Containerfile" + ], + "filenamePatterns": [ + "Dockerfile.*", + "Containerfile.*" + ], + "aliases": [ + "Docker", + "Dockerfile", + "Containerfile" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "dockerfile", + "scopeName": "source.dockerfile", + "path": "./syntaxes/docker.tmLanguage.json" + } + ], + "configurationDefaults": { + "[dockerfile]": { + "editor.quickSuggestions": { + "strings": true + } + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/docker/package.nls.json b/extensions/docker/package.nls.json index 2a38ca3d..597ed85f 100644 --- a/extensions/docker/package.nls.json +++ b/extensions/docker/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Docker Language Basics", "description": "Provides syntax highlighting and bracket matching in Docker files." -} \ No newline at end of file +} diff --git a/extensions/docker/yarn.lock b/extensions/docker/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/docker/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index f3952751..4d26781c 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -1,445 +1,447 @@ { - "name": "emmet", - "displayName": "Emmet", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "^1.13.0" - }, - "icon": "images/icon.png", - "categories": [ - "Other" - ], - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-emmet" - }, - "activationEvents": [ - "onStartupFinished", - "onCommand:emmet.expandAbbreviation", - "onLanguage:html", - "onLanguage:css", - "onLanguage:scss", - "onLanguage:less" - ], - "main": "./out/node/emmetNodeMain", - "browser": "./dist/browser/emmetBrowserMain", - "contributes": { - "configuration": { - "type": "object", - "title": "Emmet", - "properties": { - "emmet.showExpandedAbbreviation": { - "type": [ - "string" - ], - "enum": [ - "never", - "always", - "inMarkupAndStylesheetFilesOnly" - ], - "default": "always", - "markdownDescription": "%emmetShowExpandedAbbreviation%" - }, - "emmet.showAbbreviationSuggestions": { - "type": "boolean", - "default": true, - "markdownDescription": "%emmetShowAbbreviationSuggestions%" - }, - "emmet.includeLanguages": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "default": {}, - "markdownDescription": "%emmetIncludeLanguages%" - }, - "emmet.variables": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "default": "en" - }, - "charset": { - "type": "string", - "default": "UTF-8" - } - }, - "default": {}, - "description": "%emmetVariables%" - }, - "emmet.syntaxProfiles": { - "type": "object", - "default": {}, - "description": "%emmetSyntaxProfiles%" - }, - "emmet.excludeLanguages": { - "type": "array", - "default": [ - "markdown" - ], - "description": "%emmetExclude%" - }, - "emmet.extensionsPath": { - "type": [ - "string", - "null" - ], - "default": null, - "description": "%emmetExtensionsPath%" - }, - "emmet.triggerExpansionOnTab": { - "type": "boolean", - "default": false, - "description": "%emmetTriggerExpansionOnTab%" - }, - "emmet.preferences": { - "type": "object", - "default": {}, - "description": "%emmetPreferences%", - "properties": { - "css.intUnit": { - "type": "string", - "default": "px", - "description": "%emmetPreferencesIntUnit%" - }, - "css.floatUnit": { - "type": "string", - "default": "em", - "description": "%emmetPreferencesFloatUnit%" - }, - "css.propertyEnd": { - "type": "string", - "default": ";", - "description": "%emmetPreferencesCssAfter%" - }, - "sass.propertyEnd": { - "type": "string", - "default": "", - "description": "%emmetPreferencesSassAfter%" - }, - "stylus.propertyEnd": { - "type": "string", - "default": "", - "description": "%emmetPreferencesStylusAfter%" - }, - "css.valueSeparator": { - "type": "string", - "default": ": ", - "description": "%emmetPreferencesCssBetween%" - }, - "sass.valueSeparator": { - "type": "string", - "default": ": ", - "description": "%emmetPreferencesSassBetween%" - }, - "stylus.valueSeparator": { - "type": "string", - "default": " ", - "description": "%emmetPreferencesStylusBetween%" - }, - "bem.elementSeparator": { - "type": "string", - "default": "__", - "description": "%emmetPreferencesBemElementSeparator%" - }, - "bem.modifierSeparator": { - "type": "string", - "default": "_", - "description": "%emmetPreferencesBemModifierSeparator%" - }, - "filter.commentBefore": { - "type": "string", - "default": "", - "description": "%emmetPreferencesFilterCommentBefore%" - }, - "filter.commentAfter": { - "type": "string", - "default": "\n", - "description": "%emmetPreferencesFilterCommentAfter%" - }, - "filter.commentTrigger": { - "type": "array", - "default": [ - "id", - "class" - ], - "description": "%emmetPreferencesFilterCommentTrigger%" - }, - "format.noIndentTags": { - "type": "array", - "default": [ - "html" - ], - "description": "%emmetPreferencesFormatNoIndentTags%" - }, - "format.forceIndentationForTags": { - "type": "array", - "default": [ - "body" - ], - "description": "%emmetPreferencesFormatForceIndentTags%" - }, - "profile.allowCompactBoolean": { - "type": "boolean", - "default": false, - "description": "%emmetPreferencesAllowCompactBoolean%" - }, - "css.webkitProperties": { - "type": "string", - "default": null, - "markdownDescription": "%emmetPreferencesCssWebkitProperties%" - }, - "css.mozProperties": { - "type": "string", - "default": null, - "markdownDescription": "%emmetPreferencesCssMozProperties%" - }, - "css.oProperties": { - "type": "string", - "default": null, - "markdownDescription": "%emmetPreferencesCssOProperties%" - }, - "css.msProperties": { - "type": "string", - "default": null, - "markdownDescription": "%emmetPreferencesCssMsProperties%" - }, - "css.fuzzySearchMinScore": { - "type": "number", - "default": 0.3, - "description": "%emmetPreferencesCssFuzzySearchMinScore%" - } - } - }, - "emmet.showSuggestionsAsSnippets": { - "type": "boolean", - "default": false, - "markdownDescription": "%emmetShowSuggestionsAsSnippets%" - }, - "emmet.optimizeStylesheetParsing": { - "type": "boolean", - "default": true, - "markdownDescription": "%emmetOptimizeStylesheetParsing%" - } - } + "name": "emmet", + "displayName": "Emmet", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "^1.13.0" + }, + "icon": "images/icon.png", + "categories": [ + "Other" + ], + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + }, + "activationEvents": [ + "onStartupFinished", + "onCommand:emmet.expandAbbreviation", + "onLanguage:html", + "onLanguage:css", + "onLanguage:scss", + "onLanguage:less" + ], + "main": "./out/node/emmetNodeMain", + "browser": "./dist/browser/emmetBrowserMain", + "contributes": { + "configuration": { + "type": "object", + "title": "Emmet", + "properties": { + "emmet.showExpandedAbbreviation": { + "type": [ + "string" + ], + "enum": [ + "never", + "always", + "inMarkupAndStylesheetFilesOnly" + ], + "default": "always", + "markdownDescription": "%emmetShowExpandedAbbreviation%" }, - "commands": [ - { - "command": "editor.emmet.action.wrapIndividualLinesWithAbbreviation", - "title": "%command.wrapIndividualLinesWithAbbreviation%", - "category": "Emmet" + "emmet.showAbbreviationSuggestions": { + "type": "boolean", + "default": true, + "markdownDescription": "%emmetShowAbbreviationSuggestions%" + }, + "emmet.includeLanguages": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "markdownDescription": "%emmetIncludeLanguages%" + }, + "emmet.variables": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "default": "en" }, - { - "command": "editor.emmet.action.wrapWithAbbreviation", - "title": "%command.wrapWithAbbreviation%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.removeTag", - "title": "%command.removeTag%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.updateTag", - "title": "%command.updateTag%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.matchTag", - "title": "%command.matchTag%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.balanceIn", - "title": "%command.balanceIn%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.balanceOut", - "title": "%command.balanceOut%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.prevEditPoint", - "title": "%command.prevEditPoint%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.nextEditPoint", - "title": "%command.nextEditPoint%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.mergeLines", - "title": "%command.mergeLines%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.selectPrevItem", - "title": "%command.selectPrevItem%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.selectNextItem", - "title": "%command.selectNextItem%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.splitJoinTag", - "title": "%command.splitJoinTag%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.toggleComment", - "title": "%command.toggleComment%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.evaluateMathExpression", - "title": "%command.evaluateMathExpression%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.updateImageSize", - "title": "%command.updateImageSize%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.incrementNumberByOneTenth", - "title": "%command.incrementNumberByOneTenth%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.incrementNumberByOne", - "title": "%command.incrementNumberByOne%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.incrementNumberByTen", - "title": "%command.incrementNumberByTen%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.decrementNumberByOneTenth", - "title": "%command.decrementNumberByOneTenth%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.decrementNumberByOne", - "title": "%command.decrementNumberByOne%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.decrementNumberByTen", - "title": "%command.decrementNumberByTen%", - "category": "Emmet" - }, - { - "command": "editor.emmet.action.reflectCSSValue", - "title": "%command.reflectCSSValue%", - "category": "Emmet" - }, - { - "command": "workbench.action.showEmmetCommands", - "title": "%command.showEmmetCommands%", - "category": "" + "charset": { + "type": "string", + "default": "UTF-8" } - ], - "menus": { - "commandPalette": [ - { - "command": "editor.emmet.action.wrapIndividualLinesWithAbbreviation" - }, - { - "command": "editor.emmet.action.wrapWithAbbreviation" - }, - { - "command": "editor.emmet.action.removeTag" - }, - { - "command": "editor.emmet.action.updateTag" - }, - { - "command": "editor.emmet.action.matchTag" - }, - { - "command": "editor.emmet.action.balanceIn" - }, - { - "command": "editor.emmet.action.balanceOut" - }, - { - "command": "editor.emmet.action.prevEditPoint" - }, - { - "command": "editor.emmet.action.nextEditPoint" - }, - { - "command": "editor.emmet.action.mergeLines" - }, - { - "command": "editor.emmet.action.selectPrevItem" - }, - { - "command": "editor.emmet.action.selectNextItem" - }, - { - "command": "editor.emmet.action.splitJoinTag" - }, - { - "command": "editor.emmet.action.toggleComment" - }, - { - "command": "editor.emmet.action.evaluateMathExpression" - }, - { - "command": "editor.emmet.action.updateImageSize", - "when": "resourceScheme =~ /^file$/" - }, - { - "command": "editor.emmet.action.incrementNumberByOneTenth" - }, - { - "command": "editor.emmet.action.incrementNumberByOne" - }, - { - "command": "editor.emmet.action.incrementNumberByTen" - }, - { - "command": "editor.emmet.action.decrementNumberByOneTenth" - }, - { - "command": "editor.emmet.action.decrementNumberByOne" - }, - { - "command": "editor.emmet.action.decrementNumberByTen" - }, - { - "command": "editor.emmet.action.reflectCSSValue" - } - ] + }, + "default": {}, + "description": "%emmetVariables%" + }, + "emmet.syntaxProfiles": { + "type": "object", + "default": {}, + "description": "%emmetSyntaxProfiles%" + }, + "emmet.excludeLanguages": { + "type": "array", + "default": [ + "markdown" + ], + "description": "%emmetExclude%" + }, + "emmet.extensionsPath": { + "type": [ + "string", + "array", + "null" + ], + "default": null, + "description": "%emmetExtensionsPath%" + }, + "emmet.triggerExpansionOnTab": { + "type": "boolean", + "default": false, + "description": "%emmetTriggerExpansionOnTab%" + }, + "emmet.preferences": { + "type": "object", + "default": {}, + "description": "%emmetPreferences%", + "properties": { + "css.intUnit": { + "type": "string", + "default": "px", + "description": "%emmetPreferencesIntUnit%" + }, + "css.floatUnit": { + "type": "string", + "default": "em", + "description": "%emmetPreferencesFloatUnit%" + }, + "css.propertyEnd": { + "type": "string", + "default": ";", + "description": "%emmetPreferencesCssAfter%" + }, + "sass.propertyEnd": { + "type": "string", + "default": "", + "description": "%emmetPreferencesSassAfter%" + }, + "stylus.propertyEnd": { + "type": "string", + "default": "", + "description": "%emmetPreferencesStylusAfter%" + }, + "css.valueSeparator": { + "type": "string", + "default": ": ", + "description": "%emmetPreferencesCssBetween%" + }, + "sass.valueSeparator": { + "type": "string", + "default": ": ", + "description": "%emmetPreferencesSassBetween%" + }, + "stylus.valueSeparator": { + "type": "string", + "default": " ", + "description": "%emmetPreferencesStylusBetween%" + }, + "bem.elementSeparator": { + "type": "string", + "default": "__", + "description": "%emmetPreferencesBemElementSeparator%" + }, + "bem.modifierSeparator": { + "type": "string", + "default": "_", + "description": "%emmetPreferencesBemModifierSeparator%" + }, + "filter.commentBefore": { + "type": "string", + "default": "", + "description": "%emmetPreferencesFilterCommentBefore%" + }, + "filter.commentAfter": { + "type": "string", + "default": "\n", + "description": "%emmetPreferencesFilterCommentAfter%" + }, + "filter.commentTrigger": { + "type": "array", + "default": [ + "id", + "class" + ], + "description": "%emmetPreferencesFilterCommentTrigger%" + }, + "format.noIndentTags": { + "type": "array", + "default": [ + "html" + ], + "description": "%emmetPreferencesFormatNoIndentTags%" + }, + "format.forceIndentationForTags": { + "type": "array", + "default": [ + "body" + ], + "description": "%emmetPreferencesFormatForceIndentTags%" + }, + "profile.allowCompactBoolean": { + "type": "boolean", + "default": false, + "description": "%emmetPreferencesAllowCompactBoolean%" + }, + "css.webkitProperties": { + "type": "string", + "default": null, + "markdownDescription": "%emmetPreferencesCssWebkitProperties%" + }, + "css.mozProperties": { + "type": "string", + "default": null, + "markdownDescription": "%emmetPreferencesCssMozProperties%" + }, + "css.oProperties": { + "type": "string", + "default": null, + "markdownDescription": "%emmetPreferencesCssOProperties%" + }, + "css.msProperties": { + "type": "string", + "default": null, + "markdownDescription": "%emmetPreferencesCssMsProperties%" + }, + "css.fuzzySearchMinScore": { + "type": "number", + "default": 0.3, + "description": "%emmetPreferencesCssFuzzySearchMinScore%" + }, + "output.reverseAttributes": { + "type": "boolean", + "default": false, + "description": "%emmetPreferencesOutputReverseAttributes%" + }, + "css.color.short": { + "type": "boolean", + "default": true, + "description": "%emmetPreferencesCssColorShort%" + } + } + }, + "emmet.showSuggestionsAsSnippets": { + "type": "boolean", + "default": false, + "markdownDescription": "%emmetShowSuggestionsAsSnippets%" + }, + "emmet.optimizeStylesheetParsing": { + "type": "boolean", + "default": true, + "markdownDescription": "%emmetOptimizeStylesheetParsing%" } + } }, - "scripts": { - "watch": "gulp watch-extension:emmet", - "compile": "gulp compile-extension:emmet", - "deps": "yarn add vscode-emmet-helper" - }, - "devDependencies": { - "@types/node": "^12.19.9", - "emmet": "https://github.com/rzhao271/emmet.git#1b2df677d8925ef5ea6da9df8845968403979a0a" - }, - "dependencies": { - "@emmetio/abbreviation": "^2.2.0", - "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", - "@emmetio/html-matcher": "^0.3.3", - "@emmetio/math-expression": "^1.0.4", - "image-size": "^0.5.2", - "vscode-emmet-helper": "2.2.4", - "vscode-languageserver-textdocument": "^1.0.1" + "commands": [ + { + "command": "editor.emmet.action.wrapWithAbbreviation", + "title": "%command.wrapWithAbbreviation%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.removeTag", + "title": "%command.removeTag%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.updateTag", + "title": "%command.updateTag%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.matchTag", + "title": "%command.matchTag%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.balanceIn", + "title": "%command.balanceIn%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.balanceOut", + "title": "%command.balanceOut%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.prevEditPoint", + "title": "%command.prevEditPoint%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.nextEditPoint", + "title": "%command.nextEditPoint%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.mergeLines", + "title": "%command.mergeLines%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.selectPrevItem", + "title": "%command.selectPrevItem%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.selectNextItem", + "title": "%command.selectNextItem%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.splitJoinTag", + "title": "%command.splitJoinTag%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.toggleComment", + "title": "%command.toggleComment%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.evaluateMathExpression", + "title": "%command.evaluateMathExpression%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.updateImageSize", + "title": "%command.updateImageSize%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.incrementNumberByOneTenth", + "title": "%command.incrementNumberByOneTenth%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.incrementNumberByOne", + "title": "%command.incrementNumberByOne%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.incrementNumberByTen", + "title": "%command.incrementNumberByTen%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.decrementNumberByOneTenth", + "title": "%command.decrementNumberByOneTenth%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.decrementNumberByOne", + "title": "%command.decrementNumberByOne%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.decrementNumberByTen", + "title": "%command.decrementNumberByTen%", + "category": "Emmet" + }, + { + "command": "editor.emmet.action.reflectCSSValue", + "title": "%command.reflectCSSValue%", + "category": "Emmet" + }, + { + "command": "workbench.action.showEmmetCommands", + "title": "%command.showEmmetCommands%", + "category": "" + } + ], + "menus": { + "commandPalette": [ + { + "command": "editor.emmet.action.wrapWithAbbreviation" + }, + { + "command": "editor.emmet.action.removeTag" + }, + { + "command": "editor.emmet.action.updateTag" + }, + { + "command": "editor.emmet.action.matchTag" + }, + { + "command": "editor.emmet.action.balanceIn" + }, + { + "command": "editor.emmet.action.balanceOut" + }, + { + "command": "editor.emmet.action.prevEditPoint" + }, + { + "command": "editor.emmet.action.nextEditPoint" + }, + { + "command": "editor.emmet.action.mergeLines" + }, + { + "command": "editor.emmet.action.selectPrevItem" + }, + { + "command": "editor.emmet.action.selectNextItem" + }, + { + "command": "editor.emmet.action.splitJoinTag" + }, + { + "command": "editor.emmet.action.toggleComment" + }, + { + "command": "editor.emmet.action.evaluateMathExpression" + }, + { + "command": "editor.emmet.action.updateImageSize", + "when": "resourceScheme =~ /^file$/" + }, + { + "command": "editor.emmet.action.incrementNumberByOneTenth" + }, + { + "command": "editor.emmet.action.incrementNumberByOne" + }, + { + "command": "editor.emmet.action.incrementNumberByTen" + }, + { + "command": "editor.emmet.action.decrementNumberByOneTenth" + }, + { + "command": "editor.emmet.action.decrementNumberByOne" + }, + { + "command": "editor.emmet.action.decrementNumberByTen" + }, + { + "command": "editor.emmet.action.reflectCSSValue" + } + ] } + }, + "scripts": { + "watch": "gulp watch-extension:emmet", + "compile": "gulp compile-extension:emmet", + "deps": "yarn add vscode-emmet-helper" + }, + "devDependencies": { + "@types/node": "^12.19.9" + }, + "dependencies": { + "@emmetio/abbreviation": "^2.2.0", + "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", + "@emmetio/html-matcher": "^0.3.3", + "@emmetio/math-expression": "^1.0.4", + "image-size": "^0.5.2", + "vscode-emmet-helper": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1" + } } diff --git a/extensions/emmet/package.nls.json b/extensions/emmet/package.nls.json index 2a1add89..3ee2d4a0 100644 --- a/extensions/emmet/package.nls.json +++ b/extensions/emmet/package.nls.json @@ -1,7 +1,6 @@ { "description": "Emmet support for VS Code", "command.wrapWithAbbreviation": "Wrap with Abbreviation", - "command.wrapIndividualLinesWithAbbreviation": "Wrap Individual Lines with Abbreviation", "command.removeTag": "Remove Tag", "command.updateTag": "Update Tag", "command.matchTag": "Go to Matching Pair", @@ -55,5 +54,7 @@ "emmetPreferencesCssOProperties": "Comma separated CSS properties that get the 'o' vendor prefix when used in Emmet abbreviation that starts with `-`. Set to empty string to always avoid the 'o' prefix.", "emmetPreferencesCssMsProperties": "Comma separated CSS properties that get the 'ms' vendor prefix when used in Emmet abbreviation that starts with `-`. Set to empty string to always avoid the 'ms' prefix.", "emmetPreferencesCssFuzzySearchMinScore": "The minimum score (from 0 to 1) that fuzzy-matched abbreviation should achieve. Lower values may produce many false-positive matches, higher values may reduce possible matches.", - "emmetOptimizeStylesheetParsing": "When set to `false`, the whole file is parsed to determine if current position is valid for expanding Emmet abbreviations. When set to `true`, only the content around the current position in css/scss/less files is parsed." + "emmetOptimizeStylesheetParsing": "When set to `false`, the whole file is parsed to determine if current position is valid for expanding Emmet abbreviations. When set to `true`, only the content around the current position in css/scss/less files is parsed.", + "emmetPreferencesOutputReverseAttributes": "If `true`, reverses attribute merging directions when resolving snippets.", + "emmetPreferencesCssColorShort": "If `true`, color values like #f will be expanded to #fff instead of #ffffff." } diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index 494bf8d2..97ba3ac7 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -6,19 +6,12 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { Node, HtmlNode, Rule, Property, Stylesheet } from 'EmmetFlatNode'; -import { getEmmetHelper, getFlatNode, getMappingForIncludedLanguages, validate, getEmmetConfiguration, isStyleSheet, getEmmetMode, parsePartialStylesheet, isStyleAttribute, getEmbeddedCssNodeIfAny, allowedMimeTypesInScriptTag, toLSTextDocument } from './util'; +import { getEmmetHelper, getFlatNode, getMappingForIncludedLanguages, validate, getEmmetConfiguration, isStyleSheet, getEmmetMode, parsePartialStylesheet, isStyleAttribute, getEmbeddedCssNodeIfAny, allowedMimeTypesInScriptTag, toLSTextDocument, isOffsetInsideOpenOrCloseTag } from './util'; import { getRootNode as parseDocument } from './parseDocument'; -import { MarkupAbbreviation } from 'emmet'; -// import { AbbreviationNode } from '@emmetio/abbreviation'; const localize = nls.loadMessageBundle(); const trimRegex = /[\u00a0]*[\d#\-\*\u2022]+\.?/; const hexColorRegex = /^#[\da-fA-F]{0,6}$/; -// const inlineElements = ['a', 'abbr', 'acronym', 'applet', 'b', 'basefont', 'bdo', -// 'big', 'br', 'button', 'cite', 'code', 'del', 'dfn', 'em', 'font', 'i', -// 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'object', 'q', -// 's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', -// 'textarea', 'tt', 'u', 'var']; interface ExpandAbbreviationInput { syntax: string; @@ -26,6 +19,8 @@ interface ExpandAbbreviationInput { rangeToReplace: vscode.Range; textToWrap?: string[]; filter?: string; + indent?: string; + baseIndent?: string; } interface PreviewRangesWithContent { @@ -33,22 +28,15 @@ interface PreviewRangesWithContent { originalRange: vscode.Range; originalContent: string; textToWrapInPreview: string[]; + baseIndent: string; } -export function wrapWithAbbreviation(args: any) { - return doWrapping(true, args); -} - -export function wrapIndividualLinesWithAbbreviation(args: any) { - return doWrapping(true, args); -} - -function doWrapping(_: boolean, args: any) { - if (!validate(false) || !vscode.window.activeTextEditor) { - return; +export async function wrapWithAbbreviation(args: any): Promise { + if (!validate(false)) { + return false; } - const editor = vscode.window.activeTextEditor; + const editor = vscode.window.activeTextEditor!; const document = editor.document; args = args || {}; @@ -59,44 +47,68 @@ function doWrapping(_: boolean, args: any) { const syntax = getSyntaxFromArgs(args) || 'html'; const rootNode = parseDocument(document, true); - let inPreview = false; - let currentValue = ''; const helper = getEmmetHelper(); - // Fetch general information for the succesive expansions. i.e. the ranges to replace and its contents - const rangesToReplace: PreviewRangesWithContent[] = editor.selections.sort((a: vscode.Selection, b: vscode.Selection) => { return a.start.compareTo(b.start); }).map(selection => { - let rangeToReplace: vscode.Range = selection.isReversed ? new vscode.Range(selection.active, selection.anchor) : selection; - if (!rangeToReplace.isSingleLine && rangeToReplace.end.character === 0) { - // in case of multi-line, exclude last empty line from rangeToReplace - const previousLine = rangeToReplace.end.line - 1; - const lastChar = document.lineAt(previousLine).text.length; - rangeToReplace = new vscode.Range(rangeToReplace.start, new vscode.Position(previousLine, lastChar)); - } else if (rangeToReplace.isEmpty) { - const { active } = selection; - const activeOffset = document.offsetAt(active); - const currentNode = getFlatNode(rootNode, activeOffset, true); - if (currentNode) { - const currentNodeStart = document.positionAt(currentNode.start); - const currentNodeEnd = document.positionAt(currentNode.end); - if (currentNodeStart.line === active.line || currentNodeEnd.line === active.line) { - // wrap around entire node - rangeToReplace = new vscode.Range(currentNodeStart, currentNodeEnd); - } - else { - // wrap line that cursor is on - rangeToReplace = new vscode.Range(rangeToReplace.start.line, 0, rangeToReplace.start.line, document.lineAt(rangeToReplace.start.line).text.length); - } - } else { - // wrap line that cursor is on - rangeToReplace = new vscode.Range(rangeToReplace.start.line, 0, rangeToReplace.start.line, document.lineAt(rangeToReplace.start.line).text.length); + const operationRanges = editor.selections.sort((a, b) => a.start.compareTo(b.start)).map(selection => { + let rangeToReplace: vscode.Range = selection; + // wrap around the node if the selection falls inside its open or close tag + { + let { start, end } = rangeToReplace; + + const startOffset = document.offsetAt(start); + const startNode = getFlatNode(rootNode, startOffset, true); + if (startNode && isOffsetInsideOpenOrCloseTag(startNode, startOffset)) { + start = document.positionAt(startNode.start); + const nodeEndPosition = document.positionAt(startNode.end); + end = nodeEndPosition.isAfter(end) ? nodeEndPosition : end; } + + const endOffset = document.offsetAt(end); + const endNode = getFlatNode(rootNode, endOffset, true); + if (endNode && isOffsetInsideOpenOrCloseTag(endNode, endOffset)) { + const nodeStartPosition = document.positionAt(endNode.start); + start = nodeStartPosition.isBefore(start) ? nodeStartPosition : start; + const nodeEndPosition = document.positionAt(endNode.end); + end = nodeEndPosition.isAfter(end) ? nodeEndPosition : end; + } + + rangeToReplace = new vscode.Range(start, end); + } + // in case of multi-line, exclude last empty line from rangeToReplace + if (!rangeToReplace.isSingleLine && rangeToReplace.end.character === 0) { + const previousLine = rangeToReplace.end.line - 1; + rangeToReplace = new vscode.Range(rangeToReplace.start, document.lineAt(previousLine).range.end); + } + // wrap line the cursor is on + if (rangeToReplace.isEmpty) { + rangeToReplace = document.lineAt(rangeToReplace.start).range; } - const firstLineOfSelection = document.lineAt(rangeToReplace.start).text.substr(rangeToReplace.start.character); - const matches = firstLineOfSelection.match(/^(\s*)/); - const extraWhitespaceSelected = matches ? matches[1].length : 0; - rangeToReplace = new vscode.Range(rangeToReplace.start.line, rangeToReplace.start.character + extraWhitespaceSelected, rangeToReplace.end.line, rangeToReplace.end.character); + // ignore whitespace on the first line + const firstLineOfRange = document.lineAt(rangeToReplace.start); + if (!firstLineOfRange.isEmptyOrWhitespace && firstLineOfRange.firstNonWhitespaceCharacterIndex > rangeToReplace.start.character) { + rangeToReplace = rangeToReplace.with(new vscode.Position(rangeToReplace.start.line, firstLineOfRange.firstNonWhitespaceCharacterIndex)); + } + return rangeToReplace; + }).reduce((mergedRanges, range) => { + // Merge overlapping ranges + if (mergedRanges.length > 0 && range.intersection(mergedRanges[mergedRanges.length - 1])) { + mergedRanges.push(range.union(mergedRanges.pop()!)); + } else { + mergedRanges.push(range); + } + return mergedRanges; + }, [] as vscode.Range[]); + + // Backup orginal selections and update selections + // Also helps with https://github.com/microsoft/vscode/issues/113930 by avoiding `editor.linkedEditing` + // execution if selection is inside an open or close tag + const oldSelections = editor.selections; + editor.selections = operationRanges.map(range => new vscode.Selection(range.start, range.end)); + + // Fetch general information for the succesive expansions. i.e. the ranges to replace and its contents + const rangesToReplace: PreviewRangesWithContent[] = operationRanges.map(rangeToReplace => { let textToWrapInPreview: string[]; const textToReplace = document.getText(rangeToReplace); @@ -104,10 +116,10 @@ function doWrapping(_: boolean, args: any) { // this assumption helps with applyPreview later const wholeFirstLine = document.lineAt(rangeToReplace.start).text; const otherMatches = wholeFirstLine.match(/^(\s*)/); - const precedingWhitespace = otherMatches ? otherMatches[1] : ''; + const baseIndent = otherMatches ? otherMatches[1] : ''; textToWrapInPreview = rangeToReplace.isSingleLine ? [textToReplace] : - textToReplace.split('\n' + precedingWhitespace).map(x => x.trimEnd()); + textToReplace.split('\n' + baseIndent).map(x => x.trimEnd()); // escape $ characters, fixes #52640 textToWrapInPreview = textToWrapInPreview.map(e => e.replace(/(\$\d)/g, '\\$1')); @@ -116,31 +128,13 @@ function doWrapping(_: boolean, args: any) { previewRange: rangeToReplace, originalRange: rangeToReplace, originalContent: textToReplace, - textToWrapInPreview + textToWrapInPreview, + baseIndent }; }); - // if a selection falls on a node, it could interfere with linked editing, - // so back up the selections, and change selections to wrap around the node - const oldSelections = editor.selections; - const newSelections: vscode.Selection[] = []; - editor.selections.forEach(selection => { - let { start, end } = selection; - const startOffset = document.offsetAt(start); - const startNode = getFlatNode(rootNode, startOffset, true); - const endOffset = document.offsetAt(end); - const endNode = getFlatNode(rootNode, endOffset, true); - if (startNode) { - start = document.positionAt(startNode.start); - } - if (endNode) { - end = document.positionAt(endNode.end); - } - // don't need to preserve active/anchor order since the selection changes - // after wrapping anyway - newSelections.push(new vscode.Selection(start, end)); - }); - editor.selections = newSelections; + const { tabSize, insertSpaces } = editor.options; + const indent = insertSpaces ? ' '.repeat(tabSize as number) : '\t'; function revertPreview(): Thenable { return editor.edit(builder => { @@ -168,16 +162,10 @@ function doWrapping(_: boolean, args: any) { // get the current preview range, format the new wrapped text, and then replace // the text in the preview range with that new text const oldPreviewRange = rangesToReplace[i].previewRange; - const preceedingText = editor.document.getText(new vscode.Range(oldPreviewRange.start.line, 0, oldPreviewRange.start.line, oldPreviewRange.start.character)); - const indentPrefix = (preceedingText.match(/^(\s*)/) || ['', ''])[1]; - - let newText = expandedText; - newText = newText.replace(/\n/g, '\n' + indentPrefix); // Adding indentation on each line of expanded text - newText = newText.replace(/\$\{[\d]*\}/g, '|'); // Removing Tabstops - newText = newText.replace(/\$\{[\d]*(:[^}]*)?\}/g, (match) => { // Replacing Placeholders - return match.replace(/^\$\{[\d]*:/, '').replace('}', ''); - }); - newText = newText.replace(/\\\$/g, '$'); // Remove backslashes before $ + const newText = expandedText + .replace(/\$\{[\d]*\}/g, '|') // Removing Tabstops + .replace(/\$\{[\d]*:([^}]*)\}/g, (_, placeholder) => placeholder) // Replacing Placeholders + .replace(/\\\$/g, '$'); // Remove backslashes before $ builder.replace(oldPreviewRange, newText); // calculate the new preview range to use for future previews @@ -198,12 +186,10 @@ function doWrapping(_: boolean, args: any) { // plus the number of characters between both selections. newPreviewStart = lastNewPreviewRange.end.character + (oldPreviewRange.start.character - lastOldPreviewRange.end.character); newPreviewEnd += newPreviewStart; - } - else if (i > 0 && newPreviewLineStart === lastNewPreviewRange.end.line) { + } else if (i > 0 && newPreviewLineStart === lastNewPreviewRange.end.line) { // Same as above but expandedTextLines.length > 1 so newPreviewEnd keeps its value. newPreviewStart = lastNewPreviewRange.end.character + (oldPreviewRange.start.character - lastOldPreviewRange.end.character); - } - else if (expandedTextLines.length === 1) { + } else if (expandedTextLines.length === 1) { // If the expandedText is single line, add the length of preceeding text as it will not be included in line length. newPreviewEnd += oldPreviewRange.start.character; } @@ -216,66 +202,64 @@ function doWrapping(_: boolean, args: any) { }, { undoStopBefore: false, undoStopAfter: false }); } - function makeChanges(inputAbbreviation: string | undefined, definitive: boolean): Thenable { - if (!inputAbbreviation || !inputAbbreviation.trim() || !helper.isAbbreviationValid(syntax, inputAbbreviation)) { - return inPreview ? revertPreview().then(() => { return false; }) : Promise.resolve(inPreview); - } - - const extractedResults = helper.extractAbbreviationFromText(inputAbbreviation); + let inPreviewMode = false; + async function makeChanges(inputAbbreviation: string | undefined, previewChanges: boolean): Promise { + const isAbbreviationValid = !!inputAbbreviation && !!inputAbbreviation.trim() && helper.isAbbreviationValid(syntax, inputAbbreviation); + const extractedResults = isAbbreviationValid ? helper.extractAbbreviationFromText(inputAbbreviation!) : undefined; if (!extractedResults) { - return Promise.resolve(inPreview); - } else if (extractedResults.abbreviation !== inputAbbreviation) { - // Not clear what should we do in this case. Warn the user? How? + if (inPreviewMode) { + inPreviewMode = false; + await revertPreview(); + } + return false; } const { abbreviation, filter } = extractedResults; - if (definitive) { - const revertPromise = inPreview ? revertPreview() : Promise.resolve(true); - return revertPromise.then(() => { - const expandAbbrList: ExpandAbbreviationInput[] = rangesToReplace.map(rangesAndContent => { - const rangeToReplace = rangesAndContent.originalRange; - let textToWrap: string[]; - // if (individualLines) { - textToWrap = rangesAndContent.textToWrapInPreview; - // } else { - // // use the p tag as a dummy element to get Emmet to wrap the expression properly - // textToWrap = rangeToReplace.isSingleLine ? - // ['$TM_SELECTED_TEXT'] : ['

$TM_SELECTED_TEXT

']; - // } - return { syntax: syntax || '', abbreviation, rangeToReplace, textToWrap, filter }; - }); - return expandAbbreviationInRange(editor, expandAbbrList, false).then(() => { return true; }); - }); + if (abbreviation !== inputAbbreviation) { + // Not clear what should we do in this case. Warn the user? How? } - const expandAbbrList: ExpandAbbreviationInput[] = rangesToReplace.map(rangesAndContent => { - return { syntax: syntax || '', abbreviation, rangeToReplace: rangesAndContent.originalRange, textToWrap: rangesAndContent.textToWrapInPreview, filter }; - }); + if (previewChanges) { + const expandAbbrList: ExpandAbbreviationInput[] = rangesToReplace.map(rangesAndContent => + ({ syntax, abbreviation, rangeToReplace: rangesAndContent.originalRange, textToWrap: rangesAndContent.textToWrapInPreview, filter, indent, baseIndent: rangesAndContent.baseIndent }) + ); - return applyPreview(expandAbbrList); + inPreviewMode = true; + return applyPreview(expandAbbrList); + } + + const expandAbbrList: ExpandAbbreviationInput[] = rangesToReplace.map(rangesAndContent => + ({ syntax, abbreviation, rangeToReplace: rangesAndContent.originalRange, textToWrap: rangesAndContent.textToWrapInPreview, filter, indent }) + ); + + if (inPreviewMode) { + inPreviewMode = false; + await revertPreview(); + } + + return expandAbbreviationInRange(editor, expandAbbrList, false); } + let currentValue = ''; function inputChanged(value: string): string { if (value !== currentValue) { currentValue = value; - makeChanges(value, false).then((out) => { - inPreview = out; - }); + makeChanges(value, true); } return ''; } const prompt = localize('wrapWithAbbreviationPrompt', "Enter Abbreviation"); - const abbreviationPromise: Thenable = (args && args['abbreviation']) ? - Promise.resolve(args['abbreviation']) : - vscode.window.showInputBox({ prompt, validateInput: inputChanged }); - return abbreviationPromise.then(async (inputAbbreviation) => { - const changesWereMade = await makeChanges(inputAbbreviation, true); - if (!changesWereMade) { - editor.selections = oldSelections; - } - return changesWereMade; - }); + const inputAbbreviation = (args && args['abbreviation']) + ? (args['abbreviation'] as string) + : await vscode.window.showInputBox({ prompt, validateInput: inputChanged }); + + const changesWereMade = await makeChanges(inputAbbreviation, false); + if (!changesWereMade) { + editor.selections = oldSelections; + } + + return changesWereMade; } export function expandEmmetAbbreviation(args: any): Thenable { @@ -654,36 +638,13 @@ function expandAbbreviationInRange(editor: vscode.TextEditor, expandAbbrList: Ex // all cursors are maintained after snippet insertion const anyExpandAbbrInput = expandAbbrList[0]; const expandedText = expandAbbr(anyExpandAbbrInput); - const allRanges = expandAbbrList.map(value => { - return new vscode.Range(value.rangeToReplace.start.line, value.rangeToReplace.start.character, value.rangeToReplace.end.line, value.rangeToReplace.end.character); - }); + const allRanges = expandAbbrList.map(value => value.rangeToReplace); if (expandedText) { return editor.insertSnippet(new vscode.SnippetString(expandedText), allRanges); } return Promise.resolve(false); } -// /* -// * Walks the tree rooted at root and apply function fn on each node. -// * if fn return false at any node, the further processing of tree is stopped. -// */ -// function walk(root: AbbreviationNode, fn: ((node: AbbreviationNode) => boolean)): boolean { -// if (fn(root) === false || walkChildren(root.children, fn) === false) { -// return false; -// } -// return true; -// } - -// function walkChildren(children: AbbreviationNode[], fn: ((node: AbbreviationNode) => boolean)): boolean { -// for (let i = 0; i < children.length; i++) { -// const child = children[i]; -// if (walk(child, fn) === false) { -// return false; -// } -// } -// return true; -// } - /** * Expands abbreviation as detailed in given input. */ @@ -699,54 +660,26 @@ function expandAbbr(input: ExpandAbbreviationInput): string | undefined { } expandOptions['text'] = input.textToWrap; - // Below fixes https://github.com/microsoft/vscode/issues/29898 - // With this, Emmet formats inline elements as block elements - // ensuring the wrapped multi line text does not get merged to a single line - if (!input.rangeToReplace.isSingleLine && expandOptions.options) { - expandOptions.options['output.inlineBreak'] = 1; + if (expandOptions.options) { + // Below fixes https://github.com/microsoft/vscode/issues/29898 + // With this, Emmet formats inline elements as block elements + // ensuring the wrapped multi line text does not get merged to a single line + if (!input.rangeToReplace.isSingleLine) { + expandOptions.options['output.inlineBreak'] = 1; + } + + if (input.indent) { + expandOptions.options['output.indent'] = input.indent; + } + if (input.baseIndent) { + expandOptions.options['output.baseIndent'] = input.baseIndent; + } } } - let expandedText; + let expandedText: string | undefined; try { - // Expand the abbreviation - if (input.textToWrap && !isStyleSheet(input.syntax)) { - const parsedAbbr = helper.parseAbbreviation(input.abbreviation, expandOptions); - // if (input.rangeToReplace.isSingleLine && input.textToWrap.length === 1) { - // // Fetch rightmost element in the parsed abbreviation (i.e the element that will contain the wrapped text). - // const wrappingNodeChildren = parsedAbbr.children; - // let wrappingNode = wrappingNodeChildren[wrappingNodeChildren.length - 1]; - // while (wrappingNode && wrappingNode.children && wrappingNode.children.length > 0) { - // wrappingNode = wrappingNode.children[wrappingNode.children.length - 1]; - // } - - // // If wrapping with a block element, insert newline in the text to wrap. - // // const format = expandOptions.options ? (expandOptions.options['output.format'] ?? true) : true; - // // if (wrappingNode && wrappingNode.name && wrappingNode.value - // // && inlineElements.indexOf(wrappingNode.name) === -1 - // // && format) { - // // wrappingNode.value[0] = '\n\t' + wrappingNode.value[0] + '\n'; - // // } - // } - - // Below fixes https://github.com/microsoft/vscode/issues/78219 - // walk the tree and remove tags for empty values - // walkChildren(parsedAbbr.children, node => { - // if (node.name !== null && node.value && node.value[0] === '' && !node.selfClosing && node.children.length === 0) { - // node.name = ''; - // node.value[0] = '\n'; - // } - // return true; - // }); - - expandedText = helper.expandAbbreviation(parsedAbbr, expandOptions); - // All $anyword would have been escaped by the emmet helper. - // Remove the escaping backslash from $TM_SELECTED_TEXT so that VS Code Snippet controller can treat it as a variable - expandedText = expandedText.replace('

\\$TM_SELECTED_TEXT

', '$TM_SELECTED_TEXT'); - } else { - expandedText = helper.expandAbbreviation(input.abbreviation, expandOptions); - } - + expandedText = helper.expandAbbreviation(input.abbreviation, expandOptions); } catch (e) { vscode.window.showErrorMessage('Failed to expand abbreviation'); } diff --git a/extensions/emmet/src/emmetCommon.ts b/extensions/emmet/src/emmetCommon.ts index d0474286..cb8dc21c 100644 --- a/extensions/emmet/src/emmetCommon.ts +++ b/extensions/emmet/src/emmetCommon.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; import { DefaultCompletionItemProvider } from './defaultCompletionProvider'; -import { expandEmmetAbbreviation, wrapWithAbbreviation, wrapIndividualLinesWithAbbreviation } from './abbreviationActions'; +import { expandEmmetAbbreviation, wrapWithAbbreviation } from './abbreviationActions'; import { removeTag } from './removeTag'; import { updateTag } from './updateTag'; import { matchTag } from './matchTag'; @@ -23,15 +23,12 @@ import { addFileToParseCache, removeFileFromParseCache } from './parseDocument'; export function activateEmmetExtension(context: vscode.ExtensionContext) { registerCompletionProviders(context); + updateEmmetExtensionsPath(); context.subscriptions.push(vscode.commands.registerCommand('editor.emmet.action.wrapWithAbbreviation', (args) => { wrapWithAbbreviation(args); })); - context.subscriptions.push(vscode.commands.registerCommand('editor.emmet.action.wrapIndividualLinesWithAbbreviation', (args) => { - wrapIndividualLinesWithAbbreviation(args); - })); - context.subscriptions.push(vscode.commands.registerCommand('emmet.expandAbbreviation', (args) => { expandEmmetAbbreviation(args); })); @@ -129,8 +126,6 @@ export function activateEmmetExtension(context: vscode.ExtensionContext) { vscode.commands.executeCommand('workbench.action.quickOpen', '>Emmet: '); })); - updateEmmetExtensionsPath(); - context.subscriptions.push(vscode.workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration('emmet.includeLanguages')) { registerCompletionProviders(context); diff --git a/extensions/emmet/src/test/completion.test.ts b/extensions/emmet/src/test/completion.test.ts index 728dc26a..91844f69 100644 --- a/extensions/emmet/src/test/completion.test.ts +++ b/extensions/emmet/src/test/completion.test.ts @@ -37,6 +37,13 @@ suite('Tests for completion in CSS embedded in HTML', () => { { label: 'widows: ;', documentation: `widows: ;` } ]); }); + + // https://github.com/microsoft/vscode/issues/117020 + test('#117020, ! at end of abbreviation should have completion', async () => { + await testCssCompletionProvider(`.foo { bdbn!| }`, [ + { label: 'border-bottom: none !important;', documentation: `border-bottom: none !important;` } + ]); + }); }); interface TestCompletionItem { diff --git a/extensions/emmet/src/test/test-fixtures/.vscode/settings.json b/extensions/emmet/src/test/test-fixtures/.vscode/settings.json new file mode 100644 index 00000000..b196f468 --- /dev/null +++ b/extensions/emmet/src/test/test-fixtures/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.minimap.enabled": false // see https://github.com/microsoft/vscode/issues/115747 +} diff --git a/extensions/emmet/src/test/wrapWithAbbreviation.test.ts b/extensions/emmet/src/test/wrapWithAbbreviation.test.ts index c89e6942..320aa79e 100644 --- a/extensions/emmet/src/test/wrapWithAbbreviation.test.ts +++ b/extensions/emmet/src/test/wrapWithAbbreviation.test.ts @@ -7,7 +7,7 @@ import 'mocha'; import * as assert from 'assert'; import { Selection, workspace, ConfigurationTarget } from 'vscode'; import { withRandomFileEditor, closeAllEditors } from './testUtils'; -import { wrapWithAbbreviation, wrapIndividualLinesWithAbbreviation } from '../abbreviationActions'; +import { wrapWithAbbreviation } from '../abbreviationActions'; const htmlContentsForBlockWrapTests = ` `; - return testWrapWithAbbreviation([new Selection(2,2,3,33)], '.hello', wrapMultiLineJsxExpected, htmlContentsForBlockWrapTests, 'jsx'); + return testWrapWithAbbreviation([new Selection(2, 2, 3, 33)], '.hello', wrapMultiLineJsxExpected, htmlContentsForBlockWrapTests, 'jsx'); }); test('Wrap individual line with abbreviation uses className for jsx files', () => { @@ -362,8 +362,34 @@ suite('Tests for Wrap with Abbreviations', () => { `; - return testWrapIndividualLinesWithAbbreviation([new Selection(2,2,3,33)], '.hello$*', wrapIndividualLinesJsxExpected, htmlContentsForBlockWrapTests, 'jsx'); + return testWrapIndividualLinesWithAbbreviation([new Selection(2, 2, 3, 33)], '.hello$*', wrapIndividualLinesJsxExpected, htmlContentsForBlockWrapTests, 'jsx'); }); + + test('Wrap with abbreviation merge overlapping computed ranges', () => { + const contents = ` + + `; + const expectedContents = ` +
+ +
+ `; + return testWrapWithAbbreviation([new Selection(1, 2, 1, 2), new Selection(1, 10, 1, 10)], 'div', expectedContents, contents); + }); + + test('Wrap with abbreviation ignore invalid abbreviation', () => { + const contents = ` + + `; + return testWrapWithAbbreviation([new Selection(1, 2, 1, 2)], 'div]', contents, contents); + }); + }); @@ -386,7 +412,7 @@ function testWrapWithAbbreviation(selections: Selection[], abbreviation: string, function testWrapIndividualLinesWithAbbreviation(selections: Selection[], abbreviation: string, expectedContents: string, input: string, fileExtension: string = 'html'): Thenable { return withRandomFileEditor(input, fileExtension, (editor, _) => { editor.selections = selections; - const promise = wrapIndividualLinesWithAbbreviation({ abbreviation }); + const promise = wrapWithAbbreviation({ abbreviation }); if (!promise) { assert.equal(1, 2, 'Wrap individual lines with Abbreviation returned undefined.'); return Promise.resolve(); diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 17ad4fbe..2894647a 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -28,7 +28,6 @@ export function getEmmetHelper() { if (!_emmetHelper) { _emmetHelper = require('vscode-emmet-helper'); } - updateEmmetExtensionsPath(); return _emmetHelper; } @@ -36,9 +35,7 @@ export function getEmmetHelper() { * Update Emmet Helper to use user snippets from the extensionsPath setting */ export function updateEmmetExtensionsPath(forceRefresh: boolean = false) { - if (!_emmetHelper) { - return; - } + const helper = getEmmetHelper(); let extensionsPath = vscode.workspace.getConfiguration('emmet')['extensionsPath']; if (forceRefresh || _currentExtensionsPath !== extensionsPath) { _currentExtensionsPath = extensionsPath; @@ -47,7 +44,7 @@ export function updateEmmetExtensionsPath(forceRefresh: boolean = false) { } else { const rootPath = vscode.workspace.workspaceFolders[0].uri; const fileSystem = vscode.workspace.fs; - _emmetHelper.updateExtensionsPath(extensionsPath, fileSystem, rootPath, _homeDir).then(null, (err: string) => vscode.window.showErrorMessage(err)); + helper.updateExtensionsPath(extensionsPath, fileSystem, rootPath, _homeDir).catch(err => vscode.window.showErrorMessage(err.message)); } } } @@ -62,18 +59,18 @@ export const LANGUAGE_MODES: { [id: string]: string[] } = { 'haml': ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 'xml': ['.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 'xsl': ['!', '.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - 'css': [':', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - 'scss': [':', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - 'sass': [':', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - 'less': [':', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - 'stylus': [':', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + 'css': [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + 'scss': [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + 'sass': [':', '!', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + 'less': [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + 'stylus': [':', '!', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 'javascriptreact': ['!', '.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 'typescriptreact': ['!', '.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] }; export function isStyleSheet(syntax: string): boolean { let stylesheetSyntaxes = ['css', 'scss', 'sass', 'less', 'stylus']; - return (stylesheetSyntaxes.indexOf(syntax) > -1); + return stylesheetSyntaxes.includes(syntax); } export function validate(allowStylesheet: boolean = true): boolean { @@ -374,6 +371,16 @@ export function getHtmlFlatNode(documentText: string, root: FlatNode | undefined return currentNode; } +export function isOffsetInsideOpenOrCloseTag(node: FlatNode, offset: number): boolean { + const htmlNode = node as HtmlFlatNode; + if ((htmlNode.open && offset > htmlNode.open.start && offset < htmlNode.open.end) + || (htmlNode.close && offset > htmlNode.close.start && offset < htmlNode.close.end)) { + return true; + } + + return false; +} + export function offsetRangeToSelection(document: vscode.TextDocument, start: number, end: number): vscode.Selection { const startPos = document.positionAt(start); const endPos = document.positionAt(end); diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index 742443d3..8ebb09f5 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@emmetio/abbreviation@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@emmetio/abbreviation/-/abbreviation-2.2.0.tgz#9f8dedbdb00e3136d6d37c6415375c82c0bb477f" - integrity sha512-NPGVUmnr7cLj4i6MKS4c8NjuoIIJROrruJl/8nXsp2MdbDRHvtfq25foySvv/NbfqTQm+P9JzVLDD9JxGIpvkQ== +"@emmetio/abbreviation@^2.2.0", "@emmetio/abbreviation@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@emmetio/abbreviation/-/abbreviation-2.2.1.tgz#d9458fe1f09fe042f019c48aa681165ba613a48d" + integrity sha512-uUNwNgbH0JPlrdXhy8VQbNPLLG7abMvOaLVMblx22i68Rl9r+2N235ALgIYFUty1yXC9DkVw6xMbz/D4QVARcQ== dependencies: "@emmetio/scanner" "^1.0.0" @@ -54,15 +54,16 @@ integrity sha1-Rs/+oRmgoAMxKiHC2bVijLX81EI= "@types/node@^12.19.9": - version "12.19.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.12.tgz#04793c2afa4ce833a9972e4c476432e30f9df47b" - integrity sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw== + version "12.20.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.1.tgz#63d36c10e162666f0107f247cdca76542c3c7472" + integrity sha512-tCkE96/ZTO+cWbln2xfyvd6ngHLanvVlJ3e5BeirJ3BYI5GbAyubIrmV4JjjugDly5D9fHjOL5MNsqsCnqwW6g== -"emmet@https://github.com/rzhao271/emmet.git#1b2df677d8925ef5ea6da9df8845968403979a0a": - version "2.3.0" - resolved "https://github.com/rzhao271/emmet.git#1b2df677d8925ef5ea6da9df8845968403979a0a" +emmet@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/emmet/-/emmet-2.3.1.tgz#77614d949d1d01e5c248d08043a13a7f4d539e47" + integrity sha512-u8h++9u3y9QWhn0imUXfQO+s80To5MGD97zd/00wGC39CfNGBPe//ZKepJz9I1LQ2FDRXHrn+e3JaN/53Y5z6A== dependencies: - "@emmetio/abbreviation" "^2.2.0" + "@emmetio/abbreviation" "^2.2.1" "@emmetio/css-abbreviation" "^2.1.2" image-size@^0.5.2: @@ -75,12 +76,12 @@ jsonc-parser@^2.3.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342" integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== -vscode-emmet-helper@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-2.2.4.tgz#8ab86d2b7fe9e6270b4c77c9fd8d1eb8f3f4c401" - integrity sha512-1N6bMzP1ZzkDGzamvsKxQ/lOmBc4+OQdj0dA2C9A5PSeYV9gh5xbJ061sm+VyFHOGZE+VyUQq5m/WFmFsLbKnA== +vscode-emmet-helper@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-2.3.2.tgz#7f73cd579eef187a4456dc71768fb2237f47fbd4" + integrity sha512-uulOziI/5Ml+AyfHwgkZDXlGZsu9yNcfwZgOfRSPokc6lqYEoGK+/u902LH8Xaf68dhPLctJlhhGYwDJuqoGxg== dependencies: - emmet "https://github.com/rzhao271/emmet.git#1b2df677d8925ef5ea6da9df8845968403979a0a" + emmet "^2.3.0" jsonc-parser "^2.3.0" vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.15.1" diff --git a/extensions/extension-editing/package.json b/extensions/extension-editing/package.json index 14c98dc5..c520abb2 100644 --- a/extensions/extension-editing/package.json +++ b/extensions/extension-editing/package.json @@ -1,64 +1,71 @@ { - "name": "extension-editing", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "^1.4.0" - }, - "activationEvents": [ - "onLanguage:json", - "onLanguage:markdown", - "onLanguage:typescript" - ], - "main": "./out/extensionEditingMain", - "browser": "./dist/browser/extensionEditingBrowserMain", - "scripts": { - "compile": "gulp compile-extension:extension-editing", - "watch": "gulp watch-extension:extension-editing" - }, - "dependencies": { - "jsonc-parser": "^2.2.1", - "markdown-it": "^8.3.1", - "parse5": "^3.0.2", - "vscode-nls": "^4.1.1" - }, - "contributes": { - "jsonValidation": [ - { - "fileMatch": "package.json", - "url": "vscode://schemas/vscode-extensions" - }, - { - "fileMatch": "*language-configuration.json", - "url": "vscode://schemas/language-configuration" - }, - { - "fileMatch": ["*icon-theme.json", "!*product-icon-theme.json"], - "url": "vscode://schemas/icon-theme" - }, - { - "fileMatch": "*product-icon-theme.json", - "url": "vscode://schemas/product-icon-theme" - }, - { - "fileMatch": "*color-theme.json", - "url": "vscode://schemas/color-theme" - } - ], - "languages": [ - { - "id": "ignore", - "filenames": [ - ".vscodeignore" - ] - } - ] - }, - "devDependencies": { - "@types/markdown-it": "0.0.2", - "@types/node": "^12.19.9" - } + "name": "extension-editing", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "^1.4.0" + }, + "activationEvents": [ + "onLanguage:json", + "onLanguage:markdown", + "onLanguage:typescript" + ], + "main": "./out/extensionEditingMain", + "browser": "./dist/browser/extensionEditingBrowserMain", + "scripts": { + "compile": "gulp compile-extension:extension-editing", + "watch": "gulp watch-extension:extension-editing" + }, + "dependencies": { + "jsonc-parser": "^2.2.1", + "markdown-it": "^8.3.1", + "parse5": "^3.0.2", + "vscode-nls": "^4.1.1" + }, + "contributes": { + "jsonValidation": [ + { + "fileMatch": "package.json", + "url": "vscode://schemas/vscode-extensions" + }, + { + "fileMatch": "*language-configuration.json", + "url": "vscode://schemas/language-configuration" + }, + { + "fileMatch": [ + "*icon-theme.json", + "!*product-icon-theme.json" + ], + "url": "vscode://schemas/icon-theme" + }, + { + "fileMatch": "*product-icon-theme.json", + "url": "vscode://schemas/product-icon-theme" + }, + { + "fileMatch": "*color-theme.json", + "url": "vscode://schemas/color-theme" + } + ], + "languages": [ + { + "id": "ignore", + "filenames": [ + ".vscodeignore" + ] + } + ] + }, + "devDependencies": { + "@types/markdown-it": "0.0.2", + "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/extension-editing/package.nls.json b/extensions/extension-editing/package.nls.json index 263fb6bc..1801b090 100644 --- a/extensions/extension-editing/package.nls.json +++ b/extensions/extension-editing/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Extension Authoring", "description": "Provides linting capabilities for authoring extensions." -} \ No newline at end of file +} diff --git a/extensions/fsharp/package.json b/extensions/fsharp/package.json index fb67e704..b6c07d40 100644 --- a/extensions/fsharp/package.json +++ b/extensions/fsharp/package.json @@ -1,29 +1,50 @@ { - "name": "fsharp", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js ionide/ionide-fsgrammar grammars/fsharp.json ./syntaxes/fsharp.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "fsharp", - "extensions": [ ".fs", ".fsi", ".fsx", ".fsscript" ], - "aliases": [ "F#", "FSharp", "fsharp" ], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "fsharp", - "scopeName": "source.fsharp", - "path": "./syntaxes/fsharp.tmLanguage.json" - }], - "snippets": [{ - "language": "fsharp", - "path": "./snippets/fsharp.code-snippets" - }] - } + "name": "fsharp", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin ionide/ionide-fsgrammar grammars/fsharp.json ./syntaxes/fsharp.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "fsharp", + "extensions": [ + ".fs", + ".fsi", + ".fsx", + ".fsscript" + ], + "aliases": [ + "F#", + "FSharp", + "fsharp" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "fsharp", + "scopeName": "source.fsharp", + "path": "./syntaxes/fsharp.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "fsharp", + "path": "./snippets/fsharp.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/fsharp/package.nls.json b/extensions/fsharp/package.nls.json index 42733fff..6a3a1c83 100644 --- a/extensions/fsharp/package.nls.json +++ b/extensions/fsharp/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "F# Language Basics", "description": "Provides snippets, syntax highlighting, bracket matching and folding in F# files." -} \ No newline at end of file +} diff --git a/extensions/fsharp/yarn.lock b/extensions/fsharp/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/fsharp/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/git-ui/package.json b/extensions/git-ui/package.json index 1b20849b..67c6c940 100644 --- a/extensions/git-ui/package.json +++ b/extensions/git-ui/package.json @@ -27,5 +27,9 @@ }, "devDependencies": { "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/git-ui/package.nls.json b/extensions/git-ui/package.nls.json index 5303e91f..413d891f 100644 --- a/extensions/git-ui/package.nls.json +++ b/extensions/git-ui/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Git UI", "description": "Git SCM UI Integration" -} \ No newline at end of file +} diff --git a/extensions/git/build/update-grammars.js b/extensions/git/build/update-grammars.js index 268157d4..a5dae9f6 100644 --- a/extensions/git/build/update-grammars.js +++ b/extensions/git/build/update-grammars.js @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -var updateGrammar = require('../../../build/npm/update-grammar'); +var updateGrammar = require('vscode-grammar-updater'); updateGrammar.update('textmate/git.tmbundle', 'Syntaxes/Git%20Commit%20Message.tmLanguage', './syntaxes/git-commit.tmLanguage.json'); updateGrammar.update('textmate/git.tmbundle', 'Syntaxes/Git%20Rebase%20Message.tmLanguage', './syntaxes/git-rebase.tmLanguage.json'); diff --git a/extensions/git/package.json b/extensions/git/package.json index 0aa7b2cd..e10eca67 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -495,6 +495,16 @@ "title": "%command.timelineCopyCommitMessage%", "category": "Git" }, + { + "command": "git.timeline.selectForCompare", + "title": "%command.timelineSelectForCompare%", + "category": "Git" + }, + { + "command": "git.timeline.compareWithSelected", + "title": "%command.timelineCompareWithSelected%", + "category": "Git" + }, { "command": "git.rebaseAbort", "title": "%command.rebaseAbort%", @@ -874,6 +884,14 @@ { "command": "git.timeline.copyCommitMessage", "when": "false" + }, + { + "command": "git.timeline.selectForCompare", + "when": "false" + }, + { + "command": "git.timeline.compareWithSelected", + "when": "false" } ], "scm/title": [ @@ -964,7 +982,7 @@ { "command": "git.stageAllMerge", "when": "scmProvider == git && scmResourceGroup == merge", - "group": "inline" + "group": "inline@2" }, { "command": "git.unstageAll", @@ -974,7 +992,7 @@ { "command": "git.unstageAll", "when": "scmProvider == git && scmResourceGroup == index", - "group": "inline" + "group": "inline@2" }, { "command": "git.cleanAll", @@ -989,12 +1007,12 @@ { "command": "git.cleanAll", "when": "scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed", - "group": "inline" + "group": "inline@2" }, { "command": "git.stageAll", "when": "scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed", - "group": "inline" + "group": "inline@2" }, { "command": "git.cleanAllTracked", @@ -1009,12 +1027,12 @@ { "command": "git.cleanAllTracked", "when": "scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges != mixed", - "group": "inline" + "group": "inline@2" }, { "command": "git.stageAllTracked", "when": "scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges != mixed", - "group": "inline" + "group": "inline@2" }, { "command": "git.cleanAllUntracked", @@ -1029,12 +1047,12 @@ { "command": "git.cleanAllUntracked", "when": "scmProvider == git && scmResourceGroup == untracked", - "group": "inline" + "group": "inline@2" }, { "command": "git.stageAllUntracked", "when": "scmProvider == git && scmResourceGroup == untracked", - "group": "inline" + "group": "inline@2" } ], "scm/resourceFolder/context": [ @@ -1046,7 +1064,7 @@ { "command": "git.stage", "when": "scmProvider == git && scmResourceGroup == merge", - "group": "inline" + "group": "inline@2" }, { "command": "git.unstage", @@ -1056,7 +1074,7 @@ { "command": "git.unstage", "when": "scmProvider == git && scmResourceGroup == index", - "group": "inline" + "group": "inline@2" }, { "command": "git.stage", @@ -1071,12 +1089,12 @@ { "command": "git.clean", "when": "scmProvider == git && scmResourceGroup == workingTree", - "group": "inline" + "group": "inline@2" }, { "command": "git.stage", "when": "scmProvider == git && scmResourceGroup == workingTree", - "group": "inline" + "group": "inline@2" }, { "command": "git.ignore", @@ -1091,7 +1109,7 @@ { "command": "git.stage", "when": "scmProvider == git && scmResourceGroup == untracked", - "group": "inline" + "group": "inline@2" }, { "command": "git.clean", @@ -1101,7 +1119,7 @@ { "command": "git.clean", "when": "scmProvider == git && scmResourceGroup == untracked", - "group": "inline" + "group": "inline@2" }, { "command": "git.ignore", @@ -1123,7 +1141,7 @@ { "command": "git.stage", "when": "scmProvider == git && scmResourceGroup == merge", - "group": "inline" + "group": "inline@2" }, { "command": "git.revealInExplorer", @@ -1133,12 +1151,12 @@ { "command": "git.openFile2", "when": "scmProvider == git && scmResourceGroup == merge && config.git.showInlineOpenFileAction && config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.openChange", "when": "scmProvider == git && scmResourceGroup == merge && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.openChange", @@ -1163,7 +1181,7 @@ { "command": "git.unstage", "when": "scmProvider == git && scmResourceGroup == index", - "group": "inline" + "group": "inline@2" }, { "command": "git.revealInExplorer", @@ -1173,12 +1191,12 @@ { "command": "git.openFile2", "when": "scmProvider == git && scmResourceGroup == index && config.git.showInlineOpenFileAction && config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.openChange", "when": "scmProvider == git && scmResourceGroup == index && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.openChange", @@ -1208,22 +1226,22 @@ { "command": "git.clean", "when": "scmProvider == git && scmResourceGroup == workingTree", - "group": "inline" + "group": "inline@2" }, { "command": "git.stage", "when": "scmProvider == git && scmResourceGroup == workingTree", - "group": "inline" + "group": "inline@2" }, { "command": "git.openFile2", "when": "scmProvider == git && scmResourceGroup == workingTree && config.git.showInlineOpenFileAction && config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.openChange", "when": "scmProvider == git && scmResourceGroup == workingTree && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.ignore", @@ -1263,22 +1281,22 @@ { "command": "git.clean", "when": "scmProvider == git && scmResourceGroup == untracked && !gitFreshRepository", - "group": "inline" + "group": "inline@2" }, { "command": "git.stage", "when": "scmProvider == git && scmResourceGroup == untracked", - "group": "inline" + "group": "inline@2" }, { "command": "git.openFile2", "when": "scmProvider == git && scmResourceGroup == untracked && config.git.showInlineOpenFileAction && config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.openChange", "when": "scmProvider == git && scmResourceGroup == untracked && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick", - "group": "inline0" + "group": "inline@1" }, { "command": "git.ignore", @@ -1349,17 +1367,27 @@ { "command": "git.timeline.openDiff", "group": "1_actions", - "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file\\b/" + "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file\\b/ && !listMultiSelection" + }, + { + "command": "git.timeline.compareWithSelected", + "group": "3_compare@1", + "when": "config.git.enabled && !git.missing && git.timeline.selectedForCompare && timelineItem =~ /git:file\\b/ && !listMultiSelection" + }, + { + "command": "git.timeline.selectForCompare", + "group": "3_compare@2", + "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file\\b/ && !listMultiSelection" }, { "command": "git.timeline.copyCommitId", "group": "5_copy@1", - "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/" + "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/ && !listMultiSelection" }, { "command": "git.timeline.copyCommitMessage", "group": "5_copy@2", - "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/" + "when": "config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/ && !listMultiSelection" } ], "git.commit": [ @@ -2140,6 +2168,15 @@ "highContrast": "#c74e39" } }, + { + "id": "gitDecoration.renamedResourceForeground", + "description": "%colors.renamed%", + "defaults": { + "light": "#007100", + "dark": "#73C991", + "highContrast": "#73C991" + } + }, { "id": "gitDecoration.untrackedResourceForeground", "description": "%colors.untracked%", @@ -2180,9 +2217,9 @@ "id": "gitDecoration.conflictingResourceForeground", "description": "%colors.conflict%", "defaults": { - "light": "#6c6cc4", - "dark": "#6c6cc4", - "highContrast": "#6c6cc4" + "light": "#ad0707", + "dark": "#e4676b", + "highContrast": "#c74e39" } }, { @@ -2342,5 +2379,9 @@ "@types/mocha": "^8.2.0", "@types/node": "^12.19.9", "@types/which": "^1.0.28" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index f76c42db..3eac8e07 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -90,6 +90,8 @@ "command.timelineOpenDiff": "Open Changes", "command.timelineCopyCommitId": "Copy Commit ID", "command.timelineCopyCommitMessage": "Copy Commit Message", + "command.timelineSelectForCompare": "Select for Compare", + "command.timelineCompareWithSelected": "Compare with Selected", "config.enabled": "Whether git is enabled.", "config.path": "Path and filename of the git executable, e.g. `C:\\Program Files\\Git\\bin\\git.exe` (Windows). This can also be an array of string values containing multiple paths to look up.", "config.autoRepositoryDetection": "Configures when repositories should be automatically detected.", @@ -198,6 +200,7 @@ "colors.stageModified": "Color for modified resources which have been staged.", "colors.stageDeleted": "Color for deleted resources which have been staged.", "colors.deleted": "Color for deleted resources.", + "colors.renamed": "Color for renamed or copied resources.", "colors.untracked": "Color for untracked resources.", "colors.ignored": "Color for ignored resources.", "colors.conflict": "Color for resources with conflicts.", diff --git a/extensions/git/src/askpass-main.ts b/extensions/git/src/askpass-main.ts index c15dd583..f17dc634 100644 --- a/extensions/git/src/askpass-main.ts +++ b/extensions/git/src/askpass-main.ts @@ -30,7 +30,7 @@ function main(argv: string[]): void { const output = process.env['VSCODE_GIT_ASKPASS_PIPE'] as string; const request = argv[2]; - const host = argv[4].replace(/^["']+|["']+$/g, ''); + const host = argv[4].replace(/^["']+|["':]+$/g, ''); const ipcClient = new IPCClient('askpass'); ipcClient.call({ request, host }).then(res => { diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index ac924987..9ded16f3 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -5,7 +5,7 @@ import * as os from 'os'; import * as path from 'path'; -import { commands, Disposable, LineChange, MessageOptions, OutputChannel, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider } from 'vscode'; +import { Command, commands, Disposable, LineChange, MessageOptions, OutputChannel, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider } from 'vscode'; import TelemetryReporter from 'vscode-extension-telemetry'; import * as nls from 'vscode-nls'; import { Branch, ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourceProvider } from './api/git'; @@ -153,21 +153,21 @@ class AddRemoteItem implements QuickPickItem { } } -interface CommandOptions { +interface ScmCommandOptions { repository?: boolean; diff?: boolean; } -interface Command { +interface ScmCommand { commandId: string; key: string; method: Function; - options: CommandOptions; + options: ScmCommandOptions; } -const Commands: Command[] = []; +const Commands: ScmCommand[] = []; -function command(commandId: string, options: CommandOptions = {}): Function { +function command(commandId: string, options: ScmCommandOptions = {}): Function { return (_target: any, key: string, descriptor: any) => { if (!(typeof descriptor.value === 'function')) { throw new Error('not supported'); @@ -374,16 +374,20 @@ export class CommandCenter { @command('git.openAllChanges', { repository: true }) async openChanges(repository: Repository): Promise { - [ - ...repository.workingTreeGroup.resourceStates, - ...repository.untrackedGroup.resourceStates, - ].forEach(resource => { - commands.executeCommand( + for (const resource of [...repository.workingTreeGroup.resourceStates, ...repository.untrackedGroup.resourceStates]) { + if ( + resource.type === Status.DELETED || resource.type === Status.DELETED_BY_THEM || + resource.type === Status.DELETED_BY_US || resource.type === Status.BOTH_DELETED + ) { + continue; + } + + void commands.executeCommand( 'vscode.open', resource.resourceUri, - { preview: false, } + { background: true, preview: false, } ); - }); + } } async cloneRepository(url?: string, parentPath?: string, options: { recursive?: boolean } = {}): Promise { @@ -2608,6 +2612,22 @@ export class CommandCenter { @command('git.timeline.openDiff', { repository: false }) async timelineOpenDiff(item: TimelineItem, uri: Uri | undefined, _source: string) { + const cmd = this.resolveTimelineOpenDiffCommand( + item, uri, + { + preserveFocus: true, + preview: true, + viewColumn: ViewColumn.Active + }, + ); + if (cmd === undefined) { + return undefined; + } + + return commands.executeCommand(cmd.command, ...(cmd.arguments ?? [])); + } + + resolveTimelineOpenDiffCommand(item: TimelineItem, uri: Uri | undefined, options?: TextDocumentShowOptions): Command | undefined { if (uri === undefined || uri === null || !GitTimelineItem.is(item)) { return undefined; } @@ -2624,13 +2644,11 @@ export class CommandCenter { title = localize('git.title.diffRefs', '{0} ({1}) ⟷ {0} ({2})', basename, item.shortPreviousRef, item.shortRef); } - const options: TextDocumentShowOptions = { - preserveFocus: true, - preview: true, - viewColumn: ViewColumn.Active + return { + command: 'vscode.diff', + title: 'Open Comparison', + arguments: [toGitUri(uri, item.previousRef), item.ref === '' ? uri : toGitUri(uri, item.ref), title, options] }; - - return commands.executeCommand('vscode.diff', toGitUri(uri, item.previousRef), item.ref === '' ? uri : toGitUri(uri, item.ref), title, options); } @command('git.timeline.copyCommitId', { repository: false }) @@ -2651,6 +2669,52 @@ export class CommandCenter { env.clipboard.writeText(item.message); } + private _selectedForCompare: { uri: Uri, item: GitTimelineItem } | undefined; + + @command('git.timeline.selectForCompare', { repository: false }) + async timelineSelectForCompare(item: TimelineItem, uri: Uri | undefined, _source: string) { + if (!GitTimelineItem.is(item) || !uri) { + return; + } + + this._selectedForCompare = { uri, item }; + await commands.executeCommand('setContext', 'git.timeline.selectedForCompare', true); + } + + @command('git.timeline.compareWithSelected', { repository: false }) + async timelineCompareWithSelected(item: TimelineItem, uri: Uri | undefined, _source: string) { + if (!GitTimelineItem.is(item) || !uri || !this._selectedForCompare || uri.toString() !== this._selectedForCompare.uri.toString()) { + return; + } + + const { item: selected } = this._selectedForCompare; + + const basename = path.basename(uri.fsPath); + let leftTitle; + if ((selected.previousRef === 'HEAD' || selected.previousRef === '~') && selected.ref === '') { + leftTitle = localize('git.title.workingTree', '{0} (Working Tree)', basename); + } + else if (selected.previousRef === 'HEAD' && selected.ref === '~') { + leftTitle = localize('git.title.index', '{0} (Index)', basename); + } else { + leftTitle = localize('git.title.ref', '{0} ({1})', basename, selected.shortRef); + } + + let rightTitle; + if ((item.previousRef === 'HEAD' || item.previousRef === '~') && item.ref === '') { + rightTitle = localize('git.title.workingTree', '{0} (Working Tree)', basename); + } + else if (item.previousRef === 'HEAD' && item.ref === '~') { + rightTitle = localize('git.title.index', '{0} (Index)', basename); + } else { + rightTitle = localize('git.title.ref', '{0} ({1})', basename, item.shortRef); + } + + + const title = localize('git.title.diff', '{0} ⟷ {1}', leftTitle, rightTitle); + await commands.executeCommand('vscode.diff', selected.ref === '' ? uri : toGitUri(uri, selected.ref), item.ref === '' ? uri : toGitUri(uri, item.ref), title); + } + @command('git.rebaseAbort', { repository: true }) async rebaseAbort(repository: Repository): Promise { if (repository.rebaseCommit) { @@ -2660,7 +2724,7 @@ export class CommandCenter { } } - private createCommand(id: string, key: string, method: Function, options: CommandOptions): (...args: any[]) => any { + private createCommand(id: string, key: string, method: Function, options: ScmCommandOptions): (...args: any[]) => any { const result = (...args: any[]) => { let result: Promise; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index a3f54427..29afd985 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -823,8 +823,7 @@ export class Repository { return this.repositoryRoot; } - // TODO@Joao: rename to exec - async run(args: string[], options: SpawnOptions = {}): Promise> { + async exec(args: string[], options: SpawnOptions = {}): Promise> { return await this.git.exec(this.repositoryRoot, args, options); } @@ -849,7 +848,7 @@ export class Repository { args.push(value); } - const result = await this.run(args, options); + const result = await this.exec(args, options); return result.stdout.trim(); } @@ -862,7 +861,7 @@ export class Repository { args.push('-l'); - const result = await this.run(args); + const result = await this.exec(args); const lines = result.stdout.trim().split(/\r|\r\n|\n/); return lines.map(entry => { @@ -878,7 +877,7 @@ export class Repository { args.push(options.path); } - const result = await this.run(args); + const result = await this.exec(args); if (result.exitCode) { // An empty repo return []; @@ -909,7 +908,7 @@ export class Repository { args.push('--', uri.fsPath); - const result = await this.run(args); + const result = await this.exec(args); if (result.exitCode) { // No file history, e.g. a new file or untracked return []; @@ -964,7 +963,7 @@ export class Repository { } const { mode, object } = elements[0]; - const catFile = await this.run(['cat-file', '-s', object]); + const catFile = await this.exec(['cat-file', '-s', object]); const size = parseInt(catFile.stdout); return { mode, object, size }; @@ -981,12 +980,12 @@ export class Repository { } async lstree(treeish: string, path: string): Promise { - const { stdout } = await this.run(['ls-tree', '-l', treeish, '--', sanitizePath(path)]); + const { stdout } = await this.exec(['ls-tree', '-l', treeish, '--', sanitizePath(path)]); return parseLsTree(stdout); } async lsfiles(path: string): Promise { - const { stdout } = await this.run(['ls-files', '--stage', '--', sanitizePath(path)]); + const { stdout } = await this.exec(['ls-files', '--stage', '--', sanitizePath(path)]); return parseLsFiles(stdout); } @@ -1051,7 +1050,7 @@ export class Repository { } try { - await this.run(args); + await this.exec(args); } catch (err) { if (/patch does not apply/.test(err.stderr)) { err.gitErrorCode = GitErrorCodes.PatchDoesNotApply; @@ -1068,7 +1067,7 @@ export class Repository { args.push('--cached'); } - const result = await this.run(args); + const result = await this.exec(args); return result.stdout; } @@ -1081,7 +1080,7 @@ export class Repository { } const args = ['diff', '--', sanitizePath(path)]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout; } @@ -1094,7 +1093,7 @@ export class Repository { } const args = ['diff', ref, '--', sanitizePath(path)]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout; } @@ -1107,7 +1106,7 @@ export class Repository { } const args = ['diff', '--cached', '--', sanitizePath(path)]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout; } @@ -1120,13 +1119,13 @@ export class Repository { } const args = ['diff', '--cached', ref, '--', sanitizePath(path)]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout; } async diffBlobs(object1: string, object2: string): Promise { const args = ['diff', object1, object2]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout; } @@ -1140,7 +1139,7 @@ export class Repository { } const args = ['diff', range, '--', sanitizePath(path)]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout.trim(); } @@ -1155,7 +1154,7 @@ export class Repository { args.push(ref); } - const gitResult = await this.run(args); + const gitResult = await this.exec(args); if (gitResult.exitCode) { return []; } @@ -1228,14 +1227,14 @@ export class Repository { async getMergeBase(ref1: string, ref2: string): Promise { const args = ['merge-base', ref1, ref2]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout.trim(); } async hashObject(data: string): Promise { const args = ['hash-object', '-w', '--stdin']; - const result = await this.run(args, { input: data }); + const result = await this.exec(args, { input: data }); return result.stdout.trim(); } @@ -1251,10 +1250,10 @@ export class Repository { if (paths && paths.length) { for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) { - await this.run([...args, '--', ...chunk]); + await this.exec([...args, '--', ...chunk]); } } else { - await this.run([...args, '--', '.']); + await this.exec([...args, '--', '.']); } } @@ -1267,7 +1266,7 @@ export class Repository { args.push(...paths.map(sanitizePath)); - await this.run(args); + await this.exec(args); } async stage(path: string, data: string): Promise { @@ -1300,7 +1299,7 @@ export class Repository { add = '--add'; } - await this.run(['update-index', add, '--cacheinfo', mode, hash, path]); + await this.exec(['update-index', add, '--cacheinfo', mode, hash, path]); } async checkout(treeish: string, paths: string[], opts: { track?: boolean, detached?: boolean } = Object.create(null)): Promise { @@ -1321,10 +1320,10 @@ export class Repository { try { if (paths && paths.length > 0) { for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) { - await this.run([...args, '--', ...chunk]); + await this.exec([...args, '--', ...chunk]); } } else { - await this.run(args); + await this.exec(args); } } catch (err) { if (/Please,? commit your changes or stash them/.test(err.stderr || '')) { @@ -1375,21 +1374,21 @@ export class Repository { } try { - await this.run(args, !opts.amend || message ? { input: message || '' } : {}); + await this.exec(args, !opts.amend || message ? { input: message || '' } : {}); } catch (commitErr) { await this.handleCommitError(commitErr); } } async rebaseAbort(): Promise { - await this.run(['rebase', '--abort']); + await this.exec(['rebase', '--abort']); } async rebaseContinue(): Promise { const args = ['rebase', '--continue']; try { - await this.run(args); + await this.exec(args); } catch (commitErr) { await this.handleCommitError(commitErr); } @@ -1402,14 +1401,14 @@ export class Repository { } try { - await this.run(['config', '--get-all', 'user.name']); + await this.exec(['config', '--get-all', 'user.name']); } catch (err) { err.gitErrorCode = GitErrorCodes.NoUserNameConfigured; throw err; } try { - await this.run(['config', '--get-all', 'user.email']); + await this.exec(['config', '--get-all', 'user.email']); } catch (err) { err.gitErrorCode = GitErrorCodes.NoUserEmailConfigured; throw err; @@ -1425,39 +1424,39 @@ export class Repository { args.push(ref); } - await this.run(args); + await this.exec(args); } async deleteBranch(name: string, force?: boolean): Promise { const args = ['branch', force ? '-D' : '-d', name]; - await this.run(args); + await this.exec(args); } async renameBranch(name: string): Promise { const args = ['branch', '-m', name]; - await this.run(args); + await this.exec(args); } async move(from: string, to: string): Promise { const args = ['mv', from, to]; - await this.run(args); + await this.exec(args); } async setBranchUpstream(name: string, upstream: string): Promise { const args = ['branch', '--set-upstream-to', upstream, name]; - await this.run(args); + await this.exec(args); } async deleteRef(ref: string): Promise { const args = ['update-ref', '-d', ref]; - await this.run(args); + await this.exec(args); } async merge(ref: string): Promise { const args = ['merge', ref]; try { - await this.run(args); + await this.exec(args); } catch (err) { if (/^CONFLICT /m.test(err.stdout || '')) { err.gitErrorCode = GitErrorCodes.Conflict; @@ -1476,12 +1475,12 @@ export class Repository { args = [...args, name]; } - await this.run(args); + await this.exec(args); } async deleteTag(name: string): Promise { let args = ['tag', '-d', name]; - await this.run(args); + await this.exec(args); } async clean(paths: string[]): Promise { @@ -1494,7 +1493,7 @@ export class Repository { for (const paths of groups) { for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) { - promises.push(limiter.queue(() => this.run([...args, '--', ...chunk]))); + promises.push(limiter.queue(() => this.exec([...args, '--', ...chunk]))); } } @@ -1502,10 +1501,10 @@ export class Repository { } async undo(): Promise { - await this.run(['clean', '-fd']); + await this.exec(['clean', '-fd']); try { - await this.run(['checkout', '--', '.']); + await this.exec(['checkout', '--', '.']); } catch (err) { if (/did not match any file\(s\) known to git\./.test(err.stderr || '')) { return; @@ -1517,11 +1516,11 @@ export class Repository { async reset(treeish: string, hard: boolean = false): Promise { const args = ['reset', hard ? '--hard' : '--soft', treeish]; - await this.run(args); + await this.exec(args); } async revert(treeish: string, paths: string[]): Promise { - const result = await this.run(['branch']); + const result = await this.exec(['branch']); let args: string[]; // In case there are no branches, we must use rm --cached @@ -1534,10 +1533,10 @@ export class Repository { try { if (paths && paths.length > 0) { for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) { - await this.run([...args, '--', ...chunk]); + await this.exec([...args, '--', ...chunk]); } } else { - await this.run([...args, '--', '.']); + await this.exec([...args, '--', '.']); } } catch (err) { // In case there are merge conflicts to be resolved, git reset will output @@ -1552,17 +1551,17 @@ export class Repository { async addRemote(name: string, url: string): Promise { const args = ['remote', 'add', name, url]; - await this.run(args); + await this.exec(args); } async removeRemote(name: string): Promise { const args = ['remote', 'remove', name]; - await this.run(args); + await this.exec(args); } async renameRemote(name: string, newName: string): Promise { const args = ['remote', 'rename', name, newName]; - await this.run(args); + await this.exec(args); } async fetch(options: { remote?: string, ref?: string, all?: boolean, prune?: boolean, depth?: number, silent?: boolean, readonly cancellationToken?: CancellationToken } = {}): Promise { @@ -1595,7 +1594,7 @@ export class Repository { } try { - await this.run(args, spawnOptions); + await this.exec(args, spawnOptions); } catch (err) { if (/No remote repository specified\./.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.NoRemoteRepositorySpecified; @@ -1628,7 +1627,7 @@ export class Repository { } try { - await this.run(args, { + await this.exec(args, { cancellationToken: options.cancellationToken, env: { 'GIT_HTTP_USER_AGENT': this.git.userAgent } }); @@ -1658,7 +1657,7 @@ export class Repository { args.push(branch); try { - await this.run(args, options); + await this.exec(args, options); } catch (err) { if (/^CONFLICT \([^)]+\): \b/m.test(err.stdout || '')) { err.gitErrorCode = GitErrorCodes.Conflict; @@ -1700,7 +1699,7 @@ export class Repository { } try { - await this.run(args, { env: { 'GIT_HTTP_USER_AGENT': this.git.userAgent } }); + await this.exec(args, { env: { 'GIT_HTTP_USER_AGENT': this.git.userAgent } }); } catch (err) { if (/^error: failed to push some refs to\b/m.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.PushRejected; @@ -1718,13 +1717,13 @@ export class Repository { async cherryPick(commitHash: string): Promise { const args = ['cherry-pick', commitHash]; - await this.run(args); + await this.exec(args); } async blame(path: string): Promise { try { const args = ['blame', sanitizePath(path)]; - const result = await this.run(args); + const result = await this.exec(args); return result.stdout.trim(); } catch (err) { if (/^fatal: no such path/.test(err.stderr || '')) { @@ -1747,7 +1746,7 @@ export class Repository { args.push('-m', message); } - await this.run(args); + await this.exec(args); } catch (err) { if (/No local changes to save/.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.NoLocalChanges; @@ -1773,7 +1772,7 @@ export class Repository { args.push(`stash@{${index}}`); } - await this.run(args); + await this.exec(args); } catch (err) { if (/No stash found/.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.NoStashFound; @@ -1795,7 +1794,7 @@ export class Repository { } try { - await this.run(args); + await this.exec(args); } catch (err) { if (/No stash found/.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.NoStashFound; @@ -1860,7 +1859,7 @@ export class Repository { async getHEAD(): Promise { try { - const result = await this.run(['symbolic-ref', '--short', 'HEAD']); + const result = await this.exec(['symbolic-ref', '--short', 'HEAD']); if (!result.stdout) { throw new Error('Not in a branch'); @@ -1868,7 +1867,7 @@ export class Repository { return { name: result.stdout.trim(), commit: undefined, type: RefType.Head }; } catch (err) { - const result = await this.run(['rev-parse', 'HEAD']); + const result = await this.exec(['rev-parse', 'HEAD']); if (!result.stdout) { throw new Error('Error parsing HEAD'); @@ -1879,7 +1878,7 @@ export class Repository { } async findTrackingBranches(upstreamBranch: string): Promise { - const result = await this.run(['for-each-ref', '--format', '%(refname:short)%00%(upstream:short)', 'refs/heads']); + const result = await this.exec(['for-each-ref', '--format', '%(refname:short)%00%(upstream:short)', 'refs/heads']); return result.stdout.trim().split('\n') .map(line => line.trim().split('\0')) .filter(([_, upstream]) => upstream === upstreamBranch) @@ -1907,7 +1906,7 @@ export class Repository { args.push('--contains', opts.contains); } - const result = await this.run(args); + const result = await this.exec(args); const fn = (line: string): Ref | null => { let match: RegExpExecArray | null; @@ -1930,7 +1929,7 @@ export class Repository { } async getStashes(): Promise { - const result = await this.run(['stash', 'list']); + const result = await this.exec(['stash', 'list']); const regex = /^stash@{(\d+)}:(.+)$/; const rawStashes = result.stdout.trim().split('\n') .filter(b => !!b) @@ -1942,7 +1941,7 @@ export class Repository { } async getRemotes(): Promise { - const result = await this.run(['remote', '--verbose']); + const result = await this.exec(['remote', '--verbose']); const lines = result.stdout.trim().split('\n').filter(l => !!l); const remotes: MutableRemote[] = []; @@ -1985,7 +1984,7 @@ export class Repository { args.push(`refs/heads/${name}`, `refs/remotes/${name}`); } - const result = await this.run(args); + const result = await this.exec(args); const branches: Branch[] = result.stdout.trim().split('\n').map(line => { let [branchName, upstream, status, ref] = line.trim().split('\0'); @@ -2067,7 +2066,7 @@ export class Repository { async getCommitTemplate(): Promise { try { - const result = await this.run(['config', '--get', 'commit.template']); + const result = await this.exec(['config', '--get', 'commit.template']); if (!result.stdout) { return ''; @@ -2090,7 +2089,7 @@ export class Repository { } async getCommit(ref: string): Promise { - const result = await this.run(['show', '-s', `--format=${COMMIT_FORMAT}`, '-z', ref]); + const result = await this.exec(['show', '-s', `--format=${COMMIT_FORMAT}`, '-z', ref]); const commits = parseGitCommits(result.stdout); if (commits.length === 0) { return Promise.reject('bad commit format'); @@ -2102,7 +2101,7 @@ export class Repository { const args = ['submodule', 'update']; for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) { - await this.run([...args, '--', ...chunk]); + await this.exec([...args, '--', ...chunk]); } } diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index d5c81c88..f391996c 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -73,12 +73,13 @@ async function createModel(context: ExtensionContext, outputChannel: OutputChann git.onOutput.addListener('log', onOutput); disposables.push(toDisposable(() => git.onOutput.removeListener('log', onOutput))); + const cc = new CommandCenter(git, model, outputChannel, telemetryReporter); disposables.push( - new CommandCenter(git, model, outputChannel, telemetryReporter), + cc, new GitFileSystemProvider(model), new GitDecorations(model), new GitProtocolHandler(), - new GitTimelineProvider(model) + new GitTimelineProvider(model, cc) ); checkGitVersion(info); diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index e85a4f16..90149ad0 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -55,13 +55,13 @@ export class Resource implements SourceControlResourceState { case Status.UNTRACKED: return localize('untracked', "Untracked"); case Status.IGNORED: return localize('ignored', "Ignored"); case Status.INTENT_TO_ADD: return localize('intent to add', "Intent to Add"); - case Status.BOTH_DELETED: return localize('both deleted', "Both Deleted"); - case Status.ADDED_BY_US: return localize('added by us', "Added By Us"); - case Status.DELETED_BY_THEM: return localize('deleted by them', "Deleted By Them"); - case Status.ADDED_BY_THEM: return localize('added by them', "Added By Them"); - case Status.DELETED_BY_US: return localize('deleted by us', "Deleted By Us"); - case Status.BOTH_ADDED: return localize('both added', "Both Added"); - case Status.BOTH_MODIFIED: return localize('both modified', "Both Modified"); + case Status.BOTH_DELETED: return localize('both deleted', "Conflict: Both Deleted"); + case Status.ADDED_BY_US: return localize('added by us', "Conflict: Added By Us"); + case Status.DELETED_BY_THEM: return localize('deleted by them', "Conflict: Deleted By Them"); + case Status.ADDED_BY_THEM: return localize('added by them', "Conflict: Added By Them"); + case Status.DELETED_BY_US: return localize('deleted by us', "Conflict: Deleted By Us"); + case Status.BOTH_ADDED: return localize('both added', "Conflict: Both Added"); + case Status.BOTH_MODIFIED: return localize('both modified', "Conflict: Both Modified"); default: return ''; } } @@ -199,12 +199,13 @@ export class Resource implements SourceControlResourceState { case Status.DELETED_BY_US: return 'D'; case Status.INDEX_COPIED: + return 'C'; case Status.BOTH_DELETED: case Status.ADDED_BY_US: case Status.ADDED_BY_THEM: case Status.BOTH_ADDED: case Status.BOTH_MODIFIED: - return 'C'; + return '!'; // Using ! instead of ⚠, because the latter looks really bad on windows default: throw new Error('Unknown git status: ' + this.type); } @@ -223,12 +224,13 @@ export class Resource implements SourceControlResourceState { case Status.INDEX_ADDED: case Status.INTENT_TO_ADD: return new ThemeColor('gitDecoration.addedResourceForeground'); + case Status.INDEX_COPIED: case Status.INDEX_RENAMED: + return new ThemeColor('gitDecoration.renamedResourceForeground'); case Status.UNTRACKED: return new ThemeColor('gitDecoration.untrackedResourceForeground'); case Status.IGNORED: return new ThemeColor('gitDecoration.ignoredResourceForeground'); - case Status.INDEX_COPIED: case Status.BOTH_DELETED: case Status.ADDED_BY_US: case Status.DELETED_BY_THEM: @@ -246,10 +248,10 @@ export class Resource implements SourceControlResourceState { switch (this.type) { case Status.INDEX_MODIFIED: case Status.MODIFIED: + case Status.INDEX_COPIED: return 2; case Status.IGNORED: return 3; - case Status.INDEX_COPIED: case Status.BOTH_DELETED: case Status.ADDED_BY_US: case Status.DELETED_BY_THEM: @@ -1482,7 +1484,7 @@ export class Repository implements Disposable { const maybeRebased = await this.run(Operation.Log, async () => { try { - const result = await this.repository.run(['log', '--oneline', '--cherry', `${currentBranch ?? ''}...${currentBranch ?? ''}@{upstream}`, '--']); + const result = await this.repository.exec(['log', '--oneline', '--cherry', `${currentBranch ?? ''}...${currentBranch ?? ''}@{upstream}`, '--']); if (result.exitCode) { return false; } diff --git a/extensions/git/src/timelineProvider.ts b/extensions/git/src/timelineProvider.ts index f00302f6..5a9a1390 100644 --- a/extensions/git/src/timelineProvider.ts +++ b/extensions/git/src/timelineProvider.ts @@ -9,6 +9,7 @@ import { Model } from './model'; import { Repository, Resource } from './repository'; import { debounce } from './decorators'; import { emojify, ensureEmojis } from './emoji'; +import { CommandCenter } from './commands'; const localize = nls.loadMessageBundle(); @@ -73,7 +74,7 @@ export class GitTimelineProvider implements TimelineProvider { private repoDisposable: Disposable | undefined; private repoStatusDate: Date | undefined; - constructor(private readonly model: Model) { + constructor(private readonly model: Model, private commands: CommandCenter) { this.disposable = Disposable.from( model.onDidOpenRepository(this.onRepositoriesChanged, this), workspace.onDidChangeConfiguration(this.onConfigurationChanged, this) @@ -161,16 +162,20 @@ export class GitTimelineProvider implements TimelineProvider { const message = emojify(c.message); const item = new GitTimelineItem(c.hash, commits[i + 1]?.hash ?? `${c.hash}^`, message, date?.getTime() ?? 0, c.hash, 'git:file:commit'); - item.iconPath = new (ThemeIcon as any)('git-commit'); + item.iconPath = new ThemeIcon('git-commit'); if (showAuthor) { item.description = c.authorName; } item.detail = `${c.authorName} (${c.authorEmail}) — ${c.hash.substr(0, 8)}\n${dateFormatter.format(date)}\n\n${message}`; - item.command = { - title: 'Open Comparison', - command: 'git.timeline.openDiff', - arguments: [item, uri, this.id] - }; + + const cmd = this.commands.resolveTimelineOpenDiffCommand(item, uri); + if (cmd) { + item.command = { + title: 'Open Comparison', + command: cmd.command, + arguments: cmd.arguments, + }; + } return item; }); @@ -184,14 +189,18 @@ export class GitTimelineProvider implements TimelineProvider { const item = new GitTimelineItem('~', 'HEAD', localize('git.timeline.stagedChanges', 'Staged Changes'), date.getTime(), 'index', 'git:file:index'); // TODO@eamodio: Replace with a better icon -- reflecting its status maybe? - item.iconPath = new (ThemeIcon as any)('git-commit'); + item.iconPath = new ThemeIcon('git-commit'); item.description = ''; item.detail = localize('git.timeline.detail', '{0} — {1}\n{2}\n\n{3}', you, localize('git.index', 'Index'), dateFormatter.format(date), Resource.getStatusText(index.type)); - item.command = { - title: 'Open Comparison', - command: 'git.timeline.openDiff', - arguments: [item, uri, this.id] - }; + + const cmd = this.commands.resolveTimelineOpenDiffCommand(item, uri); + if (cmd) { + item.command = { + title: 'Open Comparison', + command: cmd.command, + arguments: cmd.arguments, + }; + } items.splice(0, 0, item); } @@ -202,14 +211,18 @@ export class GitTimelineProvider implements TimelineProvider { const item = new GitTimelineItem('', index ? '~' : 'HEAD', localize('git.timeline.uncommitedChanges', 'Uncommitted Changes'), date.getTime(), 'working', 'git:file:working'); // TODO@eamodio: Replace with a better icon -- reflecting its status maybe? - item.iconPath = new (ThemeIcon as any)('git-commit'); + item.iconPath = new ThemeIcon('git-commit'); item.description = ''; item.detail = localize('git.timeline.detail', '{0} — {1}\n{2}\n\n{3}', you, localize('git.workingTree', 'Working Tree'), dateFormatter.format(date), Resource.getStatusText(working.type)); - item.command = { - title: 'Open Comparison', - command: 'git.timeline.openDiff', - arguments: [item, uri, this.id] - }; + + const cmd = this.commands.resolveTimelineOpenDiffCommand(item, uri); + if (cmd) { + item.command = { + title: 'Open Comparison', + command: cmd.command, + arguments: cmd.arguments, + }; + } items.splice(0, 0, item); } diff --git a/extensions/github-authentication/package.json b/extensions/github-authentication/package.json index 70adf885..726949d0 100644 --- a/extensions/github-authentication/package.json +++ b/extensions/github-authentication/package.json @@ -53,7 +53,7 @@ "vscode:prepublish": "npm run compile" }, "dependencies": { - "node-fetch": "2.6.0", + "node-fetch": "2.6.1", "uuid": "8.1.0", "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.1.2" @@ -62,5 +62,9 @@ "@types/node": "^12.19.9", "@types/node-fetch": "^2.5.7", "@types/uuid": "8.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/github-authentication/src/common/utils.ts b/extensions/github-authentication/src/common/utils.ts index b6fc3361..914e9288 100644 --- a/extensions/github-authentication/src/common/utils.ts +++ b/extensions/github-authentication/src/common/utils.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Disposable } from 'vscode'; +import { EventEmitter, Event, Disposable } from 'vscode'; export function filterEvent(event: Event, filter: (e: T) => boolean): Event { return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); @@ -47,27 +47,54 @@ const passthrough = (value: any, resolve: (value?: any) => void) => resolve(valu * @param adapter controls resolution of the returned promise * @returns a promise that resolves or rejects as specified by the adapter */ -export async function promiseFromEvent( +export function promiseFromEvent( event: Event, - adapter: PromiseAdapter = passthrough): Promise { + adapter: PromiseAdapter = passthrough): { promise: Promise, cancel: EventEmitter } { let subscription: Disposable; - return new Promise((resolve, reject) => - subscription = event((value: T) => { - try { - Promise.resolve(adapter(value, resolve, reject)) - .catch(reject); - } catch (error) { - reject(error); + let cancel = new EventEmitter(); + return { + promise: new Promise((resolve, reject) => { + cancel.event(_ => reject()); + subscription = event((value: T) => { + try { + Promise.resolve(adapter(value, resolve, reject)) + .catch(reject); + } catch (error) { + reject(error); + } + }); + }).then( + (result: U) => { + subscription.dispose(); + return result; + }, + error => { + subscription.dispose(); + throw error; } - }) - ).then( - (result: U) => { - subscription.dispose(); - return result; - }, - error => { - subscription.dispose(); - throw error; - } - ); + ), + cancel + }; +} + +export function arrayEquals(one: ReadonlyArray | undefined, other: ReadonlyArray | undefined, itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean { + if (one === other) { + return true; + } + + if (!one || !other) { + return false; + } + + if (one.length !== other.length) { + return false; + } + + for (let i = 0, len = one.length; i < len; i++) { + if (!itemEquals(one[i], other[i])) { + return false; + } + } + + return true; } diff --git a/extensions/github-authentication/src/extension.ts b/extensions/github-authentication/src/extension.ts index 59994b74..7ae1e1d2 100644 --- a/extensions/github-authentication/src/extension.ts +++ b/extensions/github-authentication/src/extension.ts @@ -14,7 +14,7 @@ export async function activate(context: vscode.ExtensionContext) { const telemetryReporter = new TelemetryReporter(name, version, aiKey); context.subscriptions.push(vscode.window.registerUriHandler(uriHandler)); - const loginService = new GitHubAuthenticationProvider(context); + const loginService = new GitHubAuthenticationProvider(context, telemetryReporter); await loginService.initialize(context); @@ -24,17 +24,17 @@ export async function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.authentication.registerAuthenticationProvider('github', 'GitHub', { onDidChangeSessions: onDidChangeSessions.event, - getSessions: () => Promise.resolve(loginService.sessions), - login: async (scopeList: string[]) => { + getSessions: (scopes?: string[]) => loginService.getSessions(scopes), + createSession: async (scopeList: string[]) => { try { /* __GDPR__ "login" : { } */ telemetryReporter.sendTelemetryEvent('login'); - const session = await loginService.login(scopeList.sort().join(' ')); + const session = await loginService.createSession(scopeList.sort().join(' ')); Logger.info('Login success!'); - onDidChangeSessions.fire({ added: [session.id], removed: [], changed: [] }); + onDidChangeSessions.fire({ added: [session], removed: [], changed: [] }); return session; } catch (e) { // If login was cancelled, do not notify user. @@ -56,15 +56,17 @@ export async function activate(context: vscode.ExtensionContext) { throw e; } }, - logout: async (id: string) => { + removeSession: async (id: string) => { try { /* __GDPR__ "logout" : { } */ telemetryReporter.sendTelemetryEvent('logout'); - await loginService.logout(id); - onDidChangeSessions.fire({ added: [], removed: [id], changed: [] }); + const session = await loginService.removeSession(id); + if (session) { + onDidChangeSessions.fire({ added: [], removed: [session], changed: [] }); + } } catch (e) { /* __GDPR__ "logoutFailed" : { } diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts index 852127b9..595d1314 100644 --- a/extensions/github-authentication/src/github.ts +++ b/extensions/github-authentication/src/github.ts @@ -8,6 +8,8 @@ import { v4 as uuid } from 'uuid'; import { Keychain } from './common/keychain'; import { GitHubServer, NETWORK_ERROR } from './githubServer'; import Logger from './common/logger'; +import { arrayEquals } from './common/utils'; +import TelemetryReporter from 'vscode-extension-telemetry'; export const onDidChangeSessions = new vscode.EventEmitter(); @@ -24,12 +26,13 @@ interface SessionData { export class GitHubAuthenticationProvider { private _sessions: vscode.AuthenticationSession[] = []; - private _githubServer = new GitHubServer(); + private _githubServer: GitHubServer; private _keychain: Keychain; - constructor(context: vscode.ExtensionContext) { + constructor(context: vscode.ExtensionContext, telemetryReporter: TelemetryReporter) { this._keychain = new Keychain(context); + this._githubServer = new GitHubServer(telemetryReporter); } public async initialize(context: vscode.ExtensionContext): Promise { @@ -43,11 +46,18 @@ export class GitHubAuthenticationProvider { context.subscriptions.push(context.secrets.onDidChange(() => this.checkForUpdates())); } + async getSessions(scopes?: string[]): Promise { + return scopes + ? this._sessions.filter(session => arrayEquals(session.scopes, scopes)) + : this._sessions; + } + private async verifySessions(): Promise { const verifiedSessions: vscode.AuthenticationSession[] = []; const verificationPromises = this._sessions.map(async session => { try { await this._githubServer.getUserInfo(session.accessToken); + this._githubServer.checkIsEdu(session.accessToken); verifiedSessions.push(session); } catch (e) { // Remove sessions that return unauthorized response @@ -74,8 +84,8 @@ export class GitHubAuthenticationProvider { return; } - const added: string[] = []; - const removed: string[] = []; + const added: vscode.AuthenticationSession[] = []; + const removed: vscode.AuthenticationSession[] = []; storedSessions.forEach(session => { const matchesExisting = this._sessions.some(s => s.id === session.id); @@ -83,7 +93,7 @@ export class GitHubAuthenticationProvider { if (!matchesExisting) { Logger.info('Adding session found in keychain'); this._sessions.push(session); - added.push(session.id); + added.push(session); } }); @@ -97,7 +107,7 @@ export class GitHubAuthenticationProvider { this._sessions.splice(sessionIndex, 1); } - removed.push(session.id); + removed.push(session); } }); @@ -153,9 +163,10 @@ export class GitHubAuthenticationProvider { return this._sessions; } - public async login(scopes: string): Promise { + public async createSession(scopes: string): Promise { const token = await this._githubServer.login(scopes); const session = await this.tokenToSession(token, scopes.split(' ')); + this._githubServer.checkIsEdu(token); await this.setToken(session); return session; } @@ -185,15 +196,18 @@ export class GitHubAuthenticationProvider { await this.storeSessions(); } - public async logout(id: string) { + public async removeSession(id: string): Promise { Logger.info(`Logging out of ${id}`); const sessionIndex = this._sessions.findIndex(session => session.id === id); + let session: vscode.AuthenticationSession | undefined; if (sessionIndex > -1) { + session = this._sessions[sessionIndex]; this._sessions.splice(sessionIndex, 1); } else { Logger.error('Session not found'); } await this.storeSessions(); + return session; } } diff --git a/extensions/github-authentication/src/githubServer.ts b/extensions/github-authentication/src/githubServer.ts index b50285c9..b5281ac9 100644 --- a/extensions/github-authentication/src/githubServer.ts +++ b/extensions/github-authentication/src/githubServer.ts @@ -9,6 +9,7 @@ import fetch, { Response } from 'node-fetch'; import { v4 as uuid } from 'uuid'; import { PromiseAdapter, promiseFromEvent } from './common/utils'; import Logger from './common/logger'; +import TelemetryReporter from 'vscode-extension-telemetry'; const localize = nls.loadMessageBundle(); @@ -39,7 +40,9 @@ export class GitHubServer { private _statusBarItem: vscode.StatusBarItem | undefined; private _pendingStates = new Map(); - private _codeExchangePromises = new Map>(); + private _codeExchangePromises = new Map, cancel: vscode.EventEmitter }>(); + + constructor(private readonly telemetryReporter: TelemetryReporter) { } private isTestEnvironment(url: vscode.Uri): boolean { return url.authority === 'vscode-web-test-playground.azurewebsites.net' || url.authority.startsWith('localhost:'); @@ -83,17 +86,21 @@ export class GitHubServer { // Register a single listener for the URI callback, in case the user starts the login process multiple times // before completing it. - let existingPromise = this._codeExchangePromises.get(scopes); - if (!existingPromise) { - existingPromise = promiseFromEvent(uriHandler.event, this.exchangeCodeForToken(scopes)); - this._codeExchangePromises.set(scopes, existingPromise); + let codeExchangePromise = this._codeExchangePromises.get(scopes); + if (!codeExchangePromise) { + codeExchangePromise = promiseFromEvent(uriHandler.event, this.exchangeCodeForToken(scopes)); + this._codeExchangePromises.set(scopes, codeExchangePromise); } return Promise.race([ - existingPromise, - promiseFromEvent(onDidManuallyProvideToken.event, (token: string | undefined): string => { if (!token) { throw new Error('Cancelled'); } return token; }) + codeExchangePromise.promise, + promiseFromEvent(onDidManuallyProvideToken.event, (token: string | undefined): string => { + if (!token) { throw new Error('Cancelled'); } + return token; + }).promise ]).finally(() => { this._pendingStates.delete(scopes); + codeExchangePromise?.cancel.fire(); this._codeExchangePromises.delete(scopes); this.updateStatusBarItem(false); }); @@ -153,7 +160,7 @@ export class GitHubServer { } try { - const uri = vscode.Uri.parse(uriOrToken); + const uri = vscode.Uri.parse(uriOrToken.trim()); if (!uri.scheme || uri.scheme === 'file') { throw new Error; } uriHandler.handleUri(uri); } catch (e) { @@ -210,4 +217,36 @@ export class GitHubServer { throw new Error(result.statusText); } } + + public async checkIsEdu(token: string): Promise { + try { + const result = await fetch('https://education.github.com/api/user', { + headers: { + Authorization: `token ${token}`, + 'faculty-check-preview': 'true', + 'User-Agent': 'Visual-Studio-Code' + } + }); + + if (result.ok) { + const json: { student: boolean, faculty: boolean } = await result.json(); + + /* __GDPR__ + "session" : { + "isEdu": { "classification": "NonIdentifiableDemographicInfo", "purpose": "FeatureInsight" } + } + */ + this.telemetryReporter.sendTelemetryEvent('session', { + isEdu: json.student + ? 'student' + : json.faculty + ? 'faculty' + : 'none' + }); + } + } catch (e) { + // No-op + } + + } } diff --git a/extensions/github-authentication/yarn.lock b/extensions/github-authentication/yarn.lock index 1da6beed..5220f268 100644 --- a/extensions/github-authentication/yarn.lock +++ b/extensions/github-authentication/yarn.lock @@ -84,10 +84,10 @@ mime-types@^2.1.12: dependencies: mime-db "1.44.0" -node-fetch@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== semver@^5.3.0: version "5.7.1" diff --git a/extensions/github/package.json b/extensions/github/package.json index 828ca965..f6e7cd6b 100644 --- a/extensions/github/package.json +++ b/extensions/github/package.json @@ -64,5 +64,9 @@ }, "devDependencies": { "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/github/yarn.lock b/extensions/github/yarn.lock index 5e790ac2..05a0b4cf 100644 --- a/extensions/github/yarn.lock +++ b/extensions/github/yarn.lock @@ -125,9 +125,9 @@ is-plain-object@^3.0.0: integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== node-fetch@^2.3.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== once@^1.4.0: version "1.4.0" diff --git a/extensions/go/package.json b/extensions/go/package.json index 76116b3c..7b3bc149 100644 --- a/extensions/go/package.json +++ b/extensions/go/package.json @@ -1,40 +1,44 @@ { - "name": "go", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "*" - }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js jeff-hykin/better-go-syntax export/generated.tmLanguage.json ./syntaxes/go.tmLanguage.json" - }, - "contributes": { - "languages": [ - { - "id": "go", - "extensions": [ - ".go" - ], - "aliases": [ - "Go" - ], - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "go", - "scopeName": "source.go", - "path": "./syntaxes/go.tmLanguage.json" - } - ], - "configurationDefaults": { - "[go]": { - "editor.insertSpaces": false - } - } - } + "name": "go", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin jeff-hykin/better-go-syntax export/generated.tmLanguage.json ./syntaxes/go.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "go", + "extensions": [ + ".go" + ], + "aliases": [ + "Go" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "go", + "scopeName": "source.go", + "path": "./syntaxes/go.tmLanguage.json" + } + ], + "configurationDefaults": { + "[go]": { + "editor.insertSpaces": false + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/go/package.nls.json b/extensions/go/package.nls.json index dfd2ae9f..9c90cf2b 100644 --- a/extensions/go/package.nls.json +++ b/extensions/go/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Go Language Basics", "description": "Provides syntax highlighting and bracket matching in Go files." -} \ No newline at end of file +} diff --git a/extensions/go/yarn.lock b/extensions/go/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/go/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/groovy/package.json b/extensions/groovy/package.json index 049b65e1..a7000f89 100644 --- a/extensions/groovy/package.json +++ b/extensions/groovy/package.json @@ -1,32 +1,57 @@ { - "name": "groovy", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json" + "name": "groovy", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" }, - "contributes": { - "languages": [{ - "id": "groovy", - "aliases": ["Groovy", "groovy"], - "extensions": [".groovy", ".gvy", ".gradle", ".jenkinsfile", ".nf"], - "filenames": [ "Jenkinsfile" ], - "filenamePatterns": ["Jenkinsfile.*"], - "firstLine": "^#!.*\\bgroovy\\b", - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "groovy", - "scopeName": "source.groovy", - "path": "./syntaxes/groovy.tmLanguage.json" - }], - "snippets": [{ - "language": "groovy", - "path": "./snippets/groovy.code-snippets" - }] - } + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "groovy", + "aliases": [ + "Groovy", + "groovy" + ], + "extensions": [ + ".groovy", + ".gvy", + ".gradle", + ".jenkinsfile", + ".nf" + ], + "filenames": [ + "Jenkinsfile" + ], + "filenamePatterns": [ + "Jenkinsfile.*" + ], + "firstLine": "^#!.*\\bgroovy\\b", + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "groovy", + "scopeName": "source.groovy", + "path": "./syntaxes/groovy.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "groovy", + "path": "./snippets/groovy.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/groovy/package.nls.json b/extensions/groovy/package.nls.json index 9e08b0bf..60416fc2 100644 --- a/extensions/groovy/package.nls.json +++ b/extensions/groovy/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Groovy Language Basics", "description": "Provides snippets, syntax highlighting and bracket matching in Groovy files." -} \ No newline at end of file +} diff --git a/extensions/groovy/yarn.lock b/extensions/groovy/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/groovy/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/grunt/package.json b/extensions/grunt/package.json index ccf9440b..b5a46f91 100644 --- a/extensions/grunt/package.json +++ b/extensions/grunt/package.json @@ -66,5 +66,9 @@ } } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/gulp/package.json b/extensions/gulp/package.json index b0b25f31..116e1c55 100644 --- a/extensions/gulp/package.json +++ b/extensions/gulp/package.json @@ -62,5 +62,9 @@ } } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/gulp/package.nls.json b/extensions/gulp/package.nls.json index fee639e5..a87dbe1d 100644 --- a/extensions/gulp/package.nls.json +++ b/extensions/gulp/package.nls.json @@ -4,4 +4,4 @@ "config.gulp.autoDetect": "Controls whether auto detection of Gulp tasks is on or off. Default is on.", "gulp.taskDefinition.type.description": "The Gulp task to customize.", "gulp.taskDefinition.file.description": "The Gulp file that provides the task. Can be omitted." -} \ No newline at end of file +} diff --git a/extensions/handlebars/package.json b/extensions/handlebars/package.json index 37b63ee5..0eb6cb2e 100644 --- a/extensions/handlebars/package.json +++ b/extensions/handlebars/package.json @@ -1,7 +1,7 @@ { - "name": "handlebars", - "displayName": "%displayName%", - "description": "%description%", + "name": "handlebars", + "displayName": "%displayName%", + "description": "%description%", "version": "1.0.0", "publisher": "vscode", "license": "MIT", @@ -9,20 +9,37 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js daaain/Handlebars grammars/Handlebars.json ./syntaxes/Handlebars.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin daaain/Handlebars grammars/Handlebars.json ./syntaxes/Handlebars.tmLanguage.json" }, - "contributes": { - "languages": [{ - "id": "handlebars", - "extensions": [ ".handlebars", ".hbs", ".hjs" ], - "aliases": [ "Handlebars", "handlebars" ], - "mimetypes": ["text/x-handlebars-template"], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "handlebars", - "scopeName": "text.html.handlebars", - "path": "./syntaxes/Handlebars.tmLanguage.json" - }] + "contributes": { + "languages": [ + { + "id": "handlebars", + "extensions": [ + ".handlebars", + ".hbs", + ".hjs" + ], + "aliases": [ + "Handlebars", + "handlebars" + ], + "mimetypes": [ + "text/x-handlebars-template" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "handlebars", + "scopeName": "text.html.handlebars", + "path": "./syntaxes/Handlebars.tmLanguage.json" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/handlebars/package.nls.json b/extensions/handlebars/package.nls.json index 1c2e3910..0d2154b0 100644 --- a/extensions/handlebars/package.nls.json +++ b/extensions/handlebars/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Handlebars Language Basics", "description": "Provides syntax highlighting and bracket matching in Handlebars files." -} \ No newline at end of file +} diff --git a/extensions/handlebars/yarn.lock b/extensions/handlebars/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/handlebars/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/hlsl/package.json b/extensions/hlsl/package.json index b2f635b4..046ff9b3 100644 --- a/extensions/hlsl/package.json +++ b/extensions/hlsl/package.json @@ -1,25 +1,47 @@ { - "name": "hlsl", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js tgjones/shaders-tmLanguage grammars/hlsl.json ./syntaxes/hlsl.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "hlsl", - "extensions": [".hlsl",".hlsli",".fx",".fxh",".vsh",".psh",".cginc",".compute"], - "aliases": ["HLSL", "hlsl"], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "hlsl", - "path": "./syntaxes/hlsl.tmLanguage.json", - "scopeName":"source.hlsl" - }] - } -} \ No newline at end of file + "name": "hlsl", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/hlsl.json ./syntaxes/hlsl.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "hlsl", + "extensions": [ + ".hlsl", + ".hlsli", + ".fx", + ".fxh", + ".vsh", + ".psh", + ".cginc", + ".compute" + ], + "aliases": [ + "HLSL", + "hlsl" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "hlsl", + "path": "./syntaxes/hlsl.tmLanguage.json", + "scopeName": "source.hlsl" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/hlsl/package.nls.json b/extensions/hlsl/package.nls.json index e9eefbab..097b2d25 100644 --- a/extensions/hlsl/package.nls.json +++ b/extensions/hlsl/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "HLSL Language Basics", "description": "Provides syntax highlighting and bracket matching in HLSL files." -} \ No newline at end of file +} diff --git a/extensions/hlsl/yarn.lock b/extensions/hlsl/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/hlsl/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 4caf26f2..63178122 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -240,5 +240,9 @@ }, "devDependencies": { "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 3fd01ff5..af9c6766 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -9,7 +9,7 @@ }, "main": "./out/node/htmlServerMain", "dependencies": { - "vscode-css-languageservice": "^5.0.3", + "vscode-css-languageservice": "^5.1.0", "vscode-html-languageservice": "^4.0.1", "vscode-languageserver": "^7.0.0", "vscode-nls": "^5.0.0", diff --git a/extensions/html-language-features/server/src/modes/cssMode.ts b/extensions/html-language-features/server/src/modes/cssMode.ts index f7c5455b..9757d99c 100644 --- a/extensions/html-language-features/server/src/modes/cssMode.ts +++ b/extensions/html-language-features/server/src/modes/cssMode.ts @@ -5,7 +5,7 @@ import { LanguageModelCache, getLanguageModelCache } from '../languageModelCache'; import { Stylesheet, LanguageService as CSSLanguageService } from 'vscode-css-languageservice'; -import { LanguageMode, Workspace, Color, TextDocument, Position, Range, CompletionList, DocumentContext, Settings } from './languageModes'; +import { LanguageMode, Workspace, Color, TextDocument, Position, Range, CompletionList, DocumentContext } from './languageModes'; import { HTMLDocumentRegions, CSS_STYLE_RULE } from './embeddedSupport'; export function getCSSMode(cssLanguageService: CSSLanguageService, documentRegions: LanguageModelCache, workspace: Workspace): LanguageMode { @@ -23,11 +23,11 @@ export function getCSSMode(cssLanguageService: CSSLanguageService, documentRegio async doComplete(document: TextDocument, position: Position, documentContext: DocumentContext, _settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); const stylesheet = cssStylesheets.get(embedded); - return cssLanguageService.doComplete2(embedded, position, stylesheet, documentContext) || CompletionList.create(); + return cssLanguageService.doComplete2(embedded, position, stylesheet, documentContext, _settings?.css?.completion) || CompletionList.create(); }, - async doHover(document: TextDocument, position: Position, settings?: Settings) { + async doHover(document: TextDocument, position: Position, settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); - return cssLanguageService.doHover(embedded, position, cssStylesheets.get(embedded), settings?.html?.hover); + return cssLanguageService.doHover(embedded, position, cssStylesheets.get(embedded), settings?.css?.hover); }, async findDocumentHighlight(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 3db23362..f6e11d5c 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -12,10 +12,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.9.tgz#990ad687ad8b26ef6dcc34a4f69c33d40c95b679" integrity sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q== -vscode-css-languageservice@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.0.3.tgz#2d400a47e73d0bfc5bc0d3fdf5be487cfdca341b" - integrity sha512-KJt4jhCxqrgGrC02UsQsKw90dPkFknMHsH5HTInT7gkDRRfGFwEd+e2O1/E75br3TdFhvRmzjljYz5thZ58L3A== +vscode-css-languageservice@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.0.tgz#cd172d13e9e7ae23ba567c73778aee10475ff716" + integrity sha512-iLHd/WjRKgaZBXMNeUooHG+r0qlhJBkXa+3MpQQR6Rpm928cis/3OV2Mp1R80yAQevIMeDL32RIJfHoJCT/RRg== dependencies: vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.16.0" diff --git a/extensions/html/build/update-grammar.js b/extensions/html/build/update-grammar.js index 3277cb16..03d69042 100644 --- a/extensions/html/build/update-grammar.js +++ b/extensions/html/build/update-grammar.js @@ -5,7 +5,7 @@ // @ts-check 'use strict'; -var updateGrammar = require('../../../build/npm/update-grammar'); +var updateGrammar = require('vscode-grammar-updater'); function patchGrammar(grammar) { let patchCount = 0; diff --git a/extensions/html/package.json b/extensions/html/package.json index 6b1eac2d..4a8e8911 100644 --- a/extensions/html/package.json +++ b/extensions/html/package.json @@ -1,7 +1,7 @@ { "name": "html", "displayName": "%displayName%", - "description": "%description%", + "description": "%description%", "version": "1.0.0", "publisher": "vscode", "license": "MIT", @@ -77,5 +77,9 @@ } } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/html/package.nls.json b/extensions/html/package.nls.json index 3dde415b..aca7ad3c 100644 --- a/extensions/html/package.nls.json +++ b/extensions/html/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "HTML Language Basics", "description": "Provides syntax highlighting, bracket matching & snippets in HTML files." -} \ No newline at end of file +} diff --git a/extensions/html/yarn.lock b/extensions/html/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/html/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/image-preview/package.json b/extensions/image-preview/package.json index 69fd11e5..5f49df1d 100644 --- a/extensions/image-preview/package.json +++ b/extensions/image-preview/package.json @@ -77,5 +77,9 @@ "dependencies": { "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/image-preview/src/ownedStatusBarEntry.ts b/extensions/image-preview/src/ownedStatusBarEntry.ts index 7be0ec30..51c9e255 100644 --- a/extensions/image-preview/src/ownedStatusBarEntry.ts +++ b/extensions/image-preview/src/ownedStatusBarEntry.ts @@ -11,7 +11,7 @@ export abstract class PreviewStatusBarEntry extends Disposable { protected readonly entry: vscode.StatusBarItem; - constructor(options: vscode.window.StatusBarItemOptions) { + constructor(options: vscode.StatusBarItemOptions) { super(); this.entry = this._register(vscode.window.createStatusBarItem(options)); } diff --git a/extensions/ini/package.json b/extensions/ini/package.json index 24d86072..324e4c87 100644 --- a/extensions/ini/package.json +++ b/extensions/ini/package.json @@ -1,37 +1,70 @@ { - "name": "ini", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "ini", - "extensions": [ ".ini"], - "aliases": [ "Ini", "ini" ], - "configuration": "./ini.language-configuration.json" - }, - { - "id": "properties", - "extensions": [ ".properties", ".cfg", ".conf", ".directory", ".gitattributes", ".gitconfig", ".gitmodules", ".editorconfig" ], - "filenames": [ "gitconfig" ], - "filenamePatterns": [ "**/.config/git/config", "**/.git/config" ], - "aliases": [ "Properties", "properties" ], - "configuration": "./properties.language-configuration.json" - }], - "grammars": [{ - "language": "ini", - "scopeName": "source.ini", - "path": "./syntaxes/ini.tmLanguage.json" - },{ - "language": "properties", - "scopeName": "source.ini", - "path": "./syntaxes/ini.tmLanguage.json" - }] - } + "name": "ini", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "ini", + "extensions": [ + ".ini" + ], + "aliases": [ + "Ini", + "ini" + ], + "configuration": "./ini.language-configuration.json" + }, + { + "id": "properties", + "extensions": [ + ".properties", + ".cfg", + ".conf", + ".directory", + ".gitattributes", + ".gitconfig", + ".gitmodules", + ".editorconfig" + ], + "filenames": [ + "gitconfig" + ], + "filenamePatterns": [ + "**/.config/git/config", + "**/.git/config" + ], + "aliases": [ + "Properties", + "properties" + ], + "configuration": "./properties.language-configuration.json" + } + ], + "grammars": [ + { + "language": "ini", + "scopeName": "source.ini", + "path": "./syntaxes/ini.tmLanguage.json" + }, + { + "language": "properties", + "scopeName": "source.ini", + "path": "./syntaxes/ini.tmLanguage.json" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/ini/package.nls.json b/extensions/ini/package.nls.json index 9696de83..f368257e 100644 --- a/extensions/ini/package.nls.json +++ b/extensions/ini/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Ini Language Basics", "description": "Provides syntax highlighting and bracket matching in Ini files." -} \ No newline at end of file +} diff --git a/extensions/ini/yarn.lock b/extensions/ini/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/ini/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/jake/package.json b/extensions/jake/package.json index 03e60fe3..0c1f0c97 100644 --- a/extensions/jake/package.json +++ b/extensions/jake/package.json @@ -62,5 +62,9 @@ } } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/jake/package.nls.json b/extensions/jake/package.nls.json index 8150f471..c2dfb3c3 100644 --- a/extensions/jake/package.nls.json +++ b/extensions/jake/package.nls.json @@ -4,4 +4,4 @@ "jake.taskDefinition.type.description": "The Jake task to customize.", "jake.taskDefinition.file.description": "The Jake file that provides the task. Can be omitted.", "config.jake.autoDetect": "Controls whether auto detection of Jake tasks is on or off. Default is on." -} \ No newline at end of file +} diff --git a/extensions/java/cgmanifest.json b/extensions/java/cgmanifest.json index 88521b95..a4db862a 100644 --- a/extensions/java/cgmanifest.json +++ b/extensions/java/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "atom/language-java", "repositoryUrl": "https://github.com/atom/language-java", - "commitHash": "2bd3e55a72b08e171f811a2445343e2df9d89b71" + "commitHash": "29f977dc42a7e2568b39bb6fb34c4ef108eb59b3" } }, "license": "MIT", - "version": "0.32.0" + "version": "0.32.1" } ], "version": 1 diff --git a/extensions/java/package.json b/extensions/java/package.json index 96f8c8c4..d71aa1c1 100644 --- a/extensions/java/package.json +++ b/extensions/java/package.json @@ -1,29 +1,47 @@ { - "name": "java", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js atom/language-java grammars/java.cson ./syntaxes/java.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "java", - "extensions": [ ".java", ".jav" ], - "aliases": [ "Java", "java" ], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "java", - "scopeName": "source.java", - "path": "./syntaxes/java.tmLanguage.json" - }], - "snippets": [{ - "language": "java", - "path": "./snippets/java.code-snippets" - }] - } + "name": "java", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-java grammars/java.cson ./syntaxes/java.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "java", + "extensions": [ + ".java", + ".jav" + ], + "aliases": [ + "Java", + "java" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "java", + "scopeName": "source.java", + "path": "./syntaxes/java.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "java", + "path": "./snippets/java.code-snippets" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/java/package.nls.json b/extensions/java/package.nls.json index 72c9857c..829072aa 100644 --- a/extensions/java/package.nls.json +++ b/extensions/java/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Java Language Basics", "description": "Provides snippets, syntax highlighting, bracket matching and folding in Java files." -} \ No newline at end of file +} diff --git a/extensions/java/syntaxes/java.tmLanguage.json b/extensions/java/syntaxes/java.tmLanguage.json index 91716ded..be70cbb2 100644 --- a/extensions/java/syntaxes/java.tmLanguage.json +++ b/extensions/java/syntaxes/java.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/atom/language-java/commit/2bd3e55a72b08e171f811a2445343e2df9d89b71", + "version": "https://github.com/atom/language-java/commit/29f977dc42a7e2568b39bb6fb34c4ef108eb59b3", "name": "Java", "scopeName": "source.java", "patterns": [ @@ -1133,6 +1133,12 @@ "end": "(?=})", "contentName": "meta.module.body.java", "patterns": [ + { + "include": "#comments" + }, + { + "include": "#comments-javadoc" + }, { "match": "\\b(requires|transitive|exports|opens|to|uses|provides|with)\\b", "name": "keyword.module.java" diff --git a/extensions/java/yarn.lock b/extensions/java/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/java/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/javascript/package.json b/extensions/javascript/package.json index d63bebde..d68096be 100644 --- a/extensions/javascript/package.json +++ b/extensions/javascript/package.json @@ -94,27 +94,59 @@ { "language": "javascript", "scopes": { - "property": ["variable.other.property.js"], - "property.readonly": ["variable.other.constant.property.js"], - "variable": ["variable.other.readwrite.js"], - "variable.readonly": ["variable.other.constant.object.js"], - "function": ["entity.name.function.js"], - "namespace": ["entity.name.type.module.js"], - "variable.defaultLibrary": ["support.variable.js"], - "function.defaultLibrary": ["support.function.js"] + "property": [ + "variable.other.property.js" + ], + "property.readonly": [ + "variable.other.constant.property.js" + ], + "variable": [ + "variable.other.readwrite.js" + ], + "variable.readonly": [ + "variable.other.constant.object.js" + ], + "function": [ + "entity.name.function.js" + ], + "namespace": [ + "entity.name.type.module.js" + ], + "variable.defaultLibrary": [ + "support.variable.js" + ], + "function.defaultLibrary": [ + "support.function.js" + ] } }, { "language": "javascriptreact", "scopes": { - "property": ["variable.other.property.jsx"], - "property.readonly": ["variable.other.constant.property.jsx"], - "variable": ["variable.other.readwrite.jsx"], - "variable.readonly": ["variable.other.constant.object.jsx"], - "function": ["entity.name.function.jsx"], - "namespace": ["entity.name.type.module.jsx"], - "variable.defaultLibrary": ["support.variable.js"], - "function.defaultLibrary": ["support.function.js"] + "property": [ + "variable.other.property.jsx" + ], + "property.readonly": [ + "variable.other.constant.property.jsx" + ], + "variable": [ + "variable.other.readwrite.jsx" + ], + "variable.readonly": [ + "variable.other.constant.object.jsx" + ], + "function": [ + "entity.name.function.jsx" + ], + "namespace": [ + "entity.name.type.module.jsx" + ], + "variable.defaultLibrary": [ + "support.variable.js" + ], + "function.defaultLibrary": [ + "support.function.js" + ] } } ], @@ -128,5 +160,9 @@ "path": "./snippets/javascript.code-snippets" } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/javascript/package.nls.json b/extensions/javascript/package.nls.json index bb1285e1..b7df6e14 100644 --- a/extensions/javascript/package.nls.json +++ b/extensions/javascript/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "JavaScript Language Basics", "description": "Provides snippets, syntax highlighting, bracket matching and folding in JavaScript files." -} \ No newline at end of file +} diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index a6cf7288..2d7a18e6 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/398985941eb36cd270054a6e668d03fb9ef92e77", + "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/d3c203d25a1df5def83082a47d1fe20fda2e80df", "name": "JavaScript (with React support)", "scopeName": "source.js", "patterns": [ @@ -134,7 +134,7 @@ "name": "keyword.control.flow.js" } }, - "end": "(?=[;}]|$|;|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", + "end": "(?=[;}]|$|;|^\\s*$|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", "patterns": [ { "include": "#expression" @@ -299,7 +299,7 @@ { "name": "meta.var.expr.js", "begin": "(?=(?=|<>|<|>" }, { - "match": "(?<=[_$[:alnum:]])(\\!)\\s*(/)(?![/*])", + "match": "(?<=[_$[:alnum:]])(\\!)\\s*(?:(/=)|(?:(/)(?![/*])))", "captures": { "1": { "name": "keyword.operator.logical.js" }, "2": { + "name": "keyword.operator.assignment.compound.js" + }, + "3": { "name": "keyword.operator.arithmetic.js" } } @@ -3323,10 +3326,13 @@ "match": "%|\\*|/|-|\\+" }, { - "begin": "(?<=[_$[:alnum:])\\]])\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)+(/)(?![/*]))", - "end": "(/)(?!\\*([^\\*]|(\\*[^\\/]))*\\*\\/)", + "begin": "(?<=[_$[:alnum:])\\]])\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)+(?:(/=)|(?:(/)(?![/*]))))", + "end": "(?:(/=)|(?:(/)(?!\\*([^\\*]|(\\*[^\\/]))*\\*\\/)))", "endCaptures": { "1": { + "name": "keyword.operator.assignment.compound.js" + }, + "2": { "name": "keyword.operator.arithmetic.js" } }, @@ -3337,9 +3343,12 @@ ] }, { - "match": "(?<=[_$[:alnum:])\\]])\\s*(/)(?![/*])", + "match": "(?<=[_$[:alnum:])\\]])\\s*(?:(/=)|(?:(/)(?![/*])))", "captures": { "1": { + "name": "keyword.operator.assignment.compound.js" + }, + "2": { "name": "keyword.operator.arithmetic.js" } } @@ -3353,7 +3362,7 @@ "name": "keyword.operator.expression.typeof.js" } }, - "end": "(?=[,);}\\]=>]|$|;|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", + "end": "(?=[,);}\\]=>]|$|;|^\\s*$|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", "patterns": [ { "include": "#expression" diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json index c5e95792..417e6e76 100644 --- a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/398985941eb36cd270054a6e668d03fb9ef92e77", + "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/d3c203d25a1df5def83082a47d1fe20fda2e80df", "name": "JavaScript (with React support)", "scopeName": "source.js.jsx", "patterns": [ @@ -134,7 +134,7 @@ "name": "keyword.control.flow.js.jsx" } }, - "end": "(?=[;}]|$|;|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", + "end": "(?=[;}]|$|;|^\\s*$|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", "patterns": [ { "include": "#expression" @@ -299,7 +299,7 @@ { "name": "meta.var.expr.js.jsx", "begin": "(?=(?=|<>|<|>" }, { - "match": "(?<=[_$[:alnum:]])(\\!)\\s*(/)(?![/*])", + "match": "(?<=[_$[:alnum:]])(\\!)\\s*(?:(/=)|(?:(/)(?![/*])))", "captures": { "1": { "name": "keyword.operator.logical.js.jsx" }, "2": { + "name": "keyword.operator.assignment.compound.js.jsx" + }, + "3": { "name": "keyword.operator.arithmetic.js.jsx" } } @@ -3323,10 +3326,13 @@ "match": "%|\\*|/|-|\\+" }, { - "begin": "(?<=[_$[:alnum:])\\]])\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)+(/)(?![/*]))", - "end": "(/)(?!\\*([^\\*]|(\\*[^\\/]))*\\*\\/)", + "begin": "(?<=[_$[:alnum:])\\]])\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)+(?:(/=)|(?:(/)(?![/*]))))", + "end": "(?:(/=)|(?:(/)(?!\\*([^\\*]|(\\*[^\\/]))*\\*\\/)))", "endCaptures": { "1": { + "name": "keyword.operator.assignment.compound.js.jsx" + }, + "2": { "name": "keyword.operator.arithmetic.js.jsx" } }, @@ -3337,9 +3343,12 @@ ] }, { - "match": "(?<=[_$[:alnum:])\\]])\\s*(/)(?![/*])", + "match": "(?<=[_$[:alnum:])\\]])\\s*(?:(/=)|(?:(/)(?![/*])))", "captures": { "1": { + "name": "keyword.operator.assignment.compound.js.jsx" + }, + "2": { "name": "keyword.operator.arithmetic.js.jsx" } } @@ -3353,7 +3362,7 @@ "name": "keyword.operator.expression.typeof.js.jsx" } }, - "end": "(?=[,);}\\]=>]|$|;|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", + "end": "(?=[,);}\\]=>]|$|;|^\\s*$|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", "patterns": [ { "include": "#expression" diff --git a/extensions/javascript/yarn.lock b/extensions/javascript/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/javascript/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index c36b2e6a..14ea6e0c 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -1,139 +1,143 @@ { - "name": "json-language-features", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", - "engines": { - "vscode": "0.10.x" - }, - "icon": "icons/json.png", - "activationEvents": [ - "onLanguage:json", - "onLanguage:jsonc" - ], - "main": "./client/out/node/jsonClientMain", - "browser": "./client/dist/browser/jsonClientMain", - "enableProposedApi": true, - "scripts": { - "compile": "gulp compile-extension:json-language-features-client compile-extension:json-language-features-server", - "watch": "gulp watch-extension:json-language-features-client watch-extension:json-language-features-server", - "install-client-next": "yarn add vscode-languageclient@next" - }, - "categories": [ - "Programming Languages" - ], - "contributes": { - "configuration": { - "id": "json", - "order": 20, + "name": "json-language-features", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "engines": { + "vscode": "0.10.x" + }, + "icon": "icons/json.png", + "activationEvents": [ + "onLanguage:json", + "onLanguage:jsonc" + ], + "main": "./client/out/node/jsonClientMain", + "browser": "./client/dist/browser/jsonClientMain", + "enableProposedApi": true, + "scripts": { + "compile": "gulp compile-extension:json-language-features-client compile-extension:json-language-features-server", + "watch": "gulp watch-extension:json-language-features-client watch-extension:json-language-features-server", + "install-client-next": "yarn add vscode-languageclient@next" + }, + "categories": [ + "Programming Languages" + ], + "contributes": { + "configuration": { + "id": "json", + "order": 20, + "type": "object", + "title": "JSON", + "properties": { + "json.schemas": { + "type": "array", + "scope": "resource", + "description": "%json.schemas.desc%", + "items": { "type": "object", - "title": "JSON", - "properties": { - "json.schemas": { - "type": "array", - "scope": "resource", - "description": "%json.schemas.desc%", - "items": { - "type": "object", - "default": { - "fileMatch": [ - "/myfile" - ], - "url": "schemaURL" - }, - "properties": { - "url": { - "type": "string", - "default": "/user.schema.json", - "description": "%json.schemas.url.desc%" - }, - "fileMatch": { - "type": "array", - "items": { - "type": "string", - "default": "MyFile.json", - "description": "%json.schemas.fileMatch.item.desc%" - }, - "minItems": 1, - "description": "%json.schemas.fileMatch.desc%" - }, - "schema": { - "$ref": "http://json-schema.org/draft-07/schema#", - "description": "%json.schemas.schema.desc%" - } - } - } - }, - "json.format.enable": { - "type": "boolean", - "scope": "window", - "default": true, - "description": "%json.format.enable.desc%" - }, - "json.trace.server": { - "type": "string", - "scope": "window", - "enum": [ - "off", - "messages", - "verbose" - ], - "default": "off", - "description": "%json.tracing.desc%" - }, - "json.colorDecorators.enable": { - "type": "boolean", - "scope": "window", - "default": true, - "description": "%json.colorDecorators.enable.desc%", - "deprecationMessage": "%json.colorDecorators.enable.deprecationMessage%" - }, - "json.maxItemsComputed": { - "type": "number", - "default": 5000, - "description": "%json.maxItemsComputed.desc%" - }, - "json.schemaDownload.enable": { - "type": "boolean", - "default": true, - "description": "%json.enableSchemaDownload.desc%", - "tags": [ - "usesOnlineServices" - ] - } - } - }, - "configurationDefaults": { - "[json]": { - "editor.quickSuggestions": { - "strings": true - }, - "editor.suggest.insertMode": "replace" + "default": { + "fileMatch": [ + "/myfile" + ], + "url": "schemaURL" }, - "[jsonc]": { - "editor.quickSuggestions": { - "strings": true + "properties": { + "url": { + "type": "string", + "default": "/user.schema.json", + "description": "%json.schemas.url.desc%" + }, + "fileMatch": { + "type": "array", + "items": { + "type": "string", + "default": "MyFile.json", + "description": "%json.schemas.fileMatch.item.desc%" }, - "editor.suggest.insertMode": "replace" + "minItems": 1, + "description": "%json.schemas.fileMatch.desc%" + }, + "schema": { + "$ref": "http://json-schema.org/draft-07/schema#", + "description": "%json.schemas.schema.desc%" + } } + } }, - "jsonValidation": [ - { - "fileMatch": "*.schema.json", - "url": "http://json-schema.org/draft-07/schema#" - } - ] + "json.format.enable": { + "type": "boolean", + "scope": "window", + "default": true, + "description": "%json.format.enable.desc%" + }, + "json.trace.server": { + "type": "string", + "scope": "window", + "enum": [ + "off", + "messages", + "verbose" + ], + "default": "off", + "description": "%json.tracing.desc%" + }, + "json.colorDecorators.enable": { + "type": "boolean", + "scope": "window", + "default": true, + "description": "%json.colorDecorators.enable.desc%", + "deprecationMessage": "%json.colorDecorators.enable.deprecationMessage%" + }, + "json.maxItemsComputed": { + "type": "number", + "default": 5000, + "description": "%json.maxItemsComputed.desc%" + }, + "json.schemaDownload.enable": { + "type": "boolean", + "default": true, + "description": "%json.enableSchemaDownload.desc%", + "tags": [ + "usesOnlineServices" + ] + } + } }, - "dependencies": { - "request-light": "^0.4.0", - "vscode-extension-telemetry": "0.1.1", - "vscode-languageclient": "^7.0.0", - "vscode-nls": "^5.0.0" + "configurationDefaults": { + "[json]": { + "editor.quickSuggestions": { + "strings": true + }, + "editor.suggest.insertMode": "replace" + }, + "[jsonc]": { + "editor.quickSuggestions": { + "strings": true + }, + "editor.suggest.insertMode": "replace" + } }, - "devDependencies": { - "@types/node": "^12.19.9" - } + "jsonValidation": [ + { + "fileMatch": "*.schema.json", + "url": "http://json-schema.org/draft-07/schema#" + } + ] + }, + "dependencies": { + "request-light": "^0.4.0", + "vscode-extension-telemetry": "0.1.1", + "vscode-languageclient": "^7.0.0", + "vscode-nls": "^5.0.0" + }, + "devDependencies": { + "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/json-language-features/server/README.md b/extensions/json-language-features/server/README.md index 2e8745c7..328a523f 100644 --- a/extensions/json-language-features/server/README.md +++ b/extensions/json-language-features/server/README.md @@ -167,7 +167,6 @@ interface ISchemaAssociation { * A match succeeds when there is at least one pattern matching and last matching pattern does not start with '!'. */ fileMatch: string[]; - /* * The schema for the given URI. * If no schema is provided, the schema will be fetched with the schema request service (if available). @@ -203,16 +202,16 @@ The JSON language server is shipped with [Visual Studio Code](https://code.visua If you plan to integrate the JSON language server into an editor and IDE, check out [this page](https://microsoft.github.io/language-server-protocol/implementors/tools/) if there's already an LSP client integration available. You can also launch the language server as a command and connect to it. -For that, install the `json-language-server` npm module: +For that, install the `vscode-json-languageserver` npm module: -`npm install -g json-language-server` +`npm install -g vscode-json-languageserver` -Start the language server with the `json-language-server` command. Use a command line argument to specify the preferred communication channel: +Start the language server with the `vscode-json-languageserver` command. Use a command line argument to specify the preferred communication channel: ``` -json-language-server --node-ipc -json-language-server --stdio -json-language-server --socket= +vscode-json-languageserver --node-ipc +vscode-json-languageserver --stdio +vscode-json-languageserver --socket= ``` To connect to the server from NodeJS, see Remy Suen's great write-up on [how to communicate with the server](https://github.com/rcjsuen/dockerfile-language-server-nodejs#communicating-with-the-server) through the available communication channels. diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 6d1e3143..2c8fb002 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -1,7 +1,7 @@ { "name": "vscode-json-languageserver", "description": "JSON language server", - "version": "1.3.1", + "version": "1.3.4", "author": "Microsoft Corporation", "license": "MIT", "engines": { diff --git a/extensions/json/build/update-grammars.js b/extensions/json/build/update-grammars.js index bf72e529..3fb40c86 100644 --- a/extensions/json/build/update-grammars.js +++ b/extensions/json/build/update-grammars.js @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -var updateGrammar = require('../../../build/npm/update-grammar'); +var updateGrammar = require('vscode-grammar-updater'); function adaptJSON(grammar, replacementScope) { grammar.name = 'JSON with comments'; grammar.scopeName = `source${replacementScope}`; - var fixScopeNames = function(rule) { + var fixScopeNames = function (rule) { if (typeof rule.name === 'string') { rule.name = rule.name.replace(/\.json/g, replacementScope); } diff --git a/extensions/json/package.json b/extensions/json/package.json index 1b7331b2..a4ccc12c 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -74,5 +74,9 @@ "path": "./syntaxes/JSONC.tmLanguage.json" } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/json/package.nls.json b/extensions/json/package.nls.json index 6307b6dc..ee3b3286 100644 --- a/extensions/json/package.nls.json +++ b/extensions/json/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "JSON Language Basics", "description": "Provides syntax highlighting & bracket matching in JSON files." -} \ No newline at end of file +} diff --git a/extensions/json/yarn.lock b/extensions/json/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/json/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/julia/.vscodeignore b/extensions/julia/.vscodeignore new file mode 100644 index 00000000..d9011bec --- /dev/null +++ b/extensions/julia/.vscodeignore @@ -0,0 +1,2 @@ +build/** +cgmanifest.json diff --git a/extensions/julia/cgmanifest.json b/extensions/julia/cgmanifest.json new file mode 100644 index 00000000..9d03ce0d --- /dev/null +++ b/extensions/julia/cgmanifest.json @@ -0,0 +1,17 @@ +{ + "registrations": [ + { + "component": { + "type": "git", + "git": { + "name": " JuliaEditorSupport/atom-language-julia", + "repositoryUrl": "https://github.com/JuliaEditorSupport/atom-language-julia", + "commitHash": "8ae8d9cac742c65ae0bef1a5e2d068e2cae871bc" + } + }, + "license": "MIT", + "version": "0.21.0" + } + ], + "version": 1 +} \ No newline at end of file diff --git a/extensions/julia/language-configuration.json b/extensions/julia/language-configuration.json new file mode 100644 index 00000000..ea2f5011 --- /dev/null +++ b/extensions/julia/language-configuration.json @@ -0,0 +1,31 @@ +{ + "comments": { + "lineComment": "#", + "blockComment": [ "#=", "=#" ] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["`", "`"], + { "open": "\"", "close": "\"", "notIn": ["string", "comment"] } + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["`", "`"] + ], + "folding": { + "markers": { + "start": "^\\s*#region", + "end": "^\\s*#endregion" + } + } +} diff --git a/extensions/julia/package.json b/extensions/julia/package.json new file mode 100644 index 00000000..971ad4fe --- /dev/null +++ b/extensions/julia/package.json @@ -0,0 +1,54 @@ +{ + "name": "julia", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "0.10.x" + }, + "scripts": { + "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater JuliaEditorSupport/atom-language-julia grammars/julia_vscode.json ./syntaxes/julia.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "julia", + "aliases": [ + "Julia", + "julia" + ], + "extensions": [ + ".jl" + ], + "firstLine": "^#!\\s*/.*\\bjulia[0-9.-]*\\b", + "configuration": "./language-configuration.json" + }, + { + "id": "juliamarkdown", + "aliases": [ + "Julia Markdown", + "juliamarkdown" + ], + "extensions": [ + ".jmd" + ] + } + ], + "grammars": [ + { + "language": "julia", + "scopeName": "source.julia", + "path": "./syntaxes/julia.tmLanguage.json", + "embeddedLanguages": { + "meta.embedded.inline.cpp": "cpp", + "meta.embedded.inline.javascript": "javascript", + "meta.embedded.inline.python": "python", + "meta.embedded.inline.r": "r", + "meta.embedded.inline.sql": "sql" + } + } + ] + } +} diff --git a/extensions/julia/package.nls.json b/extensions/julia/package.nls.json new file mode 100644 index 00000000..0da34410 --- /dev/null +++ b/extensions/julia/package.nls.json @@ -0,0 +1,4 @@ +{ + "displayName": "Julia Language Basics", + "description": "Provides syntax highlighting & bracket matching in Julia files." +} diff --git a/extensions/julia/syntaxes/julia.tmLanguage.json b/extensions/julia/syntaxes/julia.tmLanguage.json new file mode 100644 index 00000000..c18a377c --- /dev/null +++ b/extensions/julia/syntaxes/julia.tmLanguage.json @@ -0,0 +1,1113 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/JuliaEditorSupport/atom-language-julia/blob/master/grammars/julia_vscode.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/JuliaEditorSupport/atom-language-julia/commit/8ae8d9cac742c65ae0bef1a5e2d068e2cae871bc", + "name": "Julia", + "scopeName": "source.julia", + "comment": "This grammar is used by Atom (Oniguruma), GitHub (PCRE), and VSCode (Oniguruma),\nso all regexps must be compatible with both engines.\n\nSpecs:\n- https://github.com/kkos/oniguruma/blob/master/doc/RE\n- https://www.pcre.org/current/doc/html/", + "patterns": [ + { + "include": "#operator" + }, + { + "include": "#array" + }, + { + "include": "#string" + }, + { + "include": "#bracket" + }, + { + "include": "#function_decl" + }, + { + "include": "#function_call" + }, + { + "include": "#keyword" + }, + { + "include": "#number" + }, + { + "include": "#comment" + }, + { + "include": "#type_decl" + }, + { + "include": "#symbol" + } + ], + "repository": { + "array": { + "patterns": [ + { + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "meta.bracket.julia" + } + }, + "end": "(?:\\])(?:(\\.)?'*)", + "endCaptures": { + "0": { + "name": "meta.bracket.julia" + }, + "1": { + "name": "keyword.operator.transpose.julia" + } + }, + "name": "meta.array.julia", + "patterns": [ + { + "match": "\\bbegin\\b", + "name": "constant.numeric.julia" + }, + { + "match": "\\bend\\b", + "name": "constant.numeric.julia" + }, + { + "match": "\\bfor\\b", + "name": "keyword.control.julia" + }, + { + "include": "$self" + } + ] + } + ] + }, + "bracket": { + "patterns": [ + { + "match": "(?:\\(|\\)|\\[|\\]|\\{|\\}|,|;)(?!('|(?:\\.'))*\\.?')", + "name": "meta.bracket.julia" + } + ] + }, + "comment": { + "patterns": [ + { + "include": "#comment_block" + }, + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.julia" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.julia" + } + ] + }, + "comment_block": { + "patterns": [ + { + "begin": "#=", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.julia" + } + }, + "end": "=#", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.julia" + } + }, + "name": "comment.block.number-sign-equals.julia", + "patterns": [ + { + "include": "#comment_block" + } + ] + } + ] + }, + "function_call": { + "patterns": [ + { + "begin": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?\\.?(?=\\()", + "beginCaptures": { + "1": { + "name": "support.function.julia" + }, + "2": { + "name": "support.type.julia" + } + }, + "end": "\\)(('|(\\.'))*\\.?')?", + "endCaptures": { + "0": { + "name": "meta.bracket.julia" + }, + "1": { + "name": "keyword.operator.transposed-func.julia" + } + }, + "patterns": [ + { + "match": "\\bfor\\b", + "name": "keyword.control.julia" + }, + { + "include": "$self" + } + ] + } + ] + }, + "function_decl": { + "patterns": [ + { + "captures": { + "1": { + "name": "entity.name.function.julia" + }, + "2": { + "name": "support.type.julia" + } + }, + "match": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?(?=\\(.*\\)(::[^\\s]+)?(\\s*\\bwhere\\b\\s+.+?)?\\s*?=(?![=>]))", + "comment": "first group is function name\nSecond group is type parameters (e.g. {T<:Number, S})\nThen open parens\nThen a lookahead ensures that we are followed by:\n - anything (function argumnets)\n - 0 or more spaces\n - Finally an equal sign\nNegative lookahead ensures we don't have another equal sign (not `==`)" + }, + { + "captures": { + "1": { + "name": "keyword.other.julia" + }, + "2": { + "name": "keyword.operator.dots.julia" + }, + "3": { + "name": "entity.name.function.julia" + }, + "4": { + "name": "support.type.julia" + } + }, + "match": "\\b(function|macro)(?:\\s+(?:(?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*(\\.))?((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?|\\s*)(?=\\()", + "comment": "similar regex to previous, but with keyword not 1-line syntax" + } + ] + }, + "keyword": { + "patterns": [ + { + "match": "\\b(?|<-|-->|=>)", + "name": "keyword.operator.arrow.julia" + }, + { + "match": "(?::=|\\+=|-=|\\*=|//=|/=|\\.//=|\\./=|\\.\\*=|\\\\=|\\.\\\\=|\\^=|\\.\\^=|%=|\\.%=|÷=|\\.÷=|\\|=|&=|\\.&=|⊻=|\\.⊻=|\\$=|<<=|>>=|>>>=|=(?!=))", + "name": "keyword.operator.update.julia" + }, + { + "match": "(?:<<|>>>|>>|\\.>>>|\\.>>|\\.<<)", + "name": "keyword.operator.shift.julia" + }, + { + "match": "(?:\\s*(::|>:|<:)\\s*((?:(?:Union)?\\([^)]*\\)|[[:alpha:]_$∇][[:word:]⁺-ₜ!′\\.]*(?:(?:{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})|(?:\".+?(?=|\\.>|\\.<=|\\.<|\\.≤|\\.≥|==|\\.!=|\\.=|\\.!|<:|>:|:>|(?)>=|(?|<|≥|≤)", + "name": "keyword.operator.relation.julia" + }, + { + "match": "(?<=\\s)(?:\\?)(?=\\s)", + "name": "keyword.operator.ternary.julia" + }, + { + "match": "(?<=\\s)(?:\\:)(?=\\s)", + "name": "keyword.operator.ternary.julia" + }, + { + "match": "(?:\\|\\||&&|(?)", + "name": "keyword.operator.applies.julia" + }, + { + "match": "(?:\\||\\.\\||\\&|\\.\\&|~|\\.~|⊻|\\.⊻)", + "name": "keyword.operator.bitwise.julia" + }, + { + "match": "(?:\\+\\+|--|\\+|\\.\\+|-|\\.\\-|\\*|\\.\\*|//(?!=)|\\.//(?!=)|/|\\./|%|\\.%|\\\\|\\.\\\\|\\^|\\.\\^|÷|\\.÷|⋅|\\.⋅|∩|\\.∩|∪|\\.∪|×|√|∛)", + "name": "keyword.operator.arithmetic.julia" + }, + { + "match": "(?:∘)", + "name": "keyword.operator.compose.julia" + }, + { + "match": "(?:::|(?<=\\s)isa(?=\\s))", + "name": "keyword.operator.isa.julia" + }, + { + "match": "(?:(?<=\\s)in(?=\\s))", + "name": "keyword.operator.relation.in.julia" + }, + { + "match": "(?:\\.(?=(?:@|_|\\p{L}))|\\.\\.+)", + "name": "keyword.operator.dots.julia" + }, + { + "match": "(?:\\$(?=.+))", + "name": "keyword.operator.interpolation.julia" + }, + { + "captures": { + "2": { + "name": "keyword.operator.transposed-variable.julia" + } + }, + "match": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)(('|(\\.'))*\\.?')" + }, + { + "captures": { + "1": { + "name": "bracket.end.julia" + }, + "2": { + "name": "keyword.operator.transposed-matrix.julia" + } + }, + "match": "(\\])((?:'|(?:\\.'))*\\.?')" + }, + { + "captures": { + "1": { + "name": "bracket.end.julia" + }, + "2": { + "name": "keyword.operator.transposed-parens.julia" + } + }, + "match": "(\\))((?:'|(?:\\.'))*\\.?')" + } + ] + }, + "string": { + "patterns": [ + { + "begin": "(?:(@doc)\\s((?:doc)?\"\"\")|(doc\"\"\"))", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\"\"\") ?(->)?", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.julia" + }, + "2": { + "name": "keyword.operator.arrow.julia" + } + }, + "name": "string.docstring.julia", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(i?cxx)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.cxx.julia", + "contentName": "meta.embedded.inline.cpp", + "patterns": [ + { + "include": "source.cpp#root_context" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "((i?cxxt?)|([rpv]cpp))(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "4": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.cxx.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.cpp", + "patterns": [ + { + "include": "source.cpp#root_context" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(py)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "([\\s\\w]*)(\"\"\")", + "endCaptures": { + "2": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.python.julia", + "contentName": "meta.embedded.inline.python", + "patterns": [ + { + "include": "source.python" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(py)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\\w*)(\")", + "name": "embed.python.julia", + "endCaptures": { + "2": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.python", + "patterns": [ + { + "include": "source.python" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(js)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.js.julia", + "contentName": "meta.embedded.inline.javascript", + "patterns": [ + { + "include": "source.js" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(js)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.js.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.javascript", + "patterns": [ + { + "include": "source.js" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(R)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.R.julia", + "contentName": "meta.embedded.inline.r", + "patterns": [ + { + "include": "source.r" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(R)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.R.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.r", + "patterns": [ + { + "include": "source.r" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(raw)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "name": "string.quoted.other.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + } + }, + { + "begin": "(raw)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "string.quoted.other.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + } + }, + { + "begin": "(sql)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.sql.julia", + "contentName": "meta.embedded.inline.sql", + "patterns": [ + { + "include": "source.sql" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(sql)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.sql.julia", + "contentName": "meta.embedded.inline.sql", + "patterns": [ + { + "include": "source.sql" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "var\"\"\"", + "end": "\"\"\"", + "name": "constant.other.symbol.julia" + }, + { + "begin": "var\"", + "end": "\"", + "name": "constant.other.symbol.julia" + }, + { + "begin": "(md)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.markdown.julia", + "contentName": "meta.embedded.inline.markdown", + "patterns": [ + { + "include": "text.md" + }, + { + "include": "text.html.markdown.julia" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(md)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.markdown.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.markdown", + "patterns": [ + { + "include": "text.md" + }, + { + "include": "text.html.markdown.julia" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "^\\s?(doc)?(\"\"\")\\s?$", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\"\"\")", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "string.docstring.julia", + "comment": "This only matches docstrings that start and end with triple quotes on\ntheir own line in the void", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "'(?!')", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "string.quoted.single.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "(?!:_)(?:struct|mutable\\s+struct|abstract\\s+type|primitive\\s+type)\\s+((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)(\\s*(<:)\\s*(?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*(?:{.*})?)?", + "name": "meta.type.julia" + } + ] + } + } +} \ No newline at end of file diff --git a/extensions/less/package.json b/extensions/less/package.json index 4dea57de..5974be71 100644 --- a/extensions/less/package.json +++ b/extensions/less/package.json @@ -1,42 +1,60 @@ { - "name": "less", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js atom/language-less grammars/less.cson ./syntaxes/less.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "less", - "aliases": ["Less", "less"], - "extensions": [".less"], - "mimetypes": ["text/x-less", "text/less"], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "less", - "scopeName": "source.css.less", - "path": "./syntaxes/less.tmLanguage.json" - }], - "problemMatchers": [ - { - "name": "lessc", - "label": "Lessc compiler", - "owner": "lessc", - "source": "less", - "fileLocation": "absolute", - "pattern": { - "regexp": "(.*)\\sin\\s(.*)\\son line\\s(\\d+),\\scolumn\\s(\\d+)", - "message": 1, - "file": 2, - "line": 3, - "column": 4 - } - } - ] - } -} \ No newline at end of file + "name": "less", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-less grammars/less.cson ./syntaxes/less.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "less", + "aliases": [ + "Less", + "less" + ], + "extensions": [ + ".less" + ], + "mimetypes": [ + "text/x-less", + "text/less" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "less", + "scopeName": "source.css.less", + "path": "./syntaxes/less.tmLanguage.json" + } + ], + "problemMatchers": [ + { + "name": "lessc", + "label": "Lessc compiler", + "owner": "lessc", + "source": "less", + "fileLocation": "absolute", + "pattern": { + "regexp": "(.*)\\sin\\s(.*)\\son line\\s(\\d+),\\scolumn\\s(\\d+)", + "message": 1, + "file": 2, + "line": 3, + "column": 4 + } + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/less/package.nls.json b/extensions/less/package.nls.json index bad671bf..a8836403 100644 --- a/extensions/less/package.nls.json +++ b/extensions/less/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Less Language Basics", "description": "Provides syntax highlighting, bracket matching and folding in Less files." -} \ No newline at end of file +} diff --git a/extensions/less/yarn.lock b/extensions/less/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/less/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/log/cgmanifest.json b/extensions/log/cgmanifest.json index be1411f8..a34da8b5 100644 --- a/extensions/log/cgmanifest.json +++ b/extensions/log/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "vscode-logfile-highlighter", "repositoryUrl": "https://github.com/emilast/vscode-logfile-highlighter", - "commitHash": "6f6eecc097509c6ee8f4141a7bd6a1f243461d68" + "commitHash": "19807c6a80d29b03ad69e02ffe39e5869a9ce107" } }, "license": "MIT", - "version": "2.9.0" + "version": "2.11.0" } ], "version": 1 diff --git a/extensions/log/package.json b/extensions/log/package.json index c32f6320..73093e11 100644 --- a/extensions/log/package.json +++ b/extensions/log/package.json @@ -1,35 +1,39 @@ { - "name": "log", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "*" - }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js emilast/vscode-logfile-highlighter syntaxes/log.tmLanguage ./syntaxes/log.tmLanguage.json" - }, - "contributes": { - "languages": [ - { - "id": "log", - "extensions": [ - ".log", - "*.log.?" - ], - "aliases": [ - "Log" - ] - } - ], - "grammars": [ - { - "language": "log", - "scopeName": "text.log", - "path": "./syntaxes/log.tmLanguage.json" - } - ] - } -} \ No newline at end of file + "name": "log", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin emilast/vscode-logfile-highlighter syntaxes/log.tmLanguage ./syntaxes/log.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "log", + "extensions": [ + ".log", + "*.log.?" + ], + "aliases": [ + "Log" + ] + } + ], + "grammars": [ + { + "language": "log", + "scopeName": "text.log", + "path": "./syntaxes/log.tmLanguage.json" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/log/package.nls.json b/extensions/log/package.nls.json index 91c5e93a..a7f28b19 100644 --- a/extensions/log/package.nls.json +++ b/extensions/log/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Log", "description": "Provides syntax highlighting for files with .log extension." -} \ No newline at end of file +} diff --git a/extensions/log/syntaxes/log.tmLanguage.json b/extensions/log/syntaxes/log.tmLanguage.json index 13065638..1af8a49c 100644 --- a/extensions/log/syntaxes/log.tmLanguage.json +++ b/extensions/log/syntaxes/log.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/emilast/vscode-logfile-highlighter/commit/6f6eecc097509c6ee8f4141a7bd6a1f243461d68", + "version": "https://github.com/emilast/vscode-logfile-highlighter/commit/19807c6a80d29b03ad69e02ffe39e5869a9ce107", "name": "Log file", "scopeName": "text.log", "patterns": [ @@ -85,11 +85,11 @@ "name": "constant.language" }, { - "match": "[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}", + "match": "\\b[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}\\b", "name": "constant.language log.constant" }, { - "match": "([0-9a-fA-F]+[:-])+[0-9a-fA-F]+", + "match": "\\b([0-9a-fA-F]{2,}[:-])+[0-9a-fA-F]{2,}+\\b", "name": "constant.language log.constant" }, { diff --git a/extensions/log/yarn.lock b/extensions/log/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/log/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/lua/package.json b/extensions/lua/package.json index eda00f05..8161da9f 100644 --- a/extensions/lua/package.json +++ b/extensions/lua/package.json @@ -1,25 +1,40 @@ { - "name": "lua", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { "vscode": "*" }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js textmate/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" - }, - "contributes": { - "languages": [{ - "id": "lua", - "extensions": [ ".lua" ], - "aliases": [ "Lua", "lua" ], - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "lua", - "scopeName": "source.lua", - "path": "./syntaxes/lua.tmLanguage.json" - }] - } -} \ No newline at end of file + "name": "lua", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "lua", + "extensions": [ + ".lua" + ], + "aliases": [ + "Lua", + "lua" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "lua", + "scopeName": "source.lua", + "path": "./syntaxes/lua.tmLanguage.json" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/lua/package.nls.json b/extensions/lua/package.nls.json index 9a0e601f..9d11bc08 100644 --- a/extensions/lua/package.nls.json +++ b/extensions/lua/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Lua Language Basics", "description": "Provides syntax highlighting and bracket matching in Lua files." -} \ No newline at end of file +} diff --git a/extensions/lua/yarn.lock b/extensions/lua/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/lua/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/make/package.json b/extensions/make/package.json index c5279e4c..ef8209df 100644 --- a/extensions/make/package.json +++ b/extensions/make/package.json @@ -1,51 +1,55 @@ { - "name": "make", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "*" - }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js fadeevab/make.tmbundle Syntaxes/Makefile.plist ./syntaxes/make.tmLanguage.json" - }, - "contributes": { - "languages": [ - { - "id": "makefile", - "aliases": [ - "Makefile", - "makefile" - ], - "extensions": [ - ".mk" - ], - "filenames": [ - "Makefile", - "makefile", - "GNUmakefile", - "OCamlMakefile" - ], - "firstLine": "^#!\\s*/usr/bin/make", - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "makefile", - "scopeName": "source.makefile", - "path": "./syntaxes/make.tmLanguage.json", - "tokenTypes": { - "string.interpolated": "other" - } - } - ], - "configurationDefaults": { - "[makefile]": { - "editor.insertSpaces": false - } - } - } -} \ No newline at end of file + "name": "make", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin fadeevab/make.tmbundle Syntaxes/Makefile.plist ./syntaxes/make.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "makefile", + "aliases": [ + "Makefile", + "makefile" + ], + "extensions": [ + ".mk" + ], + "filenames": [ + "Makefile", + "makefile", + "GNUmakefile", + "OCamlMakefile" + ], + "firstLine": "^#!\\s*/usr/bin/make", + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "makefile", + "scopeName": "source.makefile", + "path": "./syntaxes/make.tmLanguage.json", + "tokenTypes": { + "string.interpolated": "other" + } + } + ], + "configurationDefaults": { + "[makefile]": { + "editor.insertSpaces": false + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/make/package.nls.json b/extensions/make/package.nls.json index 5aeb89f2..77c14cb9 100644 --- a/extensions/make/package.nls.json +++ b/extensions/make/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Make Language Basics", "description": "Provides syntax highlighting and bracket matching in Make files." -} \ No newline at end of file +} diff --git a/extensions/make/yarn.lock b/extensions/make/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/make/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/markdown-basics/package.json b/extensions/markdown-basics/package.json index bbc5e342..e4026533 100644 --- a/extensions/markdown-basics/package.json +++ b/extensions/markdown-basics/package.json @@ -1,95 +1,99 @@ { - "name": "markdown", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "engines": { - "vscode": "^1.20.0" - }, - "contributes": { - "languages": [ - { - "id": "markdown", - "aliases": [ - "Markdown", - "markdown" - ], - "extensions": [ - ".md", - ".mkd", - ".mdwn", - ".mdown", - ".markdown", - ".markdn", - ".mdtxt", - ".mdtext", - ".workbook" - ], - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "markdown", - "scopeName": "text.html.markdown", - "path": "./syntaxes/markdown.tmLanguage.json", - "embeddedLanguages": { - "meta.embedded.block.html": "html", - "source.js": "javascript", - "source.css": "css", - "meta.embedded.block.frontmatter": "yaml", - "meta.embedded.block.css": "css", - "meta.embedded.block.ini": "ini", - "meta.embedded.block.java": "java", - "meta.embedded.block.lua": "lua", - "meta.embedded.block.makefile": "makefile", - "meta.embedded.block.perl": "perl", - "meta.embedded.block.r": "r", - "meta.embedded.block.ruby": "ruby", - "meta.embedded.block.php": "php", - "meta.embedded.block.sql": "sql", - "meta.embedded.block.vs_net": "vs_net", - "meta.embedded.block.xml": "xml", - "meta.embedded.block.xsl": "xsl", - "meta.embedded.block.yaml": "yaml", - "meta.embedded.block.dosbatch": "dosbatch", - "meta.embedded.block.clojure": "clojure", - "meta.embedded.block.coffee": "coffee", - "meta.embedded.block.c": "c", - "meta.embedded.block.cpp": "cpp", - "meta.embedded.block.diff": "diff", - "meta.embedded.block.dockerfile": "dockerfile", - "meta.embedded.block.go": "go", - "meta.embedded.block.groovy": "groovy", - "meta.embedded.block.pug": "jade", - "meta.embedded.block.javascript": "javascript", - "meta.embedded.block.json": "json", - "meta.embedded.block.less": "less", - "meta.embedded.block.objc": "objc", - "meta.embedded.block.scss": "scss", - "meta.embedded.block.perl6": "perl6", - "meta.embedded.block.powershell": "powershell", - "meta.embedded.block.python": "python", - "meta.embedded.block.rust": "rust", - "meta.embedded.block.scala": "scala", - "meta.embedded.block.shellscript": "shellscript", - "meta.embedded.block.typescript": "typescript", - "meta.embedded.block.typescriptreact": "typescriptreact", - "meta.embedded.block.csharp": "csharp", - "meta.embedded.block.fsharp": "fsharp" - } - } - ], - "snippets": [ - { - "language": "markdown", - "path": "./snippets/markdown.code-snippets" - } - ] - }, - "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js microsoft/vscode-markdown-tm-grammar syntaxes/markdown.tmLanguage ./syntaxes/markdown.tmLanguage.json" - } + "name": "markdown", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "^1.20.0" + }, + "contributes": { + "languages": [ + { + "id": "markdown", + "aliases": [ + "Markdown", + "markdown" + ], + "extensions": [ + ".md", + ".mkd", + ".mdwn", + ".mdown", + ".markdown", + ".markdn", + ".mdtxt", + ".mdtext", + ".workbook" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "markdown", + "scopeName": "text.html.markdown", + "path": "./syntaxes/markdown.tmLanguage.json", + "embeddedLanguages": { + "meta.embedded.block.html": "html", + "source.js": "javascript", + "source.css": "css", + "meta.embedded.block.frontmatter": "yaml", + "meta.embedded.block.css": "css", + "meta.embedded.block.ini": "ini", + "meta.embedded.block.java": "java", + "meta.embedded.block.lua": "lua", + "meta.embedded.block.makefile": "makefile", + "meta.embedded.block.perl": "perl", + "meta.embedded.block.r": "r", + "meta.embedded.block.ruby": "ruby", + "meta.embedded.block.php": "php", + "meta.embedded.block.sql": "sql", + "meta.embedded.block.vs_net": "vs_net", + "meta.embedded.block.xml": "xml", + "meta.embedded.block.xsl": "xsl", + "meta.embedded.block.yaml": "yaml", + "meta.embedded.block.dosbatch": "dosbatch", + "meta.embedded.block.clojure": "clojure", + "meta.embedded.block.coffee": "coffee", + "meta.embedded.block.c": "c", + "meta.embedded.block.cpp": "cpp", + "meta.embedded.block.diff": "diff", + "meta.embedded.block.dockerfile": "dockerfile", + "meta.embedded.block.go": "go", + "meta.embedded.block.groovy": "groovy", + "meta.embedded.block.pug": "jade", + "meta.embedded.block.javascript": "javascript", + "meta.embedded.block.json": "json", + "meta.embedded.block.less": "less", + "meta.embedded.block.objc": "objc", + "meta.embedded.block.scss": "scss", + "meta.embedded.block.perl6": "perl6", + "meta.embedded.block.powershell": "powershell", + "meta.embedded.block.python": "python", + "meta.embedded.block.rust": "rust", + "meta.embedded.block.scala": "scala", + "meta.embedded.block.shellscript": "shellscript", + "meta.embedded.block.typescript": "typescript", + "meta.embedded.block.typescriptreact": "typescriptreact", + "meta.embedded.block.csharp": "csharp", + "meta.embedded.block.fsharp": "fsharp" + } + } + ], + "snippets": [ + { + "language": "markdown", + "path": "./snippets/markdown.code-snippets" + } + ] + }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin microsoft/vscode-markdown-tm-grammar syntaxes/markdown.tmLanguage ./syntaxes/markdown.tmLanguage.json" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/markdown-basics/yarn.lock b/extensions/markdown-basics/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/extensions/markdown-basics/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/extensions/markdown-language-features/notebook-out/index.js b/extensions/markdown-language-features/notebook-out/index.js new file mode 100644 index 00000000..66df08f4 --- /dev/null +++ b/extensions/markdown-language-features/notebook-out/index.js @@ -0,0 +1 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,r),s.l=!0,s.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)r.d(n,s,function(t){return e[t]}.bind(null,s));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=9)}([function(e,t,r){"use strict";var n=Object.prototype.hasOwnProperty;function s(e,t){return n.call(e,t)}function o(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function i(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}var a=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,u=new RegExp(a.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),c=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=r(3);var p=/[&<>"]/,h=/[&<>"]/g,f={"&":"&","<":"<",">":">",'"':"""};function d(e){return f[e]}var m=/[.?*+^$[\]\\(){}|-]/g;var g=r(4);t.lib={},t.lib.mdurl=r(5),t.lib.ucmicro=r(17),t.assign=function(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(r){e[r]=t[r]}))}})),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=s,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(a,"$1")},t.unescapeAll=function(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(u,(function(e,t,r){return t||function(e,t){var r=0;return s(l,t)?l[t]:35===t.charCodeAt(0)&&c.test(t)&&o(r="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?i(r):e}(e,r)}))},t.isValidEntityCode=o,t.fromCodePoint=i,t.escapeHtml=function(e){return p.test(e)?e.replace(h,d):e},t.arrayReplaceAt=function(e,t,r){return[].concat(e.slice(0,t),r,e.slice(t+1))},t.isSpace=function(e){switch(e){case 9:case 32:return!0}return!1},t.isWhiteSpace=function(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},t.isMdAsciiPunct=function(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},t.isPunctChar=function(e){return g.test(e)},t.escapeRE=function(e){return e.replace(m,"\\$&")},t.normalizeReference=function(e){return e=e.trim().replace(/\s+/g," "),"Ṿ"==="ẞ".toLowerCase()&&(e=e.replace(/ẞ/g,"ß")),e.toLowerCase().toUpperCase()}},function(e,t,r){"use strict";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(e){for(var t=0;t=0&&(r=this.attrs[t][1]),r},n.prototype.attrJoin=function(e,t){var r=this.attrIndex(e);r<0?this.attrPush([e,t]):this.attrs[r][1]=this.attrs[r][1]+" "+t},e.exports=n},function(e,t,r){"use strict";e.exports=r(12)},function(e,t){e.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E49\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(e,t,r){"use strict";e.exports.encode=r(13),e.exports.decode=r(14),e.exports.format=r(15),e.exports.parse=r(16)},function(e,t,r){"use strict";var n="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",s="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",o=new RegExp("^(?:"+n+"|"+s+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?][\\s\\S]*?[?]>|]*>|)"),i=new RegExp("^(?:"+n+"|"+s+")");e.exports.HTML_TAG_RE=o,e.exports.HTML_OPEN_CLOSE_TAG_RE=i},function(e,t,r){"use strict";function n(e,t){var r,n,s,o,i,a=[],u=t.length;for(r=0;r=0;r--)95!==(n=t[r]).marker&&42!==n.marker||-1!==n.end&&(s=t[n.end],a=r>0&&t[r-1].end===n.end+1&&t[r-1].token===n.token-1&&t[n.end+1].token===s.token+1&&t[r-1].marker===n.marker,i=String.fromCharCode(n.marker),(o=e.tokens[n.token]).type=a?"strong_open":"em_open",o.tag=a?"strong":"em",o.nesting=1,o.markup=a?i+i:i,o.content="",(o=e.tokens[s.token]).type=a?"strong_close":"em_close",o.tag=a?"strong":"em",o.nesting=-1,o.markup=a?i+i:i,o.content="",a&&(e.tokens[t[r-1].token].content="",e.tokens[t[n.end+1].token].content="",r--))}e.exports.tokenize=function(e,t){var r,n,s=e.pos,o=e.src.charCodeAt(s);if(t)return!1;if(95!==o&&42!==o)return!1;for(n=e.scanDelims(e.pos,42===o),r=0;r{t(e)};acquireNotebookRendererApi("notebookCoreTestRenderer").onDidCreateMarkdown(({element:t,content:r})=>{const n=e.render(r);t.innerHTML=n})}()},function(e,t,r){"use strict";e.exports=r(11)},function(e,t,r){"use strict";var n=r(0),s=r(22),o=r(26),i=r(27),a=r(35),u=r(49),c=r(62),l=r(5),p=r(68),h={default:r(71),zero:r(72),commonmark:r(73)},f=/^(vbscript|javascript|file|data):/,d=/^data:image\/(gif|png|jpeg|webp);/;function m(e){var t=e.trim().toLowerCase();return!f.test(t)||!!d.test(t)}var g=["http:","https:","mailto:"];function _(e){var t=l.parse(e,!0);if(t.hostname&&(!t.protocol||g.indexOf(t.protocol)>=0))try{t.hostname=p.toASCII(t.hostname)}catch(e){}return l.encode(l.format(t))}function b(e){var t=l.parse(e,!0);if(t.hostname&&(!t.protocol||g.indexOf(t.protocol)>=0))try{t.hostname=p.toUnicode(t.hostname)}catch(e){}return l.decode(l.format(t),l.decode.defaultChars+"%")}function k(e,t){if(!(this instanceof k))return new k(e,t);t||n.isString(e)||(t=e||{},e="default"),this.inline=new u,this.block=new a,this.core=new i,this.renderer=new o,this.linkify=new c,this.validateLink=m,this.normalizeLink=_,this.normalizeLinkText=b,this.utils=n,this.helpers=n.assign({},s),this.options={},this.configure(e),t&&this.set(t)}k.prototype.set=function(e){return n.assign(this.options,e),this},k.prototype.configure=function(e){var t,r=this;if(n.isString(e)&&!(e=h[t=e]))throw new Error('Wrong `markdown-it` preset "'+t+'", check name');if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&r.set(e.options),e.components&&Object.keys(e.components).forEach((function(t){e.components[t].rules&&r[t].ruler.enableOnly(e.components[t].rules),e.components[t].rules2&&r[t].ruler2.enableOnly(e.components[t].rules2)})),this},k.prototype.enable=function(e,t){var r=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){r=r.concat(this[t].ruler.enable(e,!0))}),this),r=r.concat(this.inline.ruler2.enable(e,!0));var n=e.filter((function(e){return r.indexOf(e)<0}));if(n.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},k.prototype.disable=function(e,t){var r=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){r=r.concat(this[t].ruler.disable(e,!0))}),this),r=r.concat(this.inline.ruler2.disable(e,!0));var n=e.filter((function(e){return r.indexOf(e)<0}));if(n.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},k.prototype.use=function(e){var t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this},k.prototype.parse=function(e,t){if("string"!=typeof e)throw new Error("Input data should be a String");var r=new this.core.State(e,this,t);return this.core.process(r),r.tokens},k.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},k.prototype.parseInline=function(e,t){var r=new this.core.State(e,this,t);return r.inlineMode=!0,this.core.process(r),r.tokens},k.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)},e.exports=k},function(e){e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(e,t,r){"use strict";var n={};function s(e,t,r){var o,i,a,u,c,l="";for("string"!=typeof t&&(r=t,t=s.defaultChars),void 0===r&&(r=!0),c=function(e){var t,r,s=n[e];if(s)return s;for(s=n[e]=[],t=0;t<128;t++)r=String.fromCharCode(t),/^[0-9a-z]$/i.test(r)?s.push(r):s.push("%"+("0"+t.toString(16).toUpperCase()).slice(-2));for(t=0;t=55296&&a<=57343){if(a>=55296&&a<=56319&&o+1=56320&&u<=57343){l+=encodeURIComponent(e[o]+e[o+1]),o++;continue}l+="%EF%BF%BD"}else l+=encodeURIComponent(e[o]);return l}s.defaultChars=";/?:@&=+$,-_.!~*'()#",s.componentChars="-_.!~*'()",e.exports=s},function(e,t,r){"use strict";var n={};function s(e,t){var r;return"string"!=typeof t&&(t=s.defaultChars),r=function(e){var t,r,s=n[e];if(s)return s;for(s=n[e]=[],t=0;t<128;t++)r=String.fromCharCode(t),s.push(r);for(t=0;t=55296&&u<=57343?"���":String.fromCharCode(u),t+=6):240==(248&s)&&t+91114111?c+="����":(u-=65536,c+=String.fromCharCode(55296+(u>>10),56320+(1023&u))),t+=9):c+="�";return c}))}s.defaultChars=";/?:@&=+$,#",s.componentChars="",e.exports=s},function(e,t,r){"use strict";e.exports=function(e){var t="";return t+=e.protocol||"",t+=e.slashes?"//":"",t+=e.auth?e.auth+"@":"",e.hostname&&-1!==e.hostname.indexOf(":")?t+="["+e.hostname+"]":t+=e.hostname||"",t+=e.port?":"+e.port:"",t+=e.pathname||"",t+=e.search||"",t+=e.hash||""}},function(e,t,r){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var s=/^([a-z0-9.+-]+:)/i,o=/:[0-9]*$/,i=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,a=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),u=["'"].concat(a),c=["%","/","?",";","#"].concat(u),l=["/","?","#"],p=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,f={javascript:!0,"javascript:":!0},d={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(e,t){var r,n,o,a,u,m=e;if(m=m.trim(),!t&&1===e.split("#").length){var g=i.exec(m);if(g)return this.pathname=g[1],g[2]&&(this.search=g[2]),this}var _=s.exec(m);if(_&&(o=(_=_[0]).toLowerCase(),this.protocol=_,m=m.substr(_.length)),(t||_||m.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(u="//"===m.substr(0,2))||_&&f[_]||(m=m.substr(2),this.slashes=!0)),!f[_]&&(u||_&&!d[_])){var b,k,C=-1;for(r=0;r127?x+="x":x+=y[F];if(!x.match(p)){var w=A.slice(0,r),q=A.slice(r+1),S=y.match(h);S&&(w.push(S[1]),q.unshift(S[2])),q.length&&(m=q.join(".")+m),this.hostname=w.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var L=m.indexOf("#");-1!==L&&(this.hash=m.substr(L),m=m.slice(0,L));var z=m.indexOf("?");return-1!==z&&(this.search=m.substr(z),m=m.slice(0,z)),m&&(this.pathname=m),d[o]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(e){var t=o.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)},e.exports=function(e,t){if(e&&e instanceof n)return e;var r=new n;return r.parse(e,t),r}},function(e,t,r){"use strict";t.Any=r(18),t.Cc=r(19),t.Cf=r(20),t.P=r(4),t.Z=r(21)},function(e,t){e.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(e,t){e.exports=/[\0-\x1F\x7F-\x9F]/},function(e,t){e.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(e,t){e.exports=/[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/},function(e,t,r){"use strict";t.parseLinkLabel=r(23),t.parseLinkDestination=r(24),t.parseLinkTitle=r(25)},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,s,o,i,a=-1,u=e.posMax,c=e.pos;for(e.pos=t+1,n=1;e.pos32)return a;if(41===s){if(0===o)break;o--}t++}return i===t||0!==o||(a.str=n(e.slice(i,t)),a.lines=0,a.pos=t,a.ok=!0),a}},function(e,t,r){"use strict";var n=r(0).unescapeAll;e.exports=function(e,t,r){var s,o,i=0,a=t,u={ok:!1,pos:0,lines:0,str:""};if(t>=r)return u;if(34!==(o=e.charCodeAt(t))&&39!==o&&40!==o)return u;for(t++,40===o&&(o=41);t"+o(e[t].content)+""},i.code_block=function(e,t,r,n,s){var i=e[t];return""+o(e[t].content)+"\n"},i.fence=function(e,t,r,n,i){var a,u,c,l,p,h=e[t],f=h.info?s(h.info).trim():"",d="",m="";return f&&(d=(c=f.split(/(\s+)/g))[0],m=c.slice(2).join("")),0===(a=r.highlight&&r.highlight(h.content,d,m)||o(h.content)).indexOf(""+a+"\n"):"
"+a+"
\n"},i.image=function(e,t,r,n,s){var o=e[t];return o.attrs[o.attrIndex("alt")][1]=s.renderInlineAsText(o.children,r,n),s.renderToken(e,t,r)},i.hardbreak=function(e,t,r){return r.xhtmlOut?"
\n":"
\n"},i.softbreak=function(e,t,r){return r.breaks?r.xhtmlOut?"
\n":"
\n":"\n"},i.text=function(e,t){return o(e[t].content)},i.html_block=function(e,t){return e[t].content},i.html_inline=function(e,t){return e[t].content},a.prototype.renderAttrs=function(e){var t,r,n;if(!e.attrs)return"";for(n="",t=0,r=e.attrs.length;t\n":">")},a.prototype.renderInline=function(e,t,r){for(var n,s="",o=this.rules,i=0,a=e.length;i/i.test(e)}e.exports=function(e){var t,r,o,i,a,u,c,l,p,h,f,d,m,g,_,b,k,C,v=e.tokens;if(e.md.options.linkify)for(r=0,o=v.length;r=0;t--)if("link_close"!==(u=i[t]).type){if("html_inline"===u.type&&(C=u.content,/^\s]/i.test(C)&&m>0&&m--,s(u.content)&&m++),!(m>0)&&"text"===u.type&&e.md.linkify.test(u.content)){for(p=u.content,k=e.md.linkify.match(p),c=[],d=u.level,f=0,l=0;lf&&((a=new e.Token("text","",0)).content=p.slice(f,h),a.level=d,c.push(a)),(a=new e.Token("link_open","a",1)).attrs=[["href",_]],a.level=d++,a.markup="linkify",a.info="auto",c.push(a),(a=new e.Token("text","",0)).content=b,a.level=d,c.push(a),(a=new e.Token("link_close","a",-1)).level=--d,a.markup="linkify",a.info="auto",c.push(a),f=k[l].lastIndex);f=0;t--)"text"!==(r=e[t]).type||n||(r.content=r.content.replace(o,a)),"link_open"===r.type&&"auto"===r.info&&n--,"link_close"===r.type&&"auto"===r.info&&n++}function c(e){var t,r,s=0;for(t=e.length-1;t>=0;t--)"text"!==(r=e[t]).type||s||n.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/gm,"$1—").replace(/(^|\s)--(?=\s|$)/gm,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/gm,"$1–")),"link_open"===r.type&&"auto"===r.info&&s--,"link_close"===r.type&&"auto"===r.info&&s++}e.exports=function(e){var t;if(e.md.options.typographer)for(t=e.tokens.length-1;t>=0;t--)"inline"===e.tokens[t].type&&(s.test(e.tokens[t].content)&&u(e.tokens[t].children),n.test(e.tokens[t].content)&&c(e.tokens[t].children))}},function(e,t,r){"use strict";var n=r(0).isWhiteSpace,s=r(0).isPunctChar,o=r(0).isMdAsciiPunct,i=/['"]/,a=/['"]/g;function u(e,t,r){return e.substr(0,t)+r+e.substr(t+1)}function c(e,t){var r,i,c,l,p,h,f,d,m,g,_,b,k,C,v,D,A,y,x,F,E;for(x=[],r=0;r=0&&!(x[A].level<=f);A--);if(x.length=A+1,"text"===i.type){p=0,h=(c=i.content).length;e:for(;p=0)m=c.charCodeAt(l.index-1);else for(A=r-1;A>=0&&("softbreak"!==e[A].type&&"hardbreak"!==e[A].type);A--)if(e[A].content){m=e[A].content.charCodeAt(e[A].content.length-1);break}if(g=32,p=48&&m<=57&&(D=v=!1),v&&D&&(v=_,D=b),v||D){if(D)for(A=x.length-1;A>=0&&(d=x[A],!(x[A].level=0;t--)"inline"===e.tokens[t].type&&i.test(e.tokens[t].content)&&c(e.tokens[t].children,e)}},function(e,t,r){"use strict";var n=r(2);function s(e,t,r){this.src=e,this.env=r,this.tokens=[],this.inlineMode=!1,this.md=t}s.prototype.Token=n,e.exports=s},function(e,t,r){"use strict";var n=r(1),s=[["table",r(36),["paragraph","reference"]],["code",r(37)],["fence",r(38),["paragraph","reference","blockquote","list"]],["blockquote",r(39),["paragraph","reference","blockquote","list"]],["hr",r(40),["paragraph","reference","blockquote","list"]],["list",r(41),["paragraph","reference","blockquote"]],["reference",r(42)],["heading",r(43),["paragraph","reference","blockquote"]],["lheading",r(44)],["html_block",r(45),["paragraph","reference","blockquote"]],["paragraph",r(47)]];function o(){this.ruler=new n;for(var e=0;e=r))&&!(e.sCount[i]=u){e.line=r;break}for(n=0;nr)return!1;if(h=t+1,e.sCount[h]=4)return!1;if((c=e.bMarks[h]+e.tShift[h])>=e.eMarks[h])return!1;if(124!==(a=e.src.charCodeAt(c++))&&45!==a&&58!==a)return!1;for(;c=4)return!1;if((f=o(u)).length&&""===f[0]&&f.shift(),f.length&&""===f[f.length-1]&&f.pop(),0===(d=f.length)||d!==g.length)return!1;if(i)return!0;for(C=e.parentType,e.parentType="table",D=e.md.block.ruler.getRules("blockquote"),(m=e.push("table_open","table",1)).map=b=[t,0],(m=e.push("thead_open","thead",1)).map=[t,t+1],(m=e.push("tr_open","tr",1)).map=[t,t+1],l=0;l=4)break;for((f=o(u)).length&&""===f[0]&&f.shift(),f.length&&""===f[f.length-1]&&f.pop(),h===t+2&&((m=e.push("tbody_open","tbody",1)).map=k=[t+2,0]),(m=e.push("tr_open","tr",1)).map=[h,h+1],l=0;l=4))break;s=++n}return e.line=s,(o=e.push("code_block","code",0)).content=e.getLines(t,s,4+e.blkIndent,!0),o.map=[t,e.line],!0}},function(e,t,r){"use strict";e.exports=function(e,t,r,n){var s,o,i,a,u,c,l,p=!1,h=e.bMarks[t]+e.tShift[t],f=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(s=e.src.charCodeAt(h))&&96!==s)return!1;if(u=h,(o=(h=e.skipChars(h,s))-u)<3)return!1;if(l=e.src.slice(u,h),i=e.src.slice(h,f),96===s&&i.indexOf(String.fromCharCode(s))>=0)return!1;if(n)return!0;for(a=t;!(++a>=r)&&!((h=u=e.bMarks[a]+e.tShift[a])<(f=e.eMarks[a])&&e.sCount[a]=4||(h=e.skipChars(h,s))-u=4)return!1;if(62!==e.src.charCodeAt(F++))return!1;if(s)return!0;for(u=f=e.sCount[t]+1,32===e.src.charCodeAt(F)?(F++,u++,f++,o=!1,C=!0):9===e.src.charCodeAt(F)?(C=!0,(e.bsCount[t]+f)%4==3?(F++,u++,f++,o=!1):o=!0):C=!1,d=[e.bMarks[t]],e.bMarks[t]=F;F=E,b=[e.sCount[t]],e.sCount[t]=f-u,k=[e.tShift[t]],e.tShift[t]=F-e.bMarks[t],D=e.md.block.ruler.getRules("blockquote"),_=e.parentType,e.parentType="blockquote",h=t+1;h=(E=e.eMarks[h])));h++)if(62!==e.src.charCodeAt(F++)||y){if(l)break;for(v=!1,a=0,c=D.length;a=E,m.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(C?1:0),b.push(e.sCount[h]),e.sCount[h]=f-u,k.push(e.tShift[h]),e.tShift[h]=F-e.bMarks[h]}for(g=e.blkIndent,e.blkIndent=0,(A=e.push("blockquote_open","blockquote",1)).markup=">",A.map=p=[t,0],e.md.block.tokenize(e,t,h),(A=e.push("blockquote_close","blockquote",-1)).markup=">",e.lineMax=x,e.parentType=_,p[1]=e.line,a=0;a=4)return!1;if(42!==(o=e.src.charCodeAt(c++))&&45!==o&&95!==o)return!1;for(i=1;c=i)return-1;if((r=e.src.charCodeAt(o++))<48||r>57)return-1;for(;;){if(o>=i)return-1;if(!((r=e.src.charCodeAt(o++))>=48&&r<=57)){if(41===r||46===r)break;return-1}if(o-s>=10)return-1}return o=4)return!1;if(e.listIndent>=0&&e.sCount[t]-e.listIndent>=4&&e.sCount[t]=e.blkIndent&&(B=!0),(w=o(e,t))>=0){if(h=!0,S=e.bMarks[t]+e.tShift[t],b=Number(e.src.substr(S,w-S-1)),B&&1!==b)return!1}else{if(!((w=s(e,t))>=0))return!1;h=!1}if(B&&e.skipSpaces(w)>=e.eMarks[t])return!1;if(_=e.src.charCodeAt(w-1),n)return!0;for(g=e.tokens.length,h?(T=e.push("ordered_list_open","ol",1),1!==b&&(T.attrs=[["start",b]])):T=e.push("bullet_list_open","ul",1),T.map=m=[t,0],T.markup=String.fromCharCode(_),C=t,q=!1,z=e.md.block.ruler.getRules("list"),A=e.parentType,e.parentType="list";C=k?1:v-p)>4&&(l=1),c=p+l,(T=e.push("list_item_open","li",1)).markup=String.fromCharCode(_),T.map=f=[t,0],F=e.tight,x=e.tShift[t],y=e.sCount[t],D=e.listIndent,e.listIndent=e.blkIndent,e.blkIndent=c,e.tight=!0,e.tShift[t]=a-e.bMarks[t],e.sCount[t]=v,a>=k&&e.isEmpty(t+1)?e.line=Math.min(e.line+2,r):e.md.block.tokenize(e,t,r,!0),e.tight&&!q||(I=!1),q=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=D,e.tShift[t]=x,e.sCount[t]=y,e.tight=F,(T=e.push("list_item_close","li",-1)).markup=String.fromCharCode(_),C=t=e.line,f[1]=C,a=e.bMarks[t],C>=r)break;if(e.sCount[C]=4)break;for(L=!1,u=0,d=z.length;u=4)return!1;if(91!==e.src.charCodeAt(A))return!1;for(;++A3||e.sCount[x]<0)){for(k=!1,p=0,h=C.length;p=4)return!1;if(35!==(o=e.src.charCodeAt(c))||c>=l)return!1;for(i=1,o=e.src.charCodeAt(++c);35===o&&c6||cc&&n(e.src.charCodeAt(a-1))&&(l=a),e.line=t+1,(u=e.push("heading_open","h"+String(i),1)).markup="########".slice(0,i),u.map=[t,e.line],(u=e.push("inline","",0)).content=e.src.slice(c,l).trim(),u.map=[t,e.line],u.children=[],(u=e.push("heading_close","h"+String(i),-1)).markup="########".slice(0,i)),!0)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,s,o,i,a,u,c,l,p,h,f=t+1,d=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;for(h=e.parentType,e.parentType="paragraph";f3)){if(e.sCount[f]>=e.blkIndent&&(u=e.bMarks[f]+e.tShift[f])<(c=e.eMarks[f])&&(45===(p=e.src.charCodeAt(u))||61===p)&&(u=e.skipChars(u,p),(u=e.skipSpaces(u))>=c)){l=61===p?1:2;break}if(!(e.sCount[f]<0)){for(s=!1,o=0,i=d.length;o|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(s.source+"\\s*$"),/^$/,!1]];e.exports=function(e,t,r,n){var s,i,a,u,c=e.bMarks[t]+e.tShift[t],l=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(c))return!1;for(u=e.src.slice(c,l),s=0;s3||e.sCount[u]<0)){for(n=!1,s=0,o=c.length;s0&&this.level++,this.tokens.push(s),s},o.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},o.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;et;)if(!s(this.src.charCodeAt(--e)))return e+1;return e},o.prototype.skipChars=function(e,t){for(var r=this.src.length;er;)if(t!==this.src.charCodeAt(--e))return e+1;return e},o.prototype.getLines=function(e,t,r,n){var o,i,a,u,c,l,p,h=e;if(e>=t)return"";for(l=new Array(t-e),o=0;hr?new Array(i-r+1).join(" ")+this.src.slice(u,c):this.src.slice(u,c)}return l.join("")},o.prototype.Token=n,e.exports=o},function(e,t,r){"use strict";var n=r(1),s=[["text",r(50)],["newline",r(51)],["escape",r(52)],["backticks",r(53)],["strikethrough",r(7).tokenize],["emphasis",r(8).tokenize],["link",r(54)],["image",r(55)],["autolink",r(56)],["html_inline",r(57)],["entity",r(58)]],o=[["balance_pairs",r(59)],["strikethrough",r(7).postProcess],["emphasis",r(8).postProcess],["text_collapse",r(60)]];function i(){var e;for(this.ruler=new n,e=0;e=o)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},i.prototype.parse=function(e,t,r,n){var s,o,i,a=new this.State(e,t,r,n);for(this.tokenize(a),i=(o=this.ruler2.getRules("")).length,s=0;s=0&&32===e.pending.charCodeAt(r)?r>=1&&32===e.pending.charCodeAt(r-1)?(e.pending=e.pending.replace(/ +$/,""),e.push("hardbreak","br",0)):(e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0)):e.push("softbreak","br",0)),o++;o?@[]^_`{|}~-".split("").forEach((function(e){s[e.charCodeAt(0)]=1})),e.exports=function(e,t){var r,o=e.pos,i=e.posMax;if(92!==e.src.charCodeAt(o))return!1;if(++o=m)return!1;if(g=c,(l=e.md.helpers.parseLinkDestination(e.src,c,e.posMax)).ok){for(h=e.md.normalizeLink(l.str),e.md.validateLink(h)?c=l.pos:h="",g=c;c=m||41!==e.src.charCodeAt(c))&&(_=!0),c++}if(_){if(void 0===e.env.references)return!1;if(c=0?i=e.src.slice(g,c++):c=a+1):c=a+1,i||(i=e.src.slice(u,a)),!(p=e.env.references[n(i)]))return e.pos=d,!1;h=p.href,f=p.title}return t||(e.pos=u,e.posMax=a,e.push("link_open","a",1).attrs=r=[["href",h]],f&&r.push(["title",f]),e.md.inline.tokenize(e),e.push("link_close","a",-1)),e.pos=c,e.posMax=m,!0}},function(e,t,r){"use strict";var n=r(0).normalizeReference,s=r(0).isSpace;e.exports=function(e,t){var r,o,i,a,u,c,l,p,h,f,d,m,g,_="",b=e.pos,k=e.posMax;if(33!==e.src.charCodeAt(e.pos))return!1;if(91!==e.src.charCodeAt(e.pos+1))return!1;if(c=e.pos+2,(u=e.md.helpers.parseLinkLabel(e,e.pos+1,!1))<0)return!1;if((l=u+1)=k)return!1;for(g=l,(h=e.md.helpers.parseLinkDestination(e.src,l,e.posMax)).ok&&(_=e.md.normalizeLink(h.str),e.md.validateLink(_)?l=h.pos:_=""),g=l;l=k||41!==e.src.charCodeAt(l))return e.pos=b,!1;l++}else{if(void 0===e.env.references)return!1;if(l=0?a=e.src.slice(g,l++):l=u+1):l=u+1,a||(a=e.src.slice(c,u)),!(p=e.env.references[n(a)]))return e.pos=b,!1;_=p.href,f=p.title}return t||(i=e.src.slice(c,u),e.md.inline.parse(i,e.md,e.env,m=[]),(d=e.push("image","img",0)).attrs=r=[["src",_],["alt",""]],d.children=m,d.content=i,f&&r.push(["title",f])),e.pos=l,e.posMax=k,!0}},function(e,t,r){"use strict";var n=/^([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,s=/^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$/;e.exports=function(e,t){var r,o,i,a,u,c,l=e.pos;if(60!==e.src.charCodeAt(l))return!1;for(u=e.pos,c=e.posMax;;){if(++l>=c)return!1;if(60===(a=e.src.charCodeAt(l)))return!1;if(62===a)break}return r=e.src.slice(u+1,l),s.test(r)?(o=e.md.normalizeLink(r),!!e.md.validateLink(o)&&(t||((i=e.push("link_open","a",1)).attrs=[["href",o]],i.markup="autolink",i.info="auto",(i=e.push("text","",0)).content=e.md.normalizeLinkText(r),(i=e.push("link_close","a",-1)).markup="autolink",i.info="auto"),e.pos+=r.length+2,!0)):!!n.test(r)&&(o=e.md.normalizeLink("mailto:"+r),!!e.md.validateLink(o)&&(t||((i=e.push("link_open","a",1)).attrs=[["href",o]],i.markup="autolink",i.info="auto",(i=e.push("text","",0)).content=e.md.normalizeLinkText(r),(i=e.push("link_close","a",-1)).markup="autolink",i.info="auto"),e.pos+=r.length+2,!0))}},function(e,t,r){"use strict";var n=r(6).HTML_TAG_RE;e.exports=function(e,t){var r,s,o,i=e.pos;return!!e.md.options.html&&(o=e.posMax,!(60!==e.src.charCodeAt(i)||i+2>=o)&&(!(33!==(r=e.src.charCodeAt(i+1))&&63!==r&&47!==r&&!function(e){var t=32|e;return t>=97&&t<=122}(r))&&(!!(s=e.src.slice(i).match(n))&&(t||(e.push("html_inline","",0).content=e.src.slice(i,i+s[0].length)),e.pos+=s[0].length,!0))))}},function(e,t,r){"use strict";var n=r(3),s=r(0).has,o=r(0).isValidEntityCode,i=r(0).fromCodePoint,a=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,u=/^&([a-z][a-z0-9]{1,31});/i;e.exports=function(e,t){var r,c,l=e.pos,p=e.posMax;if(38!==e.src.charCodeAt(l))return!1;if(l+1i;n-=o.jump+1)if((o=t[n]).marker===s.marker&&o.open&&o.end<0&&(u=!1,(o.close||s.open)&&(o.length+s.length)%3==0&&(o.length%3==0&&s.length%3==0||(u=!0)),!u)){c=n>0&&!t[n-1].open?t[n-1].jump+1:0,s.jump=r-n+c,s.open=!1,o.end=r,o.jump=c,o.close=!1,a=-1;break}-1!==a&&(l[s.marker][(s.length||0)%3]=a)}}e.exports=function(e){var t,r=e.tokens_meta,s=e.tokens_meta.length;for(n(0,e.delimiters),t=0;t0&&n++,"text"===s[t].type&&t+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],o={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(s),this.tokens_meta.push(o),s},a.prototype.scanDelims=function(e,t){var r,n,a,u,c,l,p,h,f,d=e,m=!0,g=!0,_=this.posMax,b=this.src.charCodeAt(e);for(r=e>0?this.src.charCodeAt(e-1):32;d<_&&this.src.charCodeAt(d)===b;)d++;return a=d-e,n=d<_?this.src.charCodeAt(d):32,p=i(r)||o(String.fromCharCode(r)),f=i(n)||o(String.fromCharCode(n)),l=s(r),(h=s(n))?m=!1:f&&(l||p||(m=!1)),l?g=!1:p&&(h||f||(g=!1)),t?(u=m,c=g):(u=m&&(!g||p),c=g&&(!m||f)),{can_open:u,can_close:c,length:a}},a.prototype.Token=n,e.exports=a},function(e,t,r){"use strict";function n(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach((function(t){t&&Object.keys(t).forEach((function(r){e[r]=t[r]}))})),e}function s(e){return Object.prototype.toString.call(e)}function o(e){return"[object Function]"===s(e)}function i(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var a={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};var u={"http:":{validate:function(e,t,r){var n=e.slice(t);return r.re.http||(r.re.http=new RegExp("^\\/\\/"+r.re.src_auth+r.re.src_host_port_strict+r.re.src_path,"i")),r.re.http.test(n)?n.match(r.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,r){var n=e.slice(t);return r.re.no_http||(r.re.no_http=new RegExp("^"+r.re.src_auth+"(?:localhost|(?:(?:"+r.re.src_domain+")\\.)+"+r.re.src_domain_root+")"+r.re.src_port+r.re.src_host_terminator+r.re.src_path,"i")),r.re.no_http.test(n)?t>=3&&":"===e[t-3]||t>=3&&"/"===e[t-3]?0:n.match(r.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,r){var n=e.slice(t);return r.re.mailto||(r.re.mailto=new RegExp("^"+r.re.src_email_name+"@"+r.re.src_host_strict,"i")),r.re.mailto.test(n)?n.match(r.re.mailto)[0].length:0}}},c="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function l(e){var t=e.re=r(63)(e.__opts__),n=e.__tlds__.slice();function a(e){return e.replace("%TLDS%",t.src_tlds)}e.onCompile(),e.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(t.src_xn),t.src_tlds=n.join("|"),t.email_fuzzy=RegExp(a(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(a(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(a(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(a(t.tpl_host_fuzzy_test),"i");var u=[];function c(e,t){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+t)}e.__compiled__={},Object.keys(e.__schemas__).forEach((function(t){var r=e.__schemas__[t];if(null!==r){var n={validate:null,link:null};if(e.__compiled__[t]=n,"[object Object]"===s(r))return!function(e){return"[object RegExp]"===s(e)}(r.validate)?o(r.validate)?n.validate=r.validate:c(t,r):n.validate=function(e){return function(t,r){var n=t.slice(r);return e.test(n)?n.match(e)[0].length:0}}(r.validate),void(o(r.normalize)?n.normalize=r.normalize:r.normalize?c(t,r):n.normalize=function(e,t){t.normalize(e)});!function(e){return"[object String]"===s(e)}(r)?c(t,r):u.push(t)}})),u.forEach((function(t){e.__compiled__[e.__schemas__[t]]&&(e.__compiled__[t].validate=e.__compiled__[e.__schemas__[t]].validate,e.__compiled__[t].normalize=e.__compiled__[e.__schemas__[t]].normalize)})),e.__compiled__[""]={validate:null,normalize:function(e,t){t.normalize(e)}};var l=Object.keys(e.__compiled__).filter((function(t){return t.length>0&&e.__compiled__[t]})).map(i).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+l+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+l+")","ig"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),function(e){e.__index__=-1,e.__text_cache__=""}(e)}function p(e,t){var r=e.__index__,n=e.__last_index__,s=e.__text_cache__.slice(r,n);this.schema=e.__schema__.toLowerCase(),this.index=r+t,this.lastIndex=n+t,this.raw=s,this.text=s,this.url=s}function h(e,t){var r=new p(e,t);return e.__compiled__[r.schema].normalize(r,e),r}function f(e,t){if(!(this instanceof f))return new f(e,t);var r;t||(r=e,Object.keys(r||{}).reduce((function(e,t){return e||a.hasOwnProperty(t)}),!1)&&(t=e,e={})),this.__opts__=n({},a,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},u,e),this.__compiled__={},this.__tlds__=c,this.__tlds_replaced__=!1,this.re={},l(this)}f.prototype.add=function(e,t){return this.__schemas__[e]=t,l(this),this},f.prototype.set=function(e){return this.__opts__=n(this.__opts__,e),this},f.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;var t,r,n,s,o,i,a,u;if(this.re.schema_test.test(e))for((a=this.re.schema_search).lastIndex=0;null!==(t=a.exec(e));)if(s=this.testSchemaAt(e,t[2],a.lastIndex)){this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+s;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(u=e.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||u=0&&null!==(n=e.match(this.re.email_fuzzy))&&(o=n.index+n[1].length,i=n.index+n[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=i)),this.__index__>=0},f.prototype.pretest=function(e){return this.re.pretest.test(e)},f.prototype.testSchemaAt=function(e,t,r){return this.__compiled__[t.toLowerCase()]?this.__compiled__[t.toLowerCase()].validate(e,r,this):0},f.prototype.match=function(e){var t=0,r=[];this.__index__>=0&&this.__text_cache__===e&&(r.push(h(this,t)),t=this.__last_index__);for(var n=t?e.slice(t):e;this.test(n);)r.push(h(this,t)),n=n.slice(this.__last_index__),t+=this.__last_index__;return r.length?r:null},f.prototype.tlds=function(e,t){return e=Array.isArray(e)?e:[e],t?(this.__tlds__=this.__tlds__.concat(e).sort().filter((function(e,t,r){return e!==r[t-1]})).reverse(),l(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,l(this),this)},f.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},f.prototype.onCompile=function(){},e.exports=f},function(e,t,r){"use strict";e.exports=function(e){var t={};t.src_Any=r(64).source,t.src_Cc=r(65).source,t.src_Z=r(66).source,t.src_P=r(67).source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join("|"),t.src_ZCc=[t.src_Z,t.src_Cc].join("|");return t.src_pseudo_letter="(?:(?![><|]|"+t.src_ZPCc+")"+t.src_Any+")",t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",t.src_auth="(?:(?:(?!"+t.src_ZCc+"|[@/\\[\\]()]).)+@)?",t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",t.src_host_terminator="(?=$|[><|]|"+t.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+t.src_ZPCc+"))",t.src_path="(?:[/?#](?:(?!"+t.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+t.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+t.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+t.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+t.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+t.src_ZCc+"|[']).)+\\'|\\'(?="+t.src_pseudo_letter+"|[-]).|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+t.src_ZCc+"|[.]).|"+(e&&e["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+t.src_ZCc+").|\\!+(?!"+t.src_ZCc+"|[!]).|\\?(?!"+t.src_ZCc+"|[?]).)+|\\/)?",t.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',t.src_xn="xn--[a-z0-9\\-]{1,59}",t.src_domain_root="(?:"+t.src_xn+"|"+t.src_pseudo_letter+"{1,63})",t.src_domain="(?:"+t.src_xn+"|(?:"+t.src_pseudo_letter+")|(?:"+t.src_pseudo_letter+"(?:-|"+t.src_pseudo_letter+"){0,61}"+t.src_pseudo_letter+"))",t.src_host="(?:(?:(?:(?:"+t.src_domain+")\\.)*"+t.src_domain+"))",t.tpl_host_fuzzy="(?:"+t.src_ip4+"|(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%)))",t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%))",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+t.src_ZPCc+"|>|$))",t.tpl_email_fuzzy='(^|[><|]|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}},function(e,t){e.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(e,t){e.exports=/[\0-\x1F\x7F-\x9F]/},function(e,t){e.exports=/[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/},function(e,t){e.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(e,t,r){(function(e,n){var s;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(o){t&&t.nodeType,e&&e.nodeType;var i="object"==typeof n&&n;i.global!==i&&i.window!==i&&i.self;var a,u=2147483647,c=/^xn--/,l=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,d=String.fromCharCode;function m(e){throw new RangeError(h[e])}function g(e,t){for(var r=e.length,n=[];r--;)n[r]=t(e[r]);return n}function _(e,t){var r=e.split("@"),n="";return r.length>1&&(n=r[0]+"@",e=r[1]),n+g((e=e.replace(p,".")).split("."),t).join(".")}function b(e){for(var t,r,n=[],s=0,o=e.length;s=55296&&t<=56319&&s65535&&(t+=d((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=d(e)})).join("")}function C(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function v(e,t,r){var n=0;for(e=r?f(e/700):e>>1,e+=f(e/t);e>455;n+=36)e=f(e/35);return f(n+36*e/(e+38))}function D(e){var t,r,n,s,o,i,a,c,l,p,h,d=[],g=e.length,_=0,b=128,C=72;for((r=e.lastIndexOf("-"))<0&&(r=0),n=0;n=128&&m("not-basic"),d.push(e.charCodeAt(n));for(s=r>0?r+1:0;s=g&&m("invalid-input"),((c=(h=e.charCodeAt(s++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||c>f((u-_)/i))&&m("overflow"),_+=c*i,!(c<(l=a<=C?1:a>=C+26?26:a-C));a+=36)i>f(u/(p=36-l))&&m("overflow"),i*=p;C=v(_-o,t=d.length+1,0==o),f(_/t)>u-b&&m("overflow"),b+=f(_/t),_%=t,d.splice(_++,0,b)}return k(d)}function A(e){var t,r,n,s,o,i,a,c,l,p,h,g,_,k,D,A=[];for(g=(e=b(e)).length,t=128,r=0,o=72,i=0;i=t&&hf((u-r)/(_=n+1))&&m("overflow"),r+=(a-t)*_,t=a,i=0;iu&&m("overflow"),h==t){for(c=r,l=36;!(c<(p=l<=o?1:l>=o+26?26:l-o));l+=36)D=c-p,k=36-p,A.push(d(C(p+D%k,0))),c=f(D/k);A.push(d(C(c,0))),o=v(r,_,n==s),r=0,++n}++r,++t}return A.join("")}a={version:"1.4.1",ucs2:{decode:b,encode:k},decode:D,encode:A,toASCII:function(e){return _(e,(function(e){return l.test(e)?"xn--"+A(e):e}))},toUnicode:function(e){return _(e,(function(e){return c.test(e)?D(e.slice(4).toLowerCase()):e}))}},void 0===(s=function(){return a}.call(t,r,t,e))||(e.exports=s)}()}).call(this,r(69)(e),r(70))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";e.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(e,t,r){"use strict";e.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(e,t,r){"use strict";e.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}}]); \ No newline at end of file diff --git a/extensions/markdown-language-features/notebook/index.ts b/extensions/markdown-language-features/notebook/index.ts new file mode 100644 index 00000000..1dcb131a --- /dev/null +++ b/extensions/markdown-language-features/notebook/index.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as MarkdownIt from 'markdown-it'; + +declare const acquireNotebookRendererApi: any; +type extendMarkdownItFnType = ( + (f: (md: MarkdownIt.MarkdownIt) => void) => void +); + +(function () { + const markdownIt = new MarkdownIt({ + html: true + }); + + (globalThis as any).extendMarkdownIt = ((f: (md: MarkdownIt.MarkdownIt) => void) => { + f(markdownIt); + }) as extendMarkdownItFnType; + + const notebook = acquireNotebookRendererApi('notebookCoreTestRenderer'); + + notebook.onDidCreateMarkdown(({ element, content }: any) => { + const rendered = markdownIt.render(content); + element.innerHTML = rendered; + }); +}()); diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index d72f4cd9..8da6a42f 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -1,340 +1,352 @@ { - "name": "markdown-language-features", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "icon": "icon.png", - "publisher": "vscode", - "enableProposedApi": true, - "license": "MIT", - "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", - "engines": { - "vscode": "^1.20.0" - }, - "main": "./out/extension", - "browser": "./dist/browser/extension", - "categories": [ - "Programming Languages" - ], - "activationEvents": [ - "onLanguage:markdown", - "onCommand:markdown.preview.toggleLock", - "onCommand:markdown.preview.refresh", - "onCommand:markdown.showPreview", - "onCommand:markdown.showPreviewToSide", - "onCommand:markdown.showLockedPreviewToSide", - "onCommand:markdown.showSource", - "onCommand:markdown.showPreviewSecuritySelector", - "onCommand:markdown.api.render", - "onWebviewPanel:markdown.preview", - "onCustomEditor:vscode.markdown.preview.editor" - ], - "contributes": { - "commands": [ - { - "command": "markdown.showPreview", - "title": "%markdown.preview.title%", - "category": "Markdown", - "icon": { - "light": "./media/preview-light.svg", - "dark": "./media/preview-dark.svg" - } - }, - { - "command": "markdown.showPreviewToSide", - "title": "%markdown.previewSide.title%", - "category": "Markdown", - "icon": "$(open-preview)" - }, - { - "command": "markdown.showLockedPreviewToSide", - "title": "%markdown.showLockedPreviewToSide.title%", - "category": "Markdown", - "icon": "$(open-preview)" - }, - { - "command": "markdown.showSource", - "title": "%markdown.showSource.title%", - "category": "Markdown", - "icon": "$(go-to-file)" - }, - { - "command": "markdown.showPreviewSecuritySelector", - "title": "%markdown.showPreviewSecuritySelector.title%", - "category": "Markdown" - }, - { - "command": "markdown.preview.refresh", - "title": "%markdown.preview.refresh.title%", - "category": "Markdown" - }, - { - "command": "markdown.preview.toggleLock", - "title": "%markdown.preview.toggleLock.title%", - "category": "Markdown" - } - ], - "menus": { - "editor/title": [ - { - "command": "markdown.showPreviewToSide", - "when": "editorLangId == markdown && !notebookEditorFocused", - "alt": "markdown.showPreview", - "group": "navigation" - }, - { - "command": "markdown.showSource", - "when": "markdownPreviewFocus", - "group": "navigation" - }, - { - "command": "markdown.preview.refresh", - "when": "markdownPreviewFocus", - "group": "1_markdown" - }, - { - "command": "markdown.preview.toggleLock", - "when": "markdownPreviewFocus", - "group": "1_markdown" - }, - { - "command": "markdown.showPreviewSecuritySelector", - "when": "markdownPreviewFocus", - "group": "1_markdown" - } - ], - "explorer/context": [ - { - "command": "markdown.showPreview", - "when": "resourceLangId == markdown", - "group": "navigation" - } - ], - "editor/title/context": [ - { - "command": "markdown.showPreview", - "when": "resourceLangId == markdown", - "group": "1_open" - } - ], - "commandPalette": [ - { - "command": "markdown.showPreview", - "when": "editorLangId == markdown && !notebookEditorFocused", - "group": "navigation" - }, - { - "command": "markdown.showPreviewToSide", - "when": "editorLangId == markdown && !notebookEditorFocused", - "group": "navigation" - }, - { - "command": "markdown.showLockedPreviewToSide", - "when": "editorLangId == markdown && !notebookEditorFocused", - "group": "navigation" - }, - { - "command": "markdown.showSource", - "when": "markdownPreviewFocus", - "group": "navigation" - }, - { - "command": "markdown.showPreviewSecuritySelector", - "when": "editorLangId == markdown && !notebookEditorFocused" - }, - { - "command": "markdown.showPreviewSecuritySelector", - "when": "markdownPreviewFocus" - }, - { - "command": "markdown.preview.toggleLock", - "when": "markdownPreviewFocus" - }, - { - "command": "markdown.preview.refresh", - "when": "editorLangId == markdown && !notebookEditorFocused" - }, - { - "command": "markdown.preview.refresh", - "when": "markdownPreviewFocus" - } - ] - }, - "keybindings": [ - { - "command": "markdown.showPreview", - "key": "shift+ctrl+v", - "mac": "shift+cmd+v", - "when": "editorLangId == markdown && !notebookEditorFocused" - }, - { - "command": "markdown.showPreviewToSide", - "key": "ctrl+k v", - "mac": "cmd+k v", - "when": "editorLangId == markdown && !notebookEditorFocused" - } - ], - "configuration": { - "type": "object", - "title": "Markdown", - "order": 20, - "properties": { - "markdown.styles": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "description": "%markdown.styles.dec%", - "scope": "resource" - }, - "markdown.preview.breaks": { - "type": "boolean", - "default": false, - "description": "%markdown.preview.breaks.desc%", - "scope": "resource" - }, - "markdown.preview.linkify": { - "type": "boolean", - "default": true, - "description": "%markdown.preview.linkify%", - "scope": "resource" - }, - "markdown.preview.fontFamily": { - "type": "string", - "default": "-apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif", - "description": "%markdown.preview.fontFamily.desc%", - "scope": "resource" - }, - "markdown.preview.fontSize": { - "type": "number", - "default": 14, - "description": "%markdown.preview.fontSize.desc%", - "scope": "resource" - }, - "markdown.preview.lineHeight": { - "type": "number", - "default": 1.6, - "description": "%markdown.preview.lineHeight.desc%", - "scope": "resource" - }, - "markdown.preview.scrollPreviewWithEditor": { - "type": "boolean", - "default": true, - "description": "%markdown.preview.scrollPreviewWithEditor.desc%", - "scope": "resource" - }, - "markdown.preview.markEditorSelection": { - "type": "boolean", - "default": true, - "description": "%markdown.preview.markEditorSelection.desc%", - "scope": "resource" - }, - "markdown.preview.scrollEditorWithPreview": { - "type": "boolean", - "default": true, - "description": "%markdown.preview.scrollEditorWithPreview.desc%", - "scope": "resource" - }, - "markdown.preview.doubleClickToSwitchToEditor": { - "type": "boolean", - "default": true, - "description": "%markdown.preview.doubleClickToSwitchToEditor.desc%", - "scope": "resource" - }, - "markdown.preview.openMarkdownLinks": { - "type": "string", - "default": "inPreview", - "description": "%configuration.markdown.preview.openMarkdownLinks.description%", - "scope": "resource", - "enum": [ - "inPreview", - "inEditor" - ], - "enumDescriptions": [ - "%configuration.markdown.preview.openMarkdownLinks.inPreview%", - "%configuration.markdown.preview.openMarkdownLinks.inEditor%" - ] - }, - "markdown.links.openLocation": { - "type": "string", - "default": "currentGroup", - "description": "%configuration.markdown.links.openLocation.description%", - "scope": "resource", - "enum": [ - "currentGroup", - "beside" - ], - "enumDescriptions": [ - "%configuration.markdown.links.openLocation.currentGroup%", - "%configuration.markdown.links.openLocation.beside%" - ] - }, - "markdown.trace": { - "type": "string", - "enum": [ - "off", - "verbose" - ], - "default": "off", - "description": "%markdown.trace.desc%", - "scope": "window" - } - } - }, - "configurationDefaults": { - "[markdown]": { - "editor.wordWrap": "on", - "editor.quickSuggestions": false - } - }, - "jsonValidation": [ - { - "fileMatch": "package.json", - "url": "./schemas/package.schema.json" - } - ], - "markdown.previewStyles": [ - "./media/markdown.css", - "./media/highlight.css" - ], - "markdown.previewScripts": [ - "./media/index.js" - ], - "customEditors": [ - { - "viewType": "vscode.markdown.preview.editor", - "displayName": "Markdown Preview (Experimental)", - "priority": "option", - "selector": [ - { - "filenamePattern": "*.md" - } - ] - } - ] - }, - "scripts": { - "compile": "gulp compile-extension:markdown-language-features && npm run build-preview", - "watch": "npm run build-preview && gulp watch-extension:markdown-language-features", - "vscode:prepublish": "npm run build-ext && npm run build-preview", - "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", - "build-preview": "webpack --mode production", - "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", - "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" - }, - "dependencies": { - "highlight.js": "^10.4.1", - "markdown-it": "^12.0.3", - "markdown-it-front-matter": "^0.2.1", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "^4.0.0" - }, - "devDependencies": { - "@types/highlight.js": "10.1.0", - "@types/lodash.throttle": "^4.1.3", - "@types/markdown-it": "0.0.2", - "@types/node": "^12.19.9", - "lodash.throttle": "^4.1.1" - } + "name": "markdown-language-features", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "icon": "icon.png", + "publisher": "vscode", + "enableProposedApi": true, + "license": "MIT", + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "engines": { + "vscode": "^1.20.0" + }, + "main": "./out/extension", + "browser": "./dist/browser/extension", + "categories": [ + "Programming Languages" + ], + "activationEvents": [ + "onLanguage:markdown", + "onCommand:markdown.preview.toggleLock", + "onCommand:markdown.preview.refresh", + "onCommand:markdown.showPreview", + "onCommand:markdown.showPreviewToSide", + "onCommand:markdown.showLockedPreviewToSide", + "onCommand:markdown.showSource", + "onCommand:markdown.showPreviewSecuritySelector", + "onCommand:markdown.api.render", + "onWebviewPanel:markdown.preview", + "onCustomEditor:vscode.markdown.preview.editor" + ], + "contributes": { + "notebookMarkdownRenderer": [ + { + "id": "markdownItRenderer", + "displayName": "Markdown it renderer", + "entrypoint": "./notebook-out/index.js" + } + ], + "commands": [ + { + "command": "markdown.showPreview", + "title": "%markdown.preview.title%", + "category": "Markdown", + "icon": { + "light": "./media/preview-light.svg", + "dark": "./media/preview-dark.svg" + } + }, + { + "command": "markdown.showPreviewToSide", + "title": "%markdown.previewSide.title%", + "category": "Markdown", + "icon": "$(open-preview)" + }, + { + "command": "markdown.showLockedPreviewToSide", + "title": "%markdown.showLockedPreviewToSide.title%", + "category": "Markdown", + "icon": "$(open-preview)" + }, + { + "command": "markdown.showSource", + "title": "%markdown.showSource.title%", + "category": "Markdown", + "icon": "$(go-to-file)" + }, + { + "command": "markdown.showPreviewSecuritySelector", + "title": "%markdown.showPreviewSecuritySelector.title%", + "category": "Markdown" + }, + { + "command": "markdown.preview.refresh", + "title": "%markdown.preview.refresh.title%", + "category": "Markdown" + }, + { + "command": "markdown.preview.toggleLock", + "title": "%markdown.preview.toggleLock.title%", + "category": "Markdown" + } + ], + "menus": { + "editor/title": [ + { + "command": "markdown.showPreviewToSide", + "when": "editorLangId == markdown && !notebookEditorFocused", + "alt": "markdown.showPreview", + "group": "navigation" + }, + { + "command": "markdown.showSource", + "when": "markdownPreviewFocus", + "group": "navigation" + }, + { + "command": "markdown.preview.refresh", + "when": "markdownPreviewFocus", + "group": "1_markdown" + }, + { + "command": "markdown.preview.toggleLock", + "when": "markdownPreviewFocus", + "group": "1_markdown" + }, + { + "command": "markdown.showPreviewSecuritySelector", + "when": "markdownPreviewFocus", + "group": "1_markdown" + } + ], + "explorer/context": [ + { + "command": "markdown.showPreview", + "when": "resourceLangId == markdown", + "group": "navigation" + } + ], + "editor/title/context": [ + { + "command": "markdown.showPreview", + "when": "resourceLangId == markdown", + "group": "1_open" + } + ], + "commandPalette": [ + { + "command": "markdown.showPreview", + "when": "editorLangId == markdown && !notebookEditorFocused", + "group": "navigation" + }, + { + "command": "markdown.showPreviewToSide", + "when": "editorLangId == markdown && !notebookEditorFocused", + "group": "navigation" + }, + { + "command": "markdown.showLockedPreviewToSide", + "when": "editorLangId == markdown && !notebookEditorFocused", + "group": "navigation" + }, + { + "command": "markdown.showSource", + "when": "markdownPreviewFocus", + "group": "navigation" + }, + { + "command": "markdown.showPreviewSecuritySelector", + "when": "editorLangId == markdown && !notebookEditorFocused" + }, + { + "command": "markdown.showPreviewSecuritySelector", + "when": "markdownPreviewFocus" + }, + { + "command": "markdown.preview.toggleLock", + "when": "markdownPreviewFocus" + }, + { + "command": "markdown.preview.refresh", + "when": "editorLangId == markdown && !notebookEditorFocused" + }, + { + "command": "markdown.preview.refresh", + "when": "markdownPreviewFocus" + } + ] + }, + "keybindings": [ + { + "command": "markdown.showPreview", + "key": "shift+ctrl+v", + "mac": "shift+cmd+v", + "when": "editorLangId == markdown && !notebookEditorFocused" + }, + { + "command": "markdown.showPreviewToSide", + "key": "ctrl+k v", + "mac": "cmd+k v", + "when": "editorLangId == markdown && !notebookEditorFocused" + } + ], + "configuration": { + "type": "object", + "title": "Markdown", + "order": 20, + "properties": { + "markdown.styles": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "%markdown.styles.dec%", + "scope": "resource" + }, + "markdown.preview.breaks": { + "type": "boolean", + "default": false, + "description": "%markdown.preview.breaks.desc%", + "scope": "resource" + }, + "markdown.preview.linkify": { + "type": "boolean", + "default": true, + "description": "%markdown.preview.linkify%", + "scope": "resource" + }, + "markdown.preview.fontFamily": { + "type": "string", + "default": "-apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif", + "description": "%markdown.preview.fontFamily.desc%", + "scope": "resource" + }, + "markdown.preview.fontSize": { + "type": "number", + "default": 14, + "description": "%markdown.preview.fontSize.desc%", + "scope": "resource" + }, + "markdown.preview.lineHeight": { + "type": "number", + "default": 1.6, + "description": "%markdown.preview.lineHeight.desc%", + "scope": "resource" + }, + "markdown.preview.scrollPreviewWithEditor": { + "type": "boolean", + "default": true, + "description": "%markdown.preview.scrollPreviewWithEditor.desc%", + "scope": "resource" + }, + "markdown.preview.markEditorSelection": { + "type": "boolean", + "default": true, + "description": "%markdown.preview.markEditorSelection.desc%", + "scope": "resource" + }, + "markdown.preview.scrollEditorWithPreview": { + "type": "boolean", + "default": true, + "description": "%markdown.preview.scrollEditorWithPreview.desc%", + "scope": "resource" + }, + "markdown.preview.doubleClickToSwitchToEditor": { + "type": "boolean", + "default": true, + "description": "%markdown.preview.doubleClickToSwitchToEditor.desc%", + "scope": "resource" + }, + "markdown.preview.openMarkdownLinks": { + "type": "string", + "default": "inPreview", + "description": "%configuration.markdown.preview.openMarkdownLinks.description%", + "scope": "resource", + "enum": [ + "inPreview", + "inEditor" + ], + "enumDescriptions": [ + "%configuration.markdown.preview.openMarkdownLinks.inPreview%", + "%configuration.markdown.preview.openMarkdownLinks.inEditor%" + ] + }, + "markdown.links.openLocation": { + "type": "string", + "default": "currentGroup", + "description": "%configuration.markdown.links.openLocation.description%", + "scope": "resource", + "enum": [ + "currentGroup", + "beside" + ], + "enumDescriptions": [ + "%configuration.markdown.links.openLocation.currentGroup%", + "%configuration.markdown.links.openLocation.beside%" + ] + }, + "markdown.trace": { + "type": "string", + "enum": [ + "off", + "verbose" + ], + "default": "off", + "description": "%markdown.trace.desc%", + "scope": "window" + } + } + }, + "configurationDefaults": { + "[markdown]": { + "editor.wordWrap": "on", + "editor.quickSuggestions": false + } + }, + "jsonValidation": [ + { + "fileMatch": "package.json", + "url": "./schemas/package.schema.json" + } + ], + "markdown.previewStyles": [ + "./media/markdown.css", + "./media/highlight.css" + ], + "markdown.previewScripts": [ + "./media/index.js" + ], + "customEditors": [ + { + "viewType": "vscode.markdown.preview.editor", + "displayName": "Markdown Preview (Experimental)", + "priority": "option", + "selector": [ + { + "filenamePattern": "*.md" + } + ] + } + ] + }, + "scripts": { + "compile": "gulp compile-extension:markdown-language-features && npm run build-preview && npm run build-notebook", + "watch": "npm run build-preview && gulp watch-extension:markdown-language-features", + "vscode:prepublish": "npm run build-ext && npm run build-preview", + "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", + "build-preview": "npx webpack-cli --mode production", + "build-notebook": "npx webpack-cli --config webpack.notebook --mode production", + "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" + }, + "dependencies": { + "highlight.js": "^10.4.1", + "markdown-it": "^12.0.3", + "markdown-it-front-matter": "^0.2.1", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "^4.0.0" + }, + "devDependencies": { + "@types/highlight.js": "10.1.0", + "@types/lodash.throttle": "^4.1.3", + "@types/markdown-it": "0.0.2", + "@types/node": "^12.19.9", + "lodash.throttle": "^4.1.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 9363431f..22c512db 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -439,6 +439,9 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider { if (hrefPath[0] !== '/') { // Fix #93691, use this.resource.fsPath instead of this.resource.path hrefPath = path.join(path.dirname(this.resource.fsPath), hrefPath); + } else { + // Handle any normalized file paths + hrefPath = vscode.Uri.parse(hrefPath.replace('/file', '')).fsPath; } const config = vscode.workspace.getConfiguration('markdown', this.resource); diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 80761e0e..5e010755 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -216,7 +216,7 @@ export class MarkdownEngine { const src = token.attrGet('src'); if (src) { - env.containingImages.push({ src }); + env.containingImages?.push({ src }); const imgHash = hash(src); token.attrSet('id', `image-hash-${imgHash}`); } diff --git a/extensions/markdown-language-features/webpack.notebook.js b/extensions/markdown-language-features/webpack.notebook.js new file mode 100644 index 00000000..bf1e2265 --- /dev/null +++ b/extensions/markdown-language-features/webpack.notebook.js @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +const path = require('path'); + +module.exports = { + entry: { + index: './notebook/index.ts' + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/ + } + ] + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'] + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'notebook-out') + } +}; diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index ab645a38..f53c6ae2 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -140,5 +140,9 @@ }, "devDependencies": { "@types/node": "^12.19.9" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/merge-conflict/src/mergeConflictParser.ts b/extensions/merge-conflict/src/mergeConflictParser.ts index 84a4607a..06e4237f 100644 --- a/extensions/merge-conflict/src/mergeConflictParser.ts +++ b/extensions/merge-conflict/src/mergeConflictParser.ts @@ -58,7 +58,7 @@ export class MergeConflictParser { currentConflict.commonAncestors.push(line); } // Are we within a conflict block and is this a splitter? ======= - else if (currentConflict && !currentConflict.splitter && line.text.startsWith(splitterMarker)) { + else if (currentConflict && !currentConflict.splitter && line.text === splitterMarker) { currentConflict.splitter = line; } // Are we within a conflict block and is this a footer? >>>>>>> diff --git a/extensions/microsoft-authentication/package.json b/extensions/microsoft-authentication/package.json index 0d1f221c..54405b69 100644 --- a/extensions/microsoft-authentication/package.json +++ b/extensions/microsoft-authentication/package.json @@ -1,58 +1,62 @@ { - "name": "microsoft-authentication", - "publisher": "vscode", - "license": "MIT", - "displayName": "%displayName%", - "description": "%description%", - "version": "0.0.1", - "engines": { - "vscode": "^1.42.0" - }, - "categories": [ - "Other" - ], - "enableProposedApi": true, - "activationEvents": [ - "onAuthenticationRequest:microsoft" - ], - "extensionKind": [ - "ui", - "workspace", - "web" - ], - "contributes": { - "authentication": [ - { - "label": "Microsoft", - "id": "microsoft" - } - ] - }, - "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", - "main": "./out/extension.js", - "browser": "./dist/browser/extension.js", - "scripts": { - "vscode:prepublish": "npm run compile", - "compile": "gulp compile-extension:microsoft-authentication", - "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", - "watch": "gulp watch-extension:microsoft-authentication", - "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" - }, - "devDependencies": { - "@types/node": "^12.19.9", - "@types/node-fetch": "^2.5.7", - "@types/randombytes": "^2.0.0", - "@types/sha.js": "^2.4.0", - "@types/uuid": "8.0.0" - }, - "dependencies": { - "buffer": "^5.6.0", - "node-fetch": "^2.6.0", - "randombytes": "github:rmacfarlane/randombytes#b28d4ecee46262801ea09f15fa1f1513a05c5971", - "sha.js": "2.4.11", - "stream": "0.0.2", - "uuid": "^8.2.0", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "^4.1.1" - } + "name": "microsoft-authentication", + "publisher": "vscode", + "license": "MIT", + "displayName": "%displayName%", + "description": "%description%", + "version": "0.0.1", + "engines": { + "vscode": "^1.42.0" + }, + "categories": [ + "Other" + ], + "enableProposedApi": true, + "activationEvents": [ + "onAuthenticationRequest:microsoft" + ], + "extensionKind": [ + "ui", + "workspace", + "web" + ], + "contributes": { + "authentication": [ + { + "label": "Microsoft", + "id": "microsoft" + } + ] + }, + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "main": "./out/extension.js", + "browser": "./dist/browser/extension.js", + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "gulp compile-extension:microsoft-authentication", + "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", + "watch": "gulp watch-extension:microsoft-authentication", + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" + }, + "devDependencies": { + "@types/node": "^12.19.9", + "@types/node-fetch": "^2.5.7", + "@types/randombytes": "^2.0.0", + "@types/sha.js": "^2.4.0", + "@types/uuid": "8.0.0" + }, + "dependencies": { + "buffer": "^5.6.0", + "node-fetch": "2.6.1", + "randombytes": "github:rmacfarlane/randombytes#b28d4ecee46262801ea09f15fa1f1513a05c5971", + "sha.js": "2.4.11", + "stream": "0.0.2", + "uuid": "^8.2.0", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "^4.1.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/microsoft-authentication/src/AADHelper.ts b/extensions/microsoft-authentication/src/AADHelper.ts index 6222d09d..b0631344 100644 --- a/extensions/microsoft-authentication/src/AADHelper.ts +++ b/extensions/microsoft-authentication/src/AADHelper.ts @@ -144,7 +144,7 @@ export class AzureActiveDirectoryService { this.pollForReconnect(session.id, session.refreshToken, session.scope); } } else { - await this.logout(session.id); + await this.removeSession(session.id); } } }); @@ -177,8 +177,8 @@ export class AzureActiveDirectoryService { } private async checkForUpdates(): Promise { - const addedIds: string[] = []; - let removedIds: string[] = []; + const added: vscode.AuthenticationSession[] = []; + let removed: vscode.AuthenticationSession[] = []; const storedData = await this._keychain.getToken(); if (storedData) { try { @@ -187,13 +187,13 @@ export class AzureActiveDirectoryService { const matchesExisting = this._tokens.some(token => token.scope === session.scope && token.sessionId === session.id); if (!matchesExisting && session.refreshToken) { try { - await this.refreshToken(session.refreshToken, session.scope, session.id); - addedIds.push(session.id); + const token = await this.refreshToken(session.refreshToken, session.scope, session.id); + added.push(this.convertToSessionSync(token)); } catch (e) { if (e.message === REFRESH_NETWORK_FAILURE) { // Ignore, will automatically retry on next poll. } else { - await this.logout(session.id); + await this.removeSession(session.id); } } } @@ -202,8 +202,8 @@ export class AzureActiveDirectoryService { promises = promises.concat(this._tokens.map(async token => { const matchesExisting = sessions.some(session => token.scope === session.scope && token.sessionId === session.id); if (!matchesExisting) { - await this.logout(token.sessionId); - removedIds.push(token.sessionId); + await this.removeSession(token.sessionId); + removed.push(this.convertToSessionSync(token)); } })); @@ -211,13 +211,13 @@ export class AzureActiveDirectoryService { } catch (e) { Logger.error(e.message); // if data is improperly formatted, remove all of it and send change event - removedIds = this._tokens.map(token => token.sessionId); + removed = this._tokens.map(this.convertToSessionSync); this.clearSessions(); } } else { if (this._tokens.length) { // Log out all, remove all local data - removedIds = this._tokens.map(token => token.sessionId); + removed = this._tokens.map(this.convertToSessionSync); Logger.info('No stored keychain data, clearing local data'); this._tokens = []; @@ -230,11 +230,25 @@ export class AzureActiveDirectoryService { } } - if (addedIds.length || removedIds.length) { - onDidChangeSessions.fire({ added: addedIds, removed: removedIds, changed: [] }); + if (added.length || removed.length) { + onDidChangeSessions.fire({ added: added, removed: removed, changed: [] }); } } + /** + * Return a session object without checking for expiry and potentially refreshing. + * @param token The token information. + */ + private convertToSessionSync(token: IToken): MicrosoftAuthenticationSession { + return { + id: token.sessionId, + accessToken: token.accessToken!, + idToken: token.idToken, + account: token.account, + scopes: token.scope.split(' ') + }; + } + private async convertToSession(token: IToken): Promise { const resolvedTokens = await this.resolveAccessAndIdTokens(token); return { @@ -286,7 +300,17 @@ export class AzureActiveDirectoryService { return Promise.all(this._tokens.map(token => this.convertToSession(token))); } - public async login(scope: string): Promise { + async getSessions(scopes?: string[]): Promise { + if (!scopes) { + return this.sessions; + } + + const orderedScopes = scopes.sort().join(' '); + const matchingTokens = this._tokens.filter(token => token.scope === orderedScopes); + return Promise.all(matchingTokens.map(token => this.convertToSession(token))); + } + + public async createSession(scope: string): Promise { Logger.info('Logging in...'); if (!scope.includes('offline_access')) { Logger.info('Warning: The \'offline_access\' scope was not included, so the generated token will not be able to be refreshed.'); @@ -478,8 +502,8 @@ export class AzureActiveDirectoryService { if (token.expiresIn) { this._refreshTimeouts.set(token.sessionId, setTimeout(async () => { try { - await this.refreshToken(token.refreshToken, scope, token.sessionId); - onDidChangeSessions.fire({ added: [], removed: [], changed: [token.sessionId] }); + const refreshedToken = await this.refreshToken(token.refreshToken, scope, token.sessionId); + onDidChangeSessions.fire({ added: [], removed: [], changed: [this.convertToSessionSync(refreshedToken)] }); } catch (e) { if (e.message === REFRESH_NETWORK_FAILURE) { const didSucceedOnRetry = await this.handleRefreshNetworkError(token.sessionId, token.refreshToken, scope); @@ -487,8 +511,8 @@ export class AzureActiveDirectoryService { this.pollForReconnect(token.sessionId, token.refreshToken, token.scope); } } else { - await this.logout(token.sessionId); - onDidChangeSessions.fire({ added: [], removed: [token.sessionId], changed: [] }); + await this.removeSession(token.sessionId); + onDidChangeSessions.fire({ added: [], removed: [this.convertToSessionSync(token)], changed: [] }); } } }, 1000 * (token.expiresIn - 30))); @@ -613,13 +637,16 @@ export class AzureActiveDirectoryService { } } - private removeInMemorySessionData(sessionId: string) { + private removeInMemorySessionData(sessionId: string): IToken | undefined { const tokenIndex = this._tokens.findIndex(token => token.sessionId === sessionId); + let token: IToken | undefined; if (tokenIndex > -1) { + token = this._tokens[tokenIndex]; this._tokens.splice(tokenIndex, 1); } this.clearSessionTimeout(sessionId); + return token; } private pollForReconnect(sessionId: string, refreshToken: string, scope: string): void { @@ -645,7 +672,7 @@ export class AzureActiveDirectoryService { const token = this._tokens.find(token => token.sessionId === sessionId); if (token) { token.accessToken = undefined; - onDidChangeSessions.fire({ added: [], removed: [], changed: [token.sessionId] }); + onDidChangeSessions.fire({ added: [], removed: [], changed: [this.convertToSessionSync(token)] }); } } @@ -664,15 +691,21 @@ export class AzureActiveDirectoryService { }); } - public async logout(sessionId: string) { + public async removeSession(sessionId: string): Promise { Logger.info(`Logging out of session '${sessionId}'`); - this.removeInMemorySessionData(sessionId); + const token = this.removeInMemorySessionData(sessionId); + let session: vscode.AuthenticationSession | undefined; + if (token) { + session = this.convertToSessionSync(token); + } if (this._tokens.length === 0) { await this._keychain.deleteToken(); } else { this.storeTokenData(); } + + return session; } public async clearSessions() { diff --git a/extensions/microsoft-authentication/src/extension.ts b/extensions/microsoft-authentication/src/extension.ts index 23c18d8b..41b8690f 100644 --- a/extensions/microsoft-authentication/src/extension.ts +++ b/extensions/microsoft-authentication/src/extension.ts @@ -20,16 +20,16 @@ export async function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.authentication.registerAuthenticationProvider('microsoft', 'Microsoft', { onDidChangeSessions: onDidChangeSessions.event, - getSessions: () => Promise.resolve(loginService.sessions), - login: async (scopes: string[]) => { + getSessions: (scopes: string[]) => loginService.getSessions(scopes), + createSession: async (scopes: string[]) => { try { /* __GDPR__ "login" : { } */ telemetryReporter.sendTelemetryEvent('login'); - const session = await loginService.login(scopes.sort().join(' ')); - onDidChangeSessions.fire({ added: [session.id], removed: [], changed: [] }); + const session = await loginService.createSession(scopes.sort().join(' ')); + onDidChangeSessions.fire({ added: [session], removed: [], changed: [] }); return session; } catch (e) { /* __GDPR__ @@ -40,15 +40,17 @@ export async function activate(context: vscode.ExtensionContext) { throw e; } }, - logout: async (id: string) => { + removeSession: async (id: string) => { try { /* __GDPR__ "logout" : { } */ telemetryReporter.sendTelemetryEvent('logout'); - await loginService.logout(id); - onDidChangeSessions.fire({ added: [], removed: [id], changed: [] }); + const session = await loginService.removeSession(id); + if (session) { + onDidChangeSessions.fire({ added: [], removed: [session], changed: [] }); + } } catch (e) { /* __GDPR__ "logoutFailed" : { } diff --git a/extensions/microsoft-authentication/yarn.lock b/extensions/microsoft-authentication/yarn.lock index 58e34ee8..b58b488d 100644 --- a/extensions/microsoft-authentication/yarn.lock +++ b/extensions/microsoft-authentication/yarn.lock @@ -126,10 +126,10 @@ mime-types@^2.1.12: dependencies: mime-db "1.44.0" -node-fetch@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== "randombytes@github:rmacfarlane/randombytes#b28d4ecee46262801ea09f15fa1f1513a05c5971": version "2.1.0" diff --git a/extensions/notebook-markdown-extensions/.vscodeignore b/extensions/notebook-markdown-extensions/.vscodeignore new file mode 100644 index 00000000..9f1e0620 --- /dev/null +++ b/extensions/notebook-markdown-extensions/.vscodeignore @@ -0,0 +1,12 @@ +test/** +test-workspace/** +src/** +tsconfig.json +out/test/** +out/** +extension.webpack.config.js +extension-browser.webpack.config.js +cgmanifest.json +yarn.lock +preview-src/** +webpack.config.js diff --git a/extensions/notebook-markdown-extensions/README.md b/extensions/notebook-markdown-extensions/README.md new file mode 100644 index 00000000..cc1d7f6f --- /dev/null +++ b/extensions/notebook-markdown-extensions/README.md @@ -0,0 +1,3 @@ +# Markdown Notebook Math support + +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. diff --git a/extensions/notebook-markdown-extensions/icon.png b/extensions/notebook-markdown-extensions/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3f5075881f41c86917b69a4264c4bbbd548149 GIT binary patch literal 903 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xB0oAoIF#H0kf5E^|YQVtoDuIE)Y6b&?c)^@qfi^&ikN}?$S0Ifa2nY!5-@pI= z|NliLB`&UR7cO30xM&e8JBNyz`uh(bnwnb<9y};2E^cCGmYkA0Y4YR;4<3lxrEUQl z%2g8N7tA2gaK7OEe1-n|2^%Nw1&T5zdAqyte%q4x706*P@$_|Nf5gouqAOl&x+(!E z{ngXOF{I+w+gX|AO$Gw4cMBZdCu>H3`2YWW)P@-e3ZW*K=k5FLJ8h=64HLW3Y(}6V zAn-%?jQD92snbXI+^?UyB+xS~?|-S(+^wJg2Q#io-r%XiGRaqcgRkq2GN#?nzW;NW zXz^xt+it%FqFvYiCtWCe!x`YBz`)4iprBG(_%*gU z)n+Hwem!c!Xm|Jh{HcblKPtA@9}Q&PQ9p^-T}2*))M zE(^F9B`P*%3z&LyZgC9JQU4%%lL8s#B4qp<{x5GZFF$w5oLl7HKdX5R zSLGTPb!a@0tj+$!b)~XB_TU|{*UMQp{d<~!LVtmC;afQ!IpGDHrH^Py3vfuSc<$GD zyYI9yFK5N)N7Y-ZLk?)hT-ea?KJRVymYRqIS}~Vr9O!WL3uf7+ASER(A>+#HEA)de zX=*FWCapXFB^$S;3LhwB-0$c*nRS+en26Ym_^sa>XR8#P4EMDcR0w7JWv@9Qa_+JB zthUWT7rj|>n9P-J@BRPF)YquQ$e8`+ii*+&-p*MqEbG`TJ2_24c{sUZ+FU+2T`&2^ zrS)OfI#Yv+U@l;YKFH_fsM{s_ze4xl&$t?<<{u(_KRtCmU9NbdZUl=wfyct?)fdH_ zH*N-{SJe{Nh?11Vl2ohYqEsNoU}Ruup=)TUYhV^)WME}tYGq`sZD3$!VDPN=)IJmq zx%nxXX_dG&Ojjsk0&0*1*$|wcR#Ki=l*-_klAn~S;F+74o*I;zm{M7IG8L3N7(8A5 KT-G@yGywoo$w+tr literal 0 HcmV?d00001 diff --git a/extensions/notebook-markdown-extensions/notebook-out/emoji.js b/extensions/notebook-markdown-extensions/notebook-out/emoji.js new file mode 100644 index 00000000..c1e27678 --- /dev/null +++ b/extensions/notebook-markdown-extensions/notebook-out/emoji.js @@ -0,0 +1 @@ +!function(a){var e={};function n(o){if(e[o])return e[o].exports;var i=e[o]={i:o,l:!1,exports:{}};return a[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=a,n.c=e,n.d=function(a,e,o){n.o(a,e)||Object.defineProperty(a,e,{enumerable:!0,get:o})},n.r=function(a){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},n.t=function(a,e){if(1&e&&(a=n(a)),8&e)return a;if(4&e&&"object"==typeof a&&a&&a.__esModule)return a;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:a}),2&e&&"string"!=typeof a)for(var i in a)n.d(o,i,function(e){return a[e]}.bind(null,i));return o},n.n=function(a){var e=a&&a.__esModule?function(){return a.default}:function(){return a};return n.d(e,"a",e),e},n.o=function(a,e){return Object.prototype.hasOwnProperty.call(a,e)},n.p="",n(n.s=68)}({68:function(a,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),function(){if("undefined"!=typeof extendMarkdownIt){const a=n(69);extendMarkdownIt(e=>{e.use(a)})}}()},69:function(a,e,n){"use strict";var o=n(70),i=n(71),r=n(72);a.exports=function(a,e){var n={defs:o,shortcuts:i,enabled:[]},_=a.utils.assign({},n,e||{});r(a,_)}},70:function(a){a.exports=JSON.parse('{"100":"💯","1234":"🔢","grinning":"😀","smiley":"😃","smile":"😄","grin":"😁","laughing":"😆","satisfied":"😆","sweat_smile":"😅","rofl":"🤣","joy":"😂","slightly_smiling_face":"🙂","upside_down_face":"🙃","wink":"😉","blush":"😊","innocent":"😇","smiling_face_with_three_hearts":"🥰","heart_eyes":"😍","star_struck":"🤩","kissing_heart":"😘","kissing":"😗","relaxed":"☺️","kissing_closed_eyes":"😚","kissing_smiling_eyes":"😙","smiling_face_with_tear":"🥲","yum":"😋","stuck_out_tongue":"😛","stuck_out_tongue_winking_eye":"😜","zany_face":"🤪","stuck_out_tongue_closed_eyes":"😝","money_mouth_face":"🤑","hugs":"🤗","hand_over_mouth":"🤭","shushing_face":"🤫","thinking":"🤔","zipper_mouth_face":"🤐","raised_eyebrow":"🤨","neutral_face":"😐","expressionless":"😑","no_mouth":"😶","smirk":"😏","unamused":"😒","roll_eyes":"🙄","grimacing":"😬","lying_face":"🤥","relieved":"😌","pensive":"😔","sleepy":"😪","drooling_face":"🤤","sleeping":"😴","mask":"😷","face_with_thermometer":"🤒","face_with_head_bandage":"🤕","nauseated_face":"🤢","vomiting_face":"🤮","sneezing_face":"🤧","hot_face":"🥵","cold_face":"🥶","woozy_face":"🥴","dizzy_face":"😵","exploding_head":"🤯","cowboy_hat_face":"🤠","partying_face":"🥳","disguised_face":"🥸","sunglasses":"😎","nerd_face":"🤓","monocle_face":"🧐","confused":"😕","worried":"😟","slightly_frowning_face":"🙁","frowning_face":"☹️","open_mouth":"😮","hushed":"😯","astonished":"😲","flushed":"😳","pleading_face":"🥺","frowning":"😦","anguished":"😧","fearful":"😨","cold_sweat":"😰","disappointed_relieved":"😥","cry":"😢","sob":"😭","scream":"😱","confounded":"😖","persevere":"😣","disappointed":"😞","sweat":"😓","weary":"😩","tired_face":"😫","yawning_face":"🥱","triumph":"😤","rage":"😡","pout":"😡","angry":"😠","cursing_face":"🤬","smiling_imp":"😈","imp":"👿","skull":"💀","skull_and_crossbones":"☠️","hankey":"💩","poop":"💩","shit":"💩","clown_face":"🤡","japanese_ogre":"👹","japanese_goblin":"👺","ghost":"👻","alien":"👽","space_invader":"👾","robot":"🤖","smiley_cat":"😺","smile_cat":"😸","joy_cat":"😹","heart_eyes_cat":"😻","smirk_cat":"😼","kissing_cat":"😽","scream_cat":"🙀","crying_cat_face":"😿","pouting_cat":"😾","see_no_evil":"🙈","hear_no_evil":"🙉","speak_no_evil":"🙊","kiss":"💋","love_letter":"💌","cupid":"💘","gift_heart":"💝","sparkling_heart":"💖","heartpulse":"💗","heartbeat":"💓","revolving_hearts":"💞","two_hearts":"💕","heart_decoration":"💟","heavy_heart_exclamation":"❣️","broken_heart":"💔","heart":"❤️","orange_heart":"🧡","yellow_heart":"💛","green_heart":"💚","blue_heart":"💙","purple_heart":"💜","brown_heart":"🤎","black_heart":"🖤","white_heart":"🤍","anger":"💢","boom":"💥","collision":"💥","dizzy":"💫","sweat_drops":"💦","dash":"💨","hole":"🕳️","bomb":"💣","speech_balloon":"💬","eye_speech_bubble":"👁️‍🗨️","left_speech_bubble":"🗨️","right_anger_bubble":"🗯️","thought_balloon":"💭","zzz":"💤","wave":"👋","raised_back_of_hand":"🤚","raised_hand_with_fingers_splayed":"🖐️","hand":"✋","raised_hand":"✋","vulcan_salute":"🖖","ok_hand":"👌","pinched_fingers":"🤌","pinching_hand":"🤏","v":"✌️","crossed_fingers":"🤞","love_you_gesture":"🤟","metal":"🤘","call_me_hand":"🤙","point_left":"👈","point_right":"👉","point_up_2":"👆","middle_finger":"🖕","fu":"🖕","point_down":"👇","point_up":"☝️","+1":"👍","thumbsup":"👍","-1":"👎","thumbsdown":"👎","fist_raised":"✊","fist":"✊","fist_oncoming":"👊","facepunch":"👊","punch":"👊","fist_left":"🤛","fist_right":"🤜","clap":"👏","raised_hands":"🙌","open_hands":"👐","palms_up_together":"🤲","handshake":"🤝","pray":"🙏","writing_hand":"✍️","nail_care":"💅","selfie":"🤳","muscle":"💪","mechanical_arm":"🦾","mechanical_leg":"🦿","leg":"🦵","foot":"🦶","ear":"👂","ear_with_hearing_aid":"🦻","nose":"👃","brain":"🧠","anatomical_heart":"🫀","lungs":"🫁","tooth":"🦷","bone":"🦴","eyes":"👀","eye":"👁️","tongue":"👅","lips":"👄","baby":"👶","child":"🧒","boy":"👦","girl":"👧","adult":"🧑","blond_haired_person":"👱","man":"👨","bearded_person":"🧔","red_haired_man":"👨‍🦰","curly_haired_man":"👨‍🦱","white_haired_man":"👨‍🦳","bald_man":"👨‍🦲","woman":"👩","red_haired_woman":"👩‍🦰","person_red_hair":"🧑‍🦰","curly_haired_woman":"👩‍🦱","person_curly_hair":"🧑‍🦱","white_haired_woman":"👩‍🦳","person_white_hair":"🧑‍🦳","bald_woman":"👩‍🦲","person_bald":"🧑‍🦲","blond_haired_woman":"👱‍♀️","blonde_woman":"👱‍♀️","blond_haired_man":"👱‍♂️","older_adult":"🧓","older_man":"👴","older_woman":"👵","frowning_person":"🙍","frowning_man":"🙍‍♂️","frowning_woman":"🙍‍♀️","pouting_face":"🙎","pouting_man":"🙎‍♂️","pouting_woman":"🙎‍♀️","no_good":"🙅","no_good_man":"🙅‍♂️","ng_man":"🙅‍♂️","no_good_woman":"🙅‍♀️","ng_woman":"🙅‍♀️","ok_person":"🙆","ok_man":"🙆‍♂️","ok_woman":"🙆‍♀️","tipping_hand_person":"💁","information_desk_person":"💁","tipping_hand_man":"💁‍♂️","sassy_man":"💁‍♂️","tipping_hand_woman":"💁‍♀️","sassy_woman":"💁‍♀️","raising_hand":"🙋","raising_hand_man":"🙋‍♂️","raising_hand_woman":"🙋‍♀️","deaf_person":"🧏","deaf_man":"🧏‍♂️","deaf_woman":"🧏‍♀️","bow":"🙇","bowing_man":"🙇‍♂️","bowing_woman":"🙇‍♀️","facepalm":"🤦","man_facepalming":"🤦‍♂️","woman_facepalming":"🤦‍♀️","shrug":"🤷","man_shrugging":"🤷‍♂️","woman_shrugging":"🤷‍♀️","health_worker":"🧑‍⚕️","man_health_worker":"👨‍⚕️","woman_health_worker":"👩‍⚕️","student":"🧑‍🎓","man_student":"👨‍🎓","woman_student":"👩‍🎓","teacher":"🧑‍🏫","man_teacher":"👨‍🏫","woman_teacher":"👩‍🏫","judge":"🧑‍⚖️","man_judge":"👨‍⚖️","woman_judge":"👩‍⚖️","farmer":"🧑‍🌾","man_farmer":"👨‍🌾","woman_farmer":"👩‍🌾","cook":"🧑‍🍳","man_cook":"👨‍🍳","woman_cook":"👩‍🍳","mechanic":"🧑‍🔧","man_mechanic":"👨‍🔧","woman_mechanic":"👩‍🔧","factory_worker":"🧑‍🏭","man_factory_worker":"👨‍🏭","woman_factory_worker":"👩‍🏭","office_worker":"🧑‍💼","man_office_worker":"👨‍💼","woman_office_worker":"👩‍💼","scientist":"🧑‍🔬","man_scientist":"👨‍🔬","woman_scientist":"👩‍🔬","technologist":"🧑‍💻","man_technologist":"👨‍💻","woman_technologist":"👩‍💻","singer":"🧑‍🎤","man_singer":"👨‍🎤","woman_singer":"👩‍🎤","artist":"🧑‍🎨","man_artist":"👨‍🎨","woman_artist":"👩‍🎨","pilot":"🧑‍✈️","man_pilot":"👨‍✈️","woman_pilot":"👩‍✈️","astronaut":"🧑‍🚀","man_astronaut":"👨‍🚀","woman_astronaut":"👩‍🚀","firefighter":"🧑‍🚒","man_firefighter":"👨‍🚒","woman_firefighter":"👩‍🚒","police_officer":"👮","cop":"👮","policeman":"👮‍♂️","policewoman":"👮‍♀️","detective":"🕵️","male_detective":"🕵️‍♂️","female_detective":"🕵️‍♀️","guard":"💂","guardsman":"💂‍♂️","guardswoman":"💂‍♀️","ninja":"🥷","construction_worker":"👷","construction_worker_man":"👷‍♂️","construction_worker_woman":"👷‍♀️","prince":"🤴","princess":"👸","person_with_turban":"👳","man_with_turban":"👳‍♂️","woman_with_turban":"👳‍♀️","man_with_gua_pi_mao":"👲","woman_with_headscarf":"🧕","person_in_tuxedo":"🤵","man_in_tuxedo":"🤵‍♂️","woman_in_tuxedo":"🤵‍♀️","person_with_veil":"👰","man_with_veil":"👰‍♂️","woman_with_veil":"👰‍♀️","bride_with_veil":"👰‍♀️","pregnant_woman":"🤰","breast_feeding":"🤱","woman_feeding_baby":"👩‍🍼","man_feeding_baby":"👨‍🍼","person_feeding_baby":"🧑‍🍼","angel":"👼","santa":"🎅","mrs_claus":"🤶","mx_claus":"🧑‍🎄","superhero":"🦸","superhero_man":"🦸‍♂️","superhero_woman":"🦸‍♀️","supervillain":"🦹","supervillain_man":"🦹‍♂️","supervillain_woman":"🦹‍♀️","mage":"🧙","mage_man":"🧙‍♂️","mage_woman":"🧙‍♀️","fairy":"🧚","fairy_man":"🧚‍♂️","fairy_woman":"🧚‍♀️","vampire":"🧛","vampire_man":"🧛‍♂️","vampire_woman":"🧛‍♀️","merperson":"🧜","merman":"🧜‍♂️","mermaid":"🧜‍♀️","elf":"🧝","elf_man":"🧝‍♂️","elf_woman":"🧝‍♀️","genie":"🧞","genie_man":"🧞‍♂️","genie_woman":"🧞‍♀️","zombie":"🧟","zombie_man":"🧟‍♂️","zombie_woman":"🧟‍♀️","massage":"💆","massage_man":"💆‍♂️","massage_woman":"💆‍♀️","haircut":"💇","haircut_man":"💇‍♂️","haircut_woman":"💇‍♀️","walking":"🚶","walking_man":"🚶‍♂️","walking_woman":"🚶‍♀️","standing_person":"🧍","standing_man":"🧍‍♂️","standing_woman":"🧍‍♀️","kneeling_person":"🧎","kneeling_man":"🧎‍♂️","kneeling_woman":"🧎‍♀️","person_with_probing_cane":"🧑‍🦯","man_with_probing_cane":"👨‍🦯","woman_with_probing_cane":"👩‍🦯","person_in_motorized_wheelchair":"🧑‍🦼","man_in_motorized_wheelchair":"👨‍🦼","woman_in_motorized_wheelchair":"👩‍🦼","person_in_manual_wheelchair":"🧑‍🦽","man_in_manual_wheelchair":"👨‍🦽","woman_in_manual_wheelchair":"👩‍🦽","runner":"🏃","running":"🏃","running_man":"🏃‍♂️","running_woman":"🏃‍♀️","woman_dancing":"💃","dancer":"💃","man_dancing":"🕺","business_suit_levitating":"🕴️","dancers":"👯","dancing_men":"👯‍♂️","dancing_women":"👯‍♀️","sauna_person":"🧖","sauna_man":"🧖‍♂️","sauna_woman":"🧖‍♀️","climbing":"🧗","climbing_man":"🧗‍♂️","climbing_woman":"🧗‍♀️","person_fencing":"🤺","horse_racing":"🏇","skier":"⛷️","snowboarder":"🏂","golfing":"🏌️","golfing_man":"🏌️‍♂️","golfing_woman":"🏌️‍♀️","surfer":"🏄","surfing_man":"🏄‍♂️","surfing_woman":"🏄‍♀️","rowboat":"🚣","rowing_man":"🚣‍♂️","rowing_woman":"🚣‍♀️","swimmer":"🏊","swimming_man":"🏊‍♂️","swimming_woman":"🏊‍♀️","bouncing_ball_person":"⛹️","bouncing_ball_man":"⛹️‍♂️","basketball_man":"⛹️‍♂️","bouncing_ball_woman":"⛹️‍♀️","basketball_woman":"⛹️‍♀️","weight_lifting":"🏋️","weight_lifting_man":"🏋️‍♂️","weight_lifting_woman":"🏋️‍♀️","bicyclist":"🚴","biking_man":"🚴‍♂️","biking_woman":"🚴‍♀️","mountain_bicyclist":"🚵","mountain_biking_man":"🚵‍♂️","mountain_biking_woman":"🚵‍♀️","cartwheeling":"🤸","man_cartwheeling":"🤸‍♂️","woman_cartwheeling":"🤸‍♀️","wrestling":"🤼","men_wrestling":"🤼‍♂️","women_wrestling":"🤼‍♀️","water_polo":"🤽","man_playing_water_polo":"🤽‍♂️","woman_playing_water_polo":"🤽‍♀️","handball_person":"🤾","man_playing_handball":"🤾‍♂️","woman_playing_handball":"🤾‍♀️","juggling_person":"🤹","man_juggling":"🤹‍♂️","woman_juggling":"🤹‍♀️","lotus_position":"🧘","lotus_position_man":"🧘‍♂️","lotus_position_woman":"🧘‍♀️","bath":"🛀","sleeping_bed":"🛌","people_holding_hands":"🧑‍🤝‍🧑","two_women_holding_hands":"👭","couple":"👫","two_men_holding_hands":"👬","couplekiss":"💏","couplekiss_man_woman":"👩‍❤️‍💋‍👨","couplekiss_man_man":"👨‍❤️‍💋‍👨","couplekiss_woman_woman":"👩‍❤️‍💋‍👩","couple_with_heart":"💑","couple_with_heart_woman_man":"👩‍❤️‍👨","couple_with_heart_man_man":"👨‍❤️‍👨","couple_with_heart_woman_woman":"👩‍❤️‍👩","family":"👪","family_man_woman_boy":"👨‍👩‍👦","family_man_woman_girl":"👨‍👩‍👧","family_man_woman_girl_boy":"👨‍👩‍👧‍👦","family_man_woman_boy_boy":"👨‍👩‍👦‍👦","family_man_woman_girl_girl":"👨‍👩‍👧‍👧","family_man_man_boy":"👨‍👨‍👦","family_man_man_girl":"👨‍👨‍👧","family_man_man_girl_boy":"👨‍👨‍👧‍👦","family_man_man_boy_boy":"👨‍👨‍👦‍👦","family_man_man_girl_girl":"👨‍👨‍👧‍👧","family_woman_woman_boy":"👩‍👩‍👦","family_woman_woman_girl":"👩‍👩‍👧","family_woman_woman_girl_boy":"👩‍👩‍👧‍👦","family_woman_woman_boy_boy":"👩‍👩‍👦‍👦","family_woman_woman_girl_girl":"👩‍👩‍👧‍👧","family_man_boy":"👨‍👦","family_man_boy_boy":"👨‍👦‍👦","family_man_girl":"👨‍👧","family_man_girl_boy":"👨‍👧‍👦","family_man_girl_girl":"👨‍👧‍👧","family_woman_boy":"👩‍👦","family_woman_boy_boy":"👩‍👦‍👦","family_woman_girl":"👩‍👧","family_woman_girl_boy":"👩‍👧‍👦","family_woman_girl_girl":"👩‍👧‍👧","speaking_head":"🗣️","bust_in_silhouette":"👤","busts_in_silhouette":"👥","people_hugging":"🫂","footprints":"👣","monkey_face":"🐵","monkey":"🐒","gorilla":"🦍","orangutan":"🦧","dog":"🐶","dog2":"🐕","guide_dog":"🦮","service_dog":"🐕‍🦺","poodle":"🐩","wolf":"🐺","fox_face":"🦊","raccoon":"🦝","cat":"🐱","cat2":"🐈","black_cat":"🐈‍⬛","lion":"🦁","tiger":"🐯","tiger2":"🐅","leopard":"🐆","horse":"🐴","racehorse":"🐎","unicorn":"🦄","zebra":"🦓","deer":"🦌","bison":"🦬","cow":"🐮","ox":"🐂","water_buffalo":"🐃","cow2":"🐄","pig":"🐷","pig2":"🐖","boar":"🐗","pig_nose":"🐽","ram":"🐏","sheep":"🐑","goat":"🐐","dromedary_camel":"🐪","camel":"🐫","llama":"🦙","giraffe":"🦒","elephant":"🐘","mammoth":"🦣","rhinoceros":"🦏","hippopotamus":"🦛","mouse":"🐭","mouse2":"🐁","rat":"🐀","hamster":"🐹","rabbit":"🐰","rabbit2":"🐇","chipmunk":"🐿️","beaver":"🦫","hedgehog":"🦔","bat":"🦇","bear":"🐻","polar_bear":"🐻‍❄️","koala":"🐨","panda_face":"🐼","sloth":"🦥","otter":"🦦","skunk":"🦨","kangaroo":"🦘","badger":"🦡","feet":"🐾","paw_prints":"🐾","turkey":"🦃","chicken":"🐔","rooster":"🐓","hatching_chick":"🐣","baby_chick":"🐤","hatched_chick":"🐥","bird":"🐦","penguin":"🐧","dove":"🕊️","eagle":"🦅","duck":"🦆","swan":"🦢","owl":"🦉","dodo":"🦤","feather":"🪶","flamingo":"🦩","peacock":"🦚","parrot":"🦜","frog":"🐸","crocodile":"🐊","turtle":"🐢","lizard":"🦎","snake":"🐍","dragon_face":"🐲","dragon":"🐉","sauropod":"🦕","t-rex":"🦖","whale":"🐳","whale2":"🐋","dolphin":"🐬","flipper":"🐬","seal":"🦭","fish":"🐟","tropical_fish":"🐠","blowfish":"🐡","shark":"🦈","octopus":"🐙","shell":"🐚","snail":"🐌","butterfly":"🦋","bug":"🐛","ant":"🐜","bee":"🐝","honeybee":"🐝","beetle":"🪲","lady_beetle":"🐞","cricket":"🦗","cockroach":"🪳","spider":"🕷️","spider_web":"🕸️","scorpion":"🦂","mosquito":"🦟","fly":"🪰","worm":"🪱","microbe":"🦠","bouquet":"💐","cherry_blossom":"🌸","white_flower":"💮","rosette":"🏵️","rose":"🌹","wilted_flower":"🥀","hibiscus":"🌺","sunflower":"🌻","blossom":"🌼","tulip":"🌷","seedling":"🌱","potted_plant":"🪴","evergreen_tree":"🌲","deciduous_tree":"🌳","palm_tree":"🌴","cactus":"🌵","ear_of_rice":"🌾","herb":"🌿","shamrock":"☘️","four_leaf_clover":"🍀","maple_leaf":"🍁","fallen_leaf":"🍂","leaves":"🍃","grapes":"🍇","melon":"🍈","watermelon":"🍉","tangerine":"🍊","orange":"🍊","mandarin":"🍊","lemon":"🍋","banana":"🍌","pineapple":"🍍","mango":"🥭","apple":"🍎","green_apple":"🍏","pear":"🍐","peach":"🍑","cherries":"🍒","strawberry":"🍓","blueberries":"🫐","kiwi_fruit":"🥝","tomato":"🍅","olive":"🫒","coconut":"🥥","avocado":"🥑","eggplant":"🍆","potato":"🥔","carrot":"🥕","corn":"🌽","hot_pepper":"🌶️","bell_pepper":"🫑","cucumber":"🥒","leafy_green":"🥬","broccoli":"🥦","garlic":"🧄","onion":"🧅","mushroom":"🍄","peanuts":"🥜","chestnut":"🌰","bread":"🍞","croissant":"🥐","baguette_bread":"🥖","flatbread":"🫓","pretzel":"🥨","bagel":"🥯","pancakes":"🥞","waffle":"🧇","cheese":"🧀","meat_on_bone":"🍖","poultry_leg":"🍗","cut_of_meat":"🥩","bacon":"🥓","hamburger":"🍔","fries":"🍟","pizza":"🍕","hotdog":"🌭","sandwich":"🥪","taco":"🌮","burrito":"🌯","tamale":"🫔","stuffed_flatbread":"🥙","falafel":"🧆","egg":"🥚","fried_egg":"🍳","shallow_pan_of_food":"🥘","stew":"🍲","fondue":"🫕","bowl_with_spoon":"🥣","green_salad":"🥗","popcorn":"🍿","butter":"🧈","salt":"🧂","canned_food":"🥫","bento":"🍱","rice_cracker":"🍘","rice_ball":"🍙","rice":"🍚","curry":"🍛","ramen":"🍜","spaghetti":"🍝","sweet_potato":"🍠","oden":"🍢","sushi":"🍣","fried_shrimp":"🍤","fish_cake":"🍥","moon_cake":"🥮","dango":"🍡","dumpling":"🥟","fortune_cookie":"🥠","takeout_box":"🥡","crab":"🦀","lobster":"🦞","shrimp":"🦐","squid":"🦑","oyster":"🦪","icecream":"🍦","shaved_ice":"🍧","ice_cream":"🍨","doughnut":"🍩","cookie":"🍪","birthday":"🎂","cake":"🍰","cupcake":"🧁","pie":"🥧","chocolate_bar":"🍫","candy":"🍬","lollipop":"🍭","custard":"🍮","honey_pot":"🍯","baby_bottle":"🍼","milk_glass":"🥛","coffee":"☕","teapot":"🫖","tea":"🍵","sake":"🍶","champagne":"🍾","wine_glass":"🍷","cocktail":"🍸","tropical_drink":"🍹","beer":"🍺","beers":"🍻","clinking_glasses":"🥂","tumbler_glass":"🥃","cup_with_straw":"🥤","bubble_tea":"🧋","beverage_box":"🧃","mate":"🧉","ice_cube":"🧊","chopsticks":"🥢","plate_with_cutlery":"🍽️","fork_and_knife":"🍴","spoon":"🥄","hocho":"🔪","knife":"🔪","amphora":"🏺","earth_africa":"🌍","earth_americas":"🌎","earth_asia":"🌏","globe_with_meridians":"🌐","world_map":"🗺️","japan":"🗾","compass":"🧭","mountain_snow":"🏔️","mountain":"⛰️","volcano":"🌋","mount_fuji":"🗻","camping":"🏕️","beach_umbrella":"🏖️","desert":"🏜️","desert_island":"🏝️","national_park":"🏞️","stadium":"🏟️","classical_building":"🏛️","building_construction":"🏗️","bricks":"🧱","rock":"🪨","wood":"🪵","hut":"🛖","houses":"🏘️","derelict_house":"🏚️","house":"🏠","house_with_garden":"🏡","office":"🏢","post_office":"🏣","european_post_office":"🏤","hospital":"🏥","bank":"🏦","hotel":"🏨","love_hotel":"🏩","convenience_store":"🏪","school":"🏫","department_store":"🏬","factory":"🏭","japanese_castle":"🏯","european_castle":"🏰","wedding":"💒","tokyo_tower":"🗼","statue_of_liberty":"🗽","church":"⛪","mosque":"🕌","hindu_temple":"🛕","synagogue":"🕍","shinto_shrine":"⛩️","kaaba":"🕋","fountain":"⛲","tent":"⛺","foggy":"🌁","night_with_stars":"🌃","cityscape":"🏙️","sunrise_over_mountains":"🌄","sunrise":"🌅","city_sunset":"🌆","city_sunrise":"🌇","bridge_at_night":"🌉","hotsprings":"♨️","carousel_horse":"🎠","ferris_wheel":"🎡","roller_coaster":"🎢","barber":"💈","circus_tent":"🎪","steam_locomotive":"🚂","railway_car":"🚃","bullettrain_side":"🚄","bullettrain_front":"🚅","train2":"🚆","metro":"🚇","light_rail":"🚈","station":"🚉","tram":"🚊","monorail":"🚝","mountain_railway":"🚞","train":"🚋","bus":"🚌","oncoming_bus":"🚍","trolleybus":"🚎","minibus":"🚐","ambulance":"🚑","fire_engine":"🚒","police_car":"🚓","oncoming_police_car":"🚔","taxi":"🚕","oncoming_taxi":"🚖","car":"🚗","red_car":"🚗","oncoming_automobile":"🚘","blue_car":"🚙","pickup_truck":"🛻","truck":"🚚","articulated_lorry":"🚛","tractor":"🚜","racing_car":"🏎️","motorcycle":"🏍️","motor_scooter":"🛵","manual_wheelchair":"🦽","motorized_wheelchair":"🦼","auto_rickshaw":"🛺","bike":"🚲","kick_scooter":"🛴","skateboard":"🛹","roller_skate":"🛼","busstop":"🚏","motorway":"🛣️","railway_track":"🛤️","oil_drum":"🛢️","fuelpump":"⛽","rotating_light":"🚨","traffic_light":"🚥","vertical_traffic_light":"🚦","stop_sign":"🛑","construction":"🚧","anchor":"⚓","boat":"⛵","sailboat":"⛵","canoe":"🛶","speedboat":"🚤","passenger_ship":"🛳️","ferry":"⛴️","motor_boat":"🛥️","ship":"🚢","airplane":"✈️","small_airplane":"🛩️","flight_departure":"🛫","flight_arrival":"🛬","parachute":"🪂","seat":"💺","helicopter":"🚁","suspension_railway":"🚟","mountain_cableway":"🚠","aerial_tramway":"🚡","artificial_satellite":"🛰️","rocket":"🚀","flying_saucer":"🛸","bellhop_bell":"🛎️","luggage":"🧳","hourglass":"⌛","hourglass_flowing_sand":"⏳","watch":"⌚","alarm_clock":"⏰","stopwatch":"⏱️","timer_clock":"⏲️","mantelpiece_clock":"🕰️","clock12":"🕛","clock1230":"🕧","clock1":"🕐","clock130":"🕜","clock2":"🕑","clock230":"🕝","clock3":"🕒","clock330":"🕞","clock4":"🕓","clock430":"🕟","clock5":"🕔","clock530":"🕠","clock6":"🕕","clock630":"🕡","clock7":"🕖","clock730":"🕢","clock8":"🕗","clock830":"🕣","clock9":"🕘","clock930":"🕤","clock10":"🕙","clock1030":"🕥","clock11":"🕚","clock1130":"🕦","new_moon":"🌑","waxing_crescent_moon":"🌒","first_quarter_moon":"🌓","moon":"🌔","waxing_gibbous_moon":"🌔","full_moon":"🌕","waning_gibbous_moon":"🌖","last_quarter_moon":"🌗","waning_crescent_moon":"🌘","crescent_moon":"🌙","new_moon_with_face":"🌚","first_quarter_moon_with_face":"🌛","last_quarter_moon_with_face":"🌜","thermometer":"🌡️","sunny":"☀️","full_moon_with_face":"🌝","sun_with_face":"🌞","ringed_planet":"🪐","star":"⭐","star2":"🌟","stars":"🌠","milky_way":"🌌","cloud":"☁️","partly_sunny":"⛅","cloud_with_lightning_and_rain":"⛈️","sun_behind_small_cloud":"🌤️","sun_behind_large_cloud":"🌥️","sun_behind_rain_cloud":"🌦️","cloud_with_rain":"🌧️","cloud_with_snow":"🌨️","cloud_with_lightning":"🌩️","tornado":"🌪️","fog":"🌫️","wind_face":"🌬️","cyclone":"🌀","rainbow":"🌈","closed_umbrella":"🌂","open_umbrella":"☂️","umbrella":"☔","parasol_on_ground":"⛱️","zap":"⚡","snowflake":"❄️","snowman_with_snow":"☃️","snowman":"⛄","comet":"☄️","fire":"🔥","droplet":"💧","ocean":"🌊","jack_o_lantern":"🎃","christmas_tree":"🎄","fireworks":"🎆","sparkler":"🎇","firecracker":"🧨","sparkles":"✨","balloon":"🎈","tada":"🎉","confetti_ball":"🎊","tanabata_tree":"🎋","bamboo":"🎍","dolls":"🎎","flags":"🎏","wind_chime":"🎐","rice_scene":"🎑","red_envelope":"🧧","ribbon":"🎀","gift":"🎁","reminder_ribbon":"🎗️","tickets":"🎟️","ticket":"🎫","medal_military":"🎖️","trophy":"🏆","medal_sports":"🏅","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","soccer":"⚽","baseball":"⚾","softball":"🥎","basketball":"🏀","volleyball":"🏐","football":"🏈","rugby_football":"🏉","tennis":"🎾","flying_disc":"🥏","bowling":"🎳","cricket_game":"🏏","field_hockey":"🏑","ice_hockey":"🏒","lacrosse":"🥍","ping_pong":"🏓","badminton":"🏸","boxing_glove":"🥊","martial_arts_uniform":"🥋","goal_net":"🥅","golf":"⛳","ice_skate":"⛸️","fishing_pole_and_fish":"🎣","diving_mask":"🤿","running_shirt_with_sash":"🎽","ski":"🎿","sled":"🛷","curling_stone":"🥌","dart":"🎯","yo_yo":"🪀","kite":"🪁","8ball":"🎱","crystal_ball":"🔮","magic_wand":"🪄","nazar_amulet":"🧿","video_game":"🎮","joystick":"🕹️","slot_machine":"🎰","game_die":"🎲","jigsaw":"🧩","teddy_bear":"🧸","pinata":"🪅","nesting_dolls":"🪆","spades":"♠️","hearts":"♥️","diamonds":"♦️","clubs":"♣️","chess_pawn":"♟️","black_joker":"🃏","mahjong":"🀄","flower_playing_cards":"🎴","performing_arts":"🎭","framed_picture":"🖼️","art":"🎨","thread":"🧵","sewing_needle":"🪡","yarn":"🧶","knot":"🪢","eyeglasses":"👓","dark_sunglasses":"🕶️","goggles":"🥽","lab_coat":"🥼","safety_vest":"🦺","necktie":"👔","shirt":"👕","tshirt":"👕","jeans":"👖","scarf":"🧣","gloves":"🧤","coat":"🧥","socks":"🧦","dress":"👗","kimono":"👘","sari":"🥻","one_piece_swimsuit":"🩱","swim_brief":"🩲","shorts":"🩳","bikini":"👙","womans_clothes":"👚","purse":"👛","handbag":"👜","pouch":"👝","shopping":"🛍️","school_satchel":"🎒","thong_sandal":"🩴","mans_shoe":"👞","shoe":"👞","athletic_shoe":"👟","hiking_boot":"🥾","flat_shoe":"🥿","high_heel":"👠","sandal":"👡","ballet_shoes":"🩰","boot":"👢","crown":"👑","womans_hat":"👒","tophat":"🎩","mortar_board":"🎓","billed_cap":"🧢","military_helmet":"🪖","rescue_worker_helmet":"⛑️","prayer_beads":"📿","lipstick":"💄","ring":"💍","gem":"💎","mute":"🔇","speaker":"🔈","sound":"🔉","loud_sound":"🔊","loudspeaker":"📢","mega":"📣","postal_horn":"📯","bell":"🔔","no_bell":"🔕","musical_score":"🎼","musical_note":"🎵","notes":"🎶","studio_microphone":"🎙️","level_slider":"🎚️","control_knobs":"🎛️","microphone":"🎤","headphones":"🎧","radio":"📻","saxophone":"🎷","accordion":"🪗","guitar":"🎸","musical_keyboard":"🎹","trumpet":"🎺","violin":"🎻","banjo":"🪕","drum":"🥁","long_drum":"🪘","iphone":"📱","calling":"📲","phone":"☎️","telephone":"☎️","telephone_receiver":"📞","pager":"📟","fax":"📠","battery":"🔋","electric_plug":"🔌","computer":"💻","desktop_computer":"🖥️","printer":"🖨️","keyboard":"⌨️","computer_mouse":"🖱️","trackball":"🖲️","minidisc":"💽","floppy_disk":"💾","cd":"💿","dvd":"📀","abacus":"🧮","movie_camera":"🎥","film_strip":"🎞️","film_projector":"📽️","clapper":"🎬","tv":"📺","camera":"📷","camera_flash":"📸","video_camera":"📹","vhs":"📼","mag":"🔍","mag_right":"🔎","candle":"🕯️","bulb":"💡","flashlight":"🔦","izakaya_lantern":"🏮","lantern":"🏮","diya_lamp":"🪔","notebook_with_decorative_cover":"📔","closed_book":"📕","book":"📖","open_book":"📖","green_book":"📗","blue_book":"📘","orange_book":"📙","books":"📚","notebook":"📓","ledger":"📒","page_with_curl":"📃","scroll":"📜","page_facing_up":"📄","newspaper":"📰","newspaper_roll":"🗞️","bookmark_tabs":"📑","bookmark":"🔖","label":"🏷️","moneybag":"💰","coin":"🪙","yen":"💴","dollar":"💵","euro":"💶","pound":"💷","money_with_wings":"💸","credit_card":"💳","receipt":"🧾","chart":"💹","envelope":"✉️","email":"📧","e-mail":"📧","incoming_envelope":"📨","envelope_with_arrow":"📩","outbox_tray":"📤","inbox_tray":"📥","package":"📦","mailbox":"📫","mailbox_closed":"📪","mailbox_with_mail":"📬","mailbox_with_no_mail":"📭","postbox":"📮","ballot_box":"🗳️","pencil2":"✏️","black_nib":"✒️","fountain_pen":"🖋️","pen":"🖊️","paintbrush":"🖌️","crayon":"🖍️","memo":"📝","pencil":"📝","briefcase":"💼","file_folder":"📁","open_file_folder":"📂","card_index_dividers":"🗂️","date":"📅","calendar":"📆","spiral_notepad":"🗒️","spiral_calendar":"🗓️","card_index":"📇","chart_with_upwards_trend":"📈","chart_with_downwards_trend":"📉","bar_chart":"📊","clipboard":"📋","pushpin":"📌","round_pushpin":"📍","paperclip":"📎","paperclips":"🖇️","straight_ruler":"📏","triangular_ruler":"📐","scissors":"✂️","card_file_box":"🗃️","file_cabinet":"🗄️","wastebasket":"🗑️","lock":"🔒","unlock":"🔓","lock_with_ink_pen":"🔏","closed_lock_with_key":"🔐","key":"🔑","old_key":"🗝️","hammer":"🔨","axe":"🪓","pick":"⛏️","hammer_and_pick":"⚒️","hammer_and_wrench":"🛠️","dagger":"🗡️","crossed_swords":"⚔️","gun":"🔫","boomerang":"🪃","bow_and_arrow":"🏹","shield":"🛡️","carpentry_saw":"🪚","wrench":"🔧","screwdriver":"🪛","nut_and_bolt":"🔩","gear":"⚙️","clamp":"🗜️","balance_scale":"⚖️","probing_cane":"🦯","link":"🔗","chains":"⛓️","hook":"🪝","toolbox":"🧰","magnet":"🧲","ladder":"🪜","alembic":"⚗️","test_tube":"🧪","petri_dish":"🧫","dna":"🧬","microscope":"🔬","telescope":"🔭","satellite":"📡","syringe":"💉","drop_of_blood":"🩸","pill":"💊","adhesive_bandage":"🩹","stethoscope":"🩺","door":"🚪","elevator":"🛗","mirror":"🪞","window":"🪟","bed":"🛏️","couch_and_lamp":"🛋️","chair":"🪑","toilet":"🚽","plunger":"🪠","shower":"🚿","bathtub":"🛁","mouse_trap":"🪤","razor":"🪒","lotion_bottle":"🧴","safety_pin":"🧷","broom":"🧹","basket":"🧺","roll_of_paper":"🧻","bucket":"🪣","soap":"🧼","toothbrush":"🪥","sponge":"🧽","fire_extinguisher":"🧯","shopping_cart":"🛒","smoking":"🚬","coffin":"⚰️","headstone":"🪦","funeral_urn":"⚱️","moyai":"🗿","placard":"🪧","atm":"🏧","put_litter_in_its_place":"🚮","potable_water":"🚰","wheelchair":"♿","mens":"🚹","womens":"🚺","restroom":"🚻","baby_symbol":"🚼","wc":"🚾","passport_control":"🛂","customs":"🛃","baggage_claim":"🛄","left_luggage":"🛅","warning":"⚠️","children_crossing":"🚸","no_entry":"⛔","no_entry_sign":"🚫","no_bicycles":"🚳","no_smoking":"🚭","do_not_litter":"🚯","non-potable_water":"🚱","no_pedestrians":"🚷","no_mobile_phones":"📵","underage":"🔞","radioactive":"☢️","biohazard":"☣️","arrow_up":"⬆️","arrow_upper_right":"↗️","arrow_right":"➡️","arrow_lower_right":"↘️","arrow_down":"⬇️","arrow_lower_left":"↙️","arrow_left":"⬅️","arrow_upper_left":"↖️","arrow_up_down":"↕️","left_right_arrow":"↔️","leftwards_arrow_with_hook":"↩️","arrow_right_hook":"↪️","arrow_heading_up":"⤴️","arrow_heading_down":"⤵️","arrows_clockwise":"🔃","arrows_counterclockwise":"🔄","back":"🔙","end":"🔚","on":"🔛","soon":"🔜","top":"🔝","place_of_worship":"🛐","atom_symbol":"⚛️","om":"🕉️","star_of_david":"✡️","wheel_of_dharma":"☸️","yin_yang":"☯️","latin_cross":"✝️","orthodox_cross":"☦️","star_and_crescent":"☪️","peace_symbol":"☮️","menorah":"🕎","six_pointed_star":"🔯","aries":"♈","taurus":"♉","gemini":"♊","cancer":"♋","leo":"♌","virgo":"♍","libra":"♎","scorpius":"♏","sagittarius":"♐","capricorn":"♑","aquarius":"♒","pisces":"♓","ophiuchus":"⛎","twisted_rightwards_arrows":"🔀","repeat":"🔁","repeat_one":"🔂","arrow_forward":"▶️","fast_forward":"⏩","next_track_button":"⏭️","play_or_pause_button":"⏯️","arrow_backward":"◀️","rewind":"⏪","previous_track_button":"⏮️","arrow_up_small":"🔼","arrow_double_up":"⏫","arrow_down_small":"🔽","arrow_double_down":"⏬","pause_button":"⏸️","stop_button":"⏹️","record_button":"⏺️","eject_button":"⏏️","cinema":"🎦","low_brightness":"🔅","high_brightness":"🔆","signal_strength":"📶","vibration_mode":"📳","mobile_phone_off":"📴","female_sign":"♀️","male_sign":"♂️","transgender_symbol":"⚧️","heavy_multiplication_x":"✖️","heavy_plus_sign":"➕","heavy_minus_sign":"➖","heavy_division_sign":"➗","infinity":"♾️","bangbang":"‼️","interrobang":"⁉️","question":"❓","grey_question":"❔","grey_exclamation":"❕","exclamation":"❗","heavy_exclamation_mark":"❗","wavy_dash":"〰️","currency_exchange":"💱","heavy_dollar_sign":"💲","medical_symbol":"⚕️","recycle":"♻️","fleur_de_lis":"⚜️","trident":"🔱","name_badge":"📛","beginner":"🔰","o":"⭕","white_check_mark":"✅","ballot_box_with_check":"☑️","heavy_check_mark":"✔️","x":"❌","negative_squared_cross_mark":"❎","curly_loop":"➰","loop":"➿","part_alternation_mark":"〽️","eight_spoked_asterisk":"✳️","eight_pointed_black_star":"✴️","sparkle":"❇️","copyright":"©️","registered":"®️","tm":"™️","hash":"#️⃣","asterisk":"*️⃣","zero":"0️⃣","one":"1️⃣","two":"2️⃣","three":"3️⃣","four":"4️⃣","five":"5️⃣","six":"6️⃣","seven":"7️⃣","eight":"8️⃣","nine":"9️⃣","keycap_ten":"🔟","capital_abcd":"🔠","abcd":"🔡","symbols":"🔣","abc":"🔤","a":"🅰️","ab":"🆎","b":"🅱️","cl":"🆑","cool":"🆒","free":"🆓","information_source":"ℹ️","id":"🆔","m":"Ⓜ️","new":"🆕","ng":"🆖","o2":"🅾️","ok":"🆗","parking":"🅿️","sos":"🆘","up":"🆙","vs":"🆚","koko":"🈁","sa":"🈂️","ideograph_advantage":"🉐","accept":"🉑","congratulations":"㊗️","secret":"㊙️","u6e80":"🈵","red_circle":"🔴","orange_circle":"🟠","yellow_circle":"🟡","green_circle":"🟢","large_blue_circle":"🔵","purple_circle":"🟣","brown_circle":"🟤","black_circle":"⚫","white_circle":"⚪","red_square":"🟥","orange_square":"🟧","yellow_square":"🟨","green_square":"🟩","blue_square":"🟦","purple_square":"🟪","brown_square":"🟫","black_large_square":"⬛","white_large_square":"⬜","black_medium_square":"◼️","white_medium_square":"◻️","black_medium_small_square":"◾","white_medium_small_square":"◽","black_small_square":"▪️","white_small_square":"▫️","large_orange_diamond":"🔶","large_blue_diamond":"🔷","small_orange_diamond":"🔸","small_blue_diamond":"🔹","small_red_triangle":"🔺","small_red_triangle_down":"🔻","diamond_shape_with_a_dot_inside":"💠","radio_button":"🔘","white_square_button":"🔳","black_square_button":"🔲","checkered_flag":"🏁","triangular_flag_on_post":"🚩","crossed_flags":"🎌","black_flag":"🏴","white_flag":"🏳️","rainbow_flag":"🏳️‍🌈","transgender_flag":"🏳️‍⚧️","pirate_flag":"🏴‍☠️","ascension_island":"🇦🇨","andorra":"🇦🇩","united_arab_emirates":"🇦🇪","afghanistan":"🇦🇫","antigua_barbuda":"🇦🇬","anguilla":"🇦🇮","albania":"🇦🇱","armenia":"🇦🇲","angola":"🇦🇴","antarctica":"🇦🇶","argentina":"🇦🇷","american_samoa":"🇦🇸","austria":"🇦🇹","australia":"🇦🇺","aruba":"🇦🇼","aland_islands":"🇦🇽","azerbaijan":"🇦🇿","bosnia_herzegovina":"🇧🇦","barbados":"🇧🇧","bangladesh":"🇧🇩","belgium":"🇧🇪","burkina_faso":"🇧🇫","bulgaria":"🇧🇬","bahrain":"🇧🇭","burundi":"🇧🇮","benin":"🇧🇯","st_barthelemy":"🇧🇱","bermuda":"🇧🇲","brunei":"🇧🇳","bolivia":"🇧🇴","caribbean_netherlands":"🇧🇶","brazil":"🇧🇷","bahamas":"🇧🇸","bhutan":"🇧🇹","bouvet_island":"🇧🇻","botswana":"🇧🇼","belarus":"🇧🇾","belize":"🇧🇿","canada":"🇨🇦","cocos_islands":"🇨🇨","congo_kinshasa":"🇨🇩","central_african_republic":"🇨🇫","congo_brazzaville":"🇨🇬","switzerland":"🇨🇭","cote_divoire":"🇨🇮","cook_islands":"🇨🇰","chile":"🇨🇱","cameroon":"🇨🇲","cn":"🇨🇳","colombia":"🇨🇴","clipperton_island":"🇨🇵","costa_rica":"🇨🇷","cuba":"🇨🇺","cape_verde":"🇨🇻","curacao":"🇨🇼","christmas_island":"🇨🇽","cyprus":"🇨🇾","czech_republic":"🇨🇿","de":"🇩🇪","diego_garcia":"🇩🇬","djibouti":"🇩🇯","denmark":"🇩🇰","dominica":"🇩🇲","dominican_republic":"🇩🇴","algeria":"🇩🇿","ceuta_melilla":"🇪🇦","ecuador":"🇪🇨","estonia":"🇪🇪","egypt":"🇪🇬","western_sahara":"🇪🇭","eritrea":"🇪🇷","es":"🇪🇸","ethiopia":"🇪🇹","eu":"🇪🇺","european_union":"🇪🇺","finland":"🇫🇮","fiji":"🇫🇯","falkland_islands":"🇫🇰","micronesia":"🇫🇲","faroe_islands":"🇫🇴","fr":"🇫🇷","gabon":"🇬🇦","gb":"🇬🇧","uk":"🇬🇧","grenada":"🇬🇩","georgia":"🇬🇪","french_guiana":"🇬🇫","guernsey":"🇬🇬","ghana":"🇬🇭","gibraltar":"🇬🇮","greenland":"🇬🇱","gambia":"🇬🇲","guinea":"🇬🇳","guadeloupe":"🇬🇵","equatorial_guinea":"🇬🇶","greece":"🇬🇷","south_georgia_south_sandwich_islands":"🇬🇸","guatemala":"🇬🇹","guam":"🇬🇺","guinea_bissau":"🇬🇼","guyana":"🇬🇾","hong_kong":"🇭🇰","heard_mcdonald_islands":"🇭🇲","honduras":"🇭🇳","croatia":"🇭🇷","haiti":"🇭🇹","hungary":"🇭🇺","canary_islands":"🇮🇨","indonesia":"🇮🇩","ireland":"🇮🇪","israel":"🇮🇱","isle_of_man":"🇮🇲","india":"🇮🇳","british_indian_ocean_territory":"🇮🇴","iraq":"🇮🇶","iran":"🇮🇷","iceland":"🇮🇸","it":"🇮🇹","jersey":"🇯🇪","jamaica":"🇯🇲","jordan":"🇯🇴","jp":"🇯🇵","kenya":"🇰🇪","kyrgyzstan":"🇰🇬","cambodia":"🇰🇭","kiribati":"🇰🇮","comoros":"🇰🇲","st_kitts_nevis":"🇰🇳","north_korea":"🇰🇵","kr":"🇰🇷","kuwait":"🇰🇼","cayman_islands":"🇰🇾","kazakhstan":"🇰🇿","laos":"🇱🇦","lebanon":"🇱🇧","st_lucia":"🇱🇨","liechtenstein":"🇱🇮","sri_lanka":"🇱🇰","liberia":"🇱🇷","lesotho":"🇱🇸","lithuania":"🇱🇹","luxembourg":"🇱🇺","latvia":"🇱🇻","libya":"🇱🇾","morocco":"🇲🇦","monaco":"🇲🇨","moldova":"🇲🇩","montenegro":"🇲🇪","st_martin":"🇲🇫","madagascar":"🇲🇬","marshall_islands":"🇲🇭","macedonia":"🇲🇰","mali":"🇲🇱","myanmar":"🇲🇲","mongolia":"🇲🇳","macau":"🇲🇴","northern_mariana_islands":"🇲🇵","martinique":"🇲🇶","mauritania":"🇲🇷","montserrat":"🇲🇸","malta":"🇲🇹","mauritius":"🇲🇺","maldives":"🇲🇻","malawi":"🇲🇼","mexico":"🇲🇽","malaysia":"🇲🇾","mozambique":"🇲🇿","namibia":"🇳🇦","new_caledonia":"🇳🇨","niger":"🇳🇪","norfolk_island":"🇳🇫","nigeria":"🇳🇬","nicaragua":"🇳🇮","netherlands":"🇳🇱","norway":"🇳🇴","nepal":"🇳🇵","nauru":"🇳🇷","niue":"🇳🇺","new_zealand":"🇳🇿","oman":"🇴🇲","panama":"🇵🇦","peru":"🇵🇪","french_polynesia":"🇵🇫","papua_new_guinea":"🇵🇬","philippines":"🇵🇭","pakistan":"🇵🇰","poland":"🇵🇱","st_pierre_miquelon":"🇵🇲","pitcairn_islands":"🇵🇳","puerto_rico":"🇵🇷","palestinian_territories":"🇵🇸","portugal":"🇵🇹","palau":"🇵🇼","paraguay":"🇵🇾","qatar":"🇶🇦","reunion":"🇷🇪","romania":"🇷🇴","serbia":"🇷🇸","ru":"🇷🇺","rwanda":"🇷🇼","saudi_arabia":"🇸🇦","solomon_islands":"🇸🇧","seychelles":"🇸🇨","sudan":"🇸🇩","sweden":"🇸🇪","singapore":"🇸🇬","st_helena":"🇸🇭","slovenia":"🇸🇮","svalbard_jan_mayen":"🇸🇯","slovakia":"🇸🇰","sierra_leone":"🇸🇱","san_marino":"🇸🇲","senegal":"🇸🇳","somalia":"🇸🇴","suriname":"🇸🇷","south_sudan":"🇸🇸","sao_tome_principe":"🇸🇹","el_salvador":"🇸🇻","sint_maarten":"🇸🇽","syria":"🇸🇾","swaziland":"🇸🇿","tristan_da_cunha":"🇹🇦","turks_caicos_islands":"🇹🇨","chad":"🇹🇩","french_southern_territories":"🇹🇫","togo":"🇹🇬","thailand":"🇹🇭","tajikistan":"🇹🇯","tokelau":"🇹🇰","timor_leste":"🇹🇱","turkmenistan":"🇹🇲","tunisia":"🇹🇳","tonga":"🇹🇴","tr":"🇹🇷","trinidad_tobago":"🇹🇹","tuvalu":"🇹🇻","taiwan":"🇹🇼","tanzania":"🇹🇿","ukraine":"🇺🇦","uganda":"🇺🇬","us_outlying_islands":"🇺🇲","united_nations":"🇺🇳","us":"🇺🇸","uruguay":"🇺🇾","uzbekistan":"🇺🇿","vatican_city":"🇻🇦","st_vincent_grenadines":"🇻🇨","venezuela":"🇻🇪","british_virgin_islands":"🇻🇬","us_virgin_islands":"🇻🇮","vietnam":"🇻🇳","vanuatu":"🇻🇺","wallis_futuna":"🇼🇫","samoa":"🇼🇸","kosovo":"🇽🇰","yemen":"🇾🇪","mayotte":"🇾🇹","south_africa":"🇿🇦","zambia":"🇿🇲","zimbabwe":"🇿🇼","england":"🏴󠁧󠁢󠁥󠁮󠁧󠁿","scotland":"🏴󠁧󠁢󠁳󠁣󠁴󠁿","wales":"🏴󠁧󠁢󠁷󠁬󠁳󠁿"}')},71:function(a,e,n){"use strict";a.exports={angry:[">:(",">:-("],blush:[':")',':-")'],broken_heart:["0&&!t.test(c[i-1]))return;if(i+o.lengths&&((_=new r("text","",0)).content=a.slice(s,i),l.push(_)),(_=new r("emoji","",0)).markup=m,_.content=e[m],l.push(_),s=i+o.length})),s=0;e--)"link_open"!==(t=_[e]).type&&"link_close"!==t.type||"auto"===t.info&&(c-=t.nesting),"text"===t.type&&0===c&&o.test(t.content)&&(l[n].children=_=r(_,e,s(t.content,t.level,a.Token)))}}},75:function(a,e,n){"use strict";a.exports=function(a){var e,n=a.defs;a.enabled.length&&(n=Object.keys(n).reduce((function(e,o){return a.enabled.indexOf(o)>=0&&(e[o]=n[o]),e}),{})),e=Object.keys(a.shortcuts).reduce((function(e,o){return n[o]?Array.isArray(a.shortcuts[o])?(a.shortcuts[o].forEach((function(a){e[a]=o})),e):(e[a.shortcuts[o]]=o,e):e}),{});var o,i=Object.keys(n);o=0===i.length?"^$":i.map((function(a){return":"+a+":"})).concat(Object.keys(e)).sort().reverse().map((function(a){return a.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")})).join("|");var r=RegExp(o),_=RegExp(o,"g");return{defs:n,shortcuts:e,scanRE:r,replaceRE:_}}}}); \ No newline at end of file diff --git a/extensions/notebook-markdown-extensions/notebook-out/katex.js b/extensions/notebook-markdown-extensions/notebook-out/katex.js new file mode 100644 index 00000000..b0cd3efe --- /dev/null +++ b/extensions/notebook-markdown-extensions/notebook-out/katex.js @@ -0,0 +1 @@ +!function(A){var B={};function Q(g){if(B[g])return B[g].exports;var E=B[g]={i:g,l:!1,exports:{}};return A[g].call(E.exports,E,E.exports,Q),E.l=!0,E.exports}Q.m=A,Q.c=B,Q.d=function(A,B,g){Q.o(A,B)||Object.defineProperty(A,B,{enumerable:!0,get:g})},Q.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},Q.t=function(A,B){if(1&B&&(A=Q(A)),8&B)return A;if(4&B&&"object"==typeof A&&A&&A.__esModule)return A;var g=Object.create(null);if(Q.r(g),Object.defineProperty(g,"default",{enumerable:!0,value:A}),2&B&&"string"!=typeof A)for(var E in A)Q.d(g,E,function(B){return A[B]}.bind(null,E));return g},Q.n=function(A){var B=A&&A.__esModule?function(){return A.default}:function(){return A};return Q.d(B,"a",B),B},Q.o=function(A,B){return Object.prototype.hasOwnProperty.call(A,B)},Q.p="",Q(Q.s=64)}([function(A,B,Q){"use strict";A.exports=function(A,B){return B||(B={}),"string"!=typeof(A=A&&A.__esModule?A.default:A)?A:(/^['"].*['"]$/.test(A)&&(A=A.slice(1,-1)),B.hash&&(A+=B.hash),/["'() \t\n]/.test(A)||B.needQuotes?'"'.concat(A.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):A)}},function(A,B,Q){"use strict";var g=Q(3),E=Q.n(g),w=Q(0),I=Q.n(w),C=Q(4),Y=Q(5),M=Q(6),F=Q(7),c=Q(8),s=Q(9),U=Q(10),D=Q(11),i=Q(12),N=Q(13),G=Q(14),h=Q(15),t=Q(16),e=Q(17),y=Q(18),J=Q(19),H=Q(20),j=Q(21),o=Q(22),z=Q(23),r=Q(24),R=Q(25),n=Q(26),x=Q(27),a=Q(28),W=Q(29),S=Q(30),L=Q(31),m=Q(32),k=Q(33),l=Q(34),K=Q(35),T=Q(36),V=Q(37),b=Q(38),u=Q(39),d=Q(40),p=Q(41),X=Q(42),Z=Q(43),f=Q(44),O=Q(45),P=Q(46),v=Q(47),q=Q(48),_=Q(49),$=Q(50),AA=Q(51),BA=Q(52),QA=Q(53),gA=Q(54),EA=Q(55),wA=Q(56),IA=Q(57),CA=Q(58),YA=Q(59),MA=Q(60),FA=Q(61),cA=Q(62),sA=Q(63),UA=E()((function(A){return A[1]})),DA=I()(C.a),iA=I()(Y.a),NA=I()(M.a),GA=I()(F.a),hA=I()(c.a),tA=I()(s.a),eA=I()(U.a),yA=I()(D.a),JA=I()(i.a),HA=I()(N.a),jA=I()(G.a),oA=I()(h.a),zA=I()(t.a),rA=I()(e.a),RA=I()(y.a),nA=I()(J.a),xA=I()(H.a),aA=I()(j.a),WA=I()(o.a),SA=I()(z.a),LA=I()(r.a),mA=I()(R.a),kA=I()(n.a),lA=I()(x.a),KA=I()(a.a),TA=I()(W.a),VA=I()(S.a),bA=I()(L.a),uA=I()(m.a),dA=I()(k.a),pA=I()(l.a),XA=I()(K.a),ZA=I()(T.a),fA=I()(V.a),OA=I()(b.a),PA=I()(u.a),vA=I()(d.a),qA=I()(p.a),_A=I()(X.a),$A=I()(Z.a),AB=I()(f.a),BB=I()(O.a),QB=I()(P.a),gB=I()(v.a),EB=I()(q.a),wB=I()(_.a),IB=I()($.a),CB=I()(AA.a),YB=I()(BA.a),MB=I()(QA.a),FB=I()(gA.a),cB=I()(EA.a),sB=I()(wA.a),UB=I()(IA.a),DB=I()(CA.a),iB=I()(YA.a),NB=I()(MA.a),GB=I()(FA.a),hB=I()(cA.a),tB=I()(sA.a);UA.push([A.i,"@font-face{font-family:KaTeX_AMS;src:url("+DA+') format("woff2"),url('+iA+') format("woff"),url('+NA+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url('+GA+') format("woff2"),url('+hA+') format("woff"),url('+tA+') format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url('+eA+') format("woff2"),url('+yA+') format("woff"),url('+JA+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url('+HA+') format("woff2"),url('+jA+') format("woff"),url('+oA+') format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url('+zA+') format("woff2"),url('+rA+') format("woff"),url('+RA+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url('+nA+') format("woff2"),url('+xA+') format("woff"),url('+aA+') format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url('+WA+') format("woff2"),url('+SA+') format("woff"),url('+LA+') format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url('+mA+') format("woff2"),url('+kA+') format("woff"),url('+lA+') format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url('+KA+') format("woff2"),url('+TA+') format("woff"),url('+VA+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url('+bA+') format("woff2"),url('+uA+') format("woff"),url('+dA+') format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url('+pA+') format("woff2"),url('+XA+') format("woff"),url('+ZA+') format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url('+fA+') format("woff2"),url('+OA+') format("woff"),url('+PA+') format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url('+vA+') format("woff2"),url('+qA+') format("woff"),url('+_A+') format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url('+$A+') format("woff2"),url('+AB+') format("woff"),url('+BB+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url('+QB+') format("woff2"),url('+gB+') format("woff"),url('+EB+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url('+wB+') format("woff2"),url('+IB+') format("woff"),url('+CB+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url('+YB+') format("woff2"),url('+MB+') format("woff"),url('+FB+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url('+cB+') format("woff2"),url('+sB+') format("woff"),url('+UB+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url('+DB+') format("woff2"),url('+iB+') format("woff"),url('+NB+') format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url('+GB+') format("woff2"),url('+hB+') format("woff"),url('+tB+') format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto;border-color:currentColor}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.12.0"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed;border-collapse:collapse}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .vbox{-ms-flex-direction:column;flex-direction:column;align-items:baseline}.katex .hbox,.katex .vbox{display:-ms-inline-flexbox;display:inline-flex}.katex .hbox{-ms-flex-direction:row;flex-direction:row;width:100%}.katex .thinbox{display:inline-flex;flex-direction:row;width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left;padding-left:2em}\n',""]),B.a=UA},function(A,B,Q){"use strict";var g,E=function(){return void 0===g&&(g=Boolean(window&&document&&document.all&&!window.atob)),g},w=function(){var A={};return function(B){if(void 0===A[B]){var Q=document.querySelector(B);if(window.HTMLIFrameElement&&Q instanceof window.HTMLIFrameElement)try{Q=Q.contentDocument.head}catch(A){Q=null}A[B]=Q}return A[B]}}(),I=[];function C(A){for(var B=-1,Q=0;Q{A.use(g)})},function(A,B,Q){"use strict";Q.r(B);var g=Q(2),E=Q.n(g),w=Q(1),I={insert:"head",singleton:!1};E()(w.a,I);B.default=w.a.locals||{}},function(A,B,Q){"use strict";var g=Q(67);function E(A,B){var Q,g,E=A.posMax,w=!0,I=!0;return Q=B>0?A.src.charCodeAt(B-1):-1,g=B+1<=E?A.src.charCodeAt(B+1):-1,(32===Q||9===Q||g>=48&&g<=57)&&(I=!1),32!==g&&9!==g||(w=!1),{can_open:w,can_close:I}}function w(A,B){var Q,g,w,I;if("$"!==A.src[A.pos])return!1;if(!E(A,A.pos).can_open)return B||(A.pending+="$"),A.pos+=1,!0;for(g=Q=A.pos+1;-1!==(g=A.src.indexOf("$",g));){for(I=g-1;"\\"===A.src[I];)I-=1;if((g-I)%2==1)break;g+=1}return-1===g?(B||(A.pending+="$"),A.pos=Q,!0):g-Q==0?(B||(A.pending+="$$"),A.pos=Q+1,!0):E(A,g).can_close?(B||((w=A.push("math_inline","math",0)).markup="$",w.content=A.src.slice(Q,g)),A.pos=g+1,!0):(B||(A.pending+="$"),A.pos=Q,!0)}function I(A,B,Q,g){var E,w,I,C,Y,M=!1,F=A.bMarks[B]+A.tShift[B],c=A.eMarks[B];if(F+2>c)return!1;if("$$"!==A.src.slice(F,F+2))return!1;if(F+=2,E=A.src.slice(F,c),g)return!0;for("$$"===E.trim().slice(-2)&&(E=E.trim().slice(0,-2),M=!0),I=B;!M&&!(++I>=Q)&&!((F=A.bMarks[I]+A.tShift[I])<(c=A.eMarks[I])&&A.tShift[I]/g,">").replace(/"/g,""").replace(/'/g,"'")}A.exports=function(A,B){B=B||{};A.inline.ruler.after("escape","math_inline",w),A.block.ruler.after("blockquote","math_block",I,{alt:["paragraph","reference","blockquote","list"]}),A.renderer.rules.math_inline=function(A,Q){return function(A){B.displayMode=!1;try{return g.renderToString(A,B)}catch(Q){return B.throwOnError&&console.log(Q),`${C(A)}`}}(A[Q].content)},A.renderer.rules.math_block=function(A,Q){return function(A){B.displayMode=!0;try{return"

"+g.renderToString(A,B)+"

"}catch(Q){return B.throwOnError&&console.log(Q),`

${C(A)}

`}}(A[Q].content)+"\n"}}},function(A,B,Q){var g;"undefined"!=typeof self&&self,g=function(){return function(A){var B={};function Q(g){if(B[g])return B[g].exports;var E=B[g]={i:g,l:!1,exports:{}};return A[g].call(E.exports,E,E.exports,Q),E.l=!0,E.exports}return Q.m=A,Q.c=B,Q.d=function(A,B,g){Q.o(A,B)||Object.defineProperty(A,B,{enumerable:!0,get:g})},Q.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},Q.t=function(A,B){if(1&B&&(A=Q(A)),8&B)return A;if(4&B&&"object"==typeof A&&A&&A.__esModule)return A;var g=Object.create(null);if(Q.r(g),Object.defineProperty(g,"default",{enumerable:!0,value:A}),2&B&&"string"!=typeof A)for(var E in A)Q.d(g,E,function(B){return A[B]}.bind(null,E));return g},Q.n=function(A){var B=A&&A.__esModule?function(){return A.default}:function(){return A};return Q.d(B,"a",B),B},Q.o=function(A,B){return Object.prototype.hasOwnProperty.call(A,B)},Q.p="",Q(Q.s=1)}([function(A,B,Q){},function(A,B,Q){"use strict";Q.r(B),Q(0);var g=function(){function A(A,B,Q){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=A,this.start=B,this.end=Q}return A.range=function(B,Q){return Q?B&&B.loc&&Q.loc&&B.loc.lexer===Q.loc.lexer?new A(B.loc.lexer,B.loc.start,Q.loc.end):null:B&&B.loc},A}(),E=function(){function A(A,B){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=A,this.loc=B}return A.prototype.range=function(B,Q){return new A(Q,g.range(this,B))},A}(),w=function A(B,Q){this.position=void 0;var g,E="KaTeX parse error: "+B,w=Q&&Q.loc;if(w&&w.start<=w.end){var I=w.lexer.input;g=w.start;var C=w.end;g===I.length?E+=" at end of input: ":E+=" at position "+(g+1)+": ";var Y=I.slice(g,C).replace(/[^]/g,"$&̲");E+=(g>15?"…"+I.slice(g-15,g):I.slice(0,g))+Y+(C+15":">","<":"<",'"':""","'":"'"},M=/[&><"']/g,F=function A(B){return"ordgroup"===B.type||"color"===B.type?1===B.body.length?A(B.body[0]):B:"font"===B.type?A(B.body):B},c={contains:function(A,B){return-1!==A.indexOf(B)},deflt:function(A,B){return void 0===A?B:A},escape:function(A){return String(A).replace(M,(function(A){return Y[A]}))},hyphenate:function(A){return A.replace(C,"-$1").toLowerCase()},getBaseElem:F,isCharacterBox:function(A){var B=F(A);return"mathord"===B.type||"textord"===B.type||"atom"===B.type},protocolFromUrl:function(A){var B=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(A);return null!=B?B[1]:"_relative"}},s=function(){function A(A){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,A=A||{},this.displayMode=c.deflt(A.displayMode,!1),this.output=c.deflt(A.output,"htmlAndMathml"),this.leqno=c.deflt(A.leqno,!1),this.fleqn=c.deflt(A.fleqn,!1),this.throwOnError=c.deflt(A.throwOnError,!0),this.errorColor=c.deflt(A.errorColor,"#cc0000"),this.macros=A.macros||{},this.minRuleThickness=Math.max(0,c.deflt(A.minRuleThickness,0)),this.colorIsTextColor=c.deflt(A.colorIsTextColor,!1),this.strict=c.deflt(A.strict,"warn"),this.trust=c.deflt(A.trust,!1),this.maxSize=Math.max(0,c.deflt(A.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(A.maxExpand,1e3)),this.globalGroup=c.deflt(A.globalGroup,!1)}var B=A.prototype;return B.reportNonstrict=function(A,B,Q){var g=this.strict;if("function"==typeof g&&(g=g(A,B,Q)),g&&"ignore"!==g){if(!0===g||"error"===g)throw new I("LaTeX-incompatible input and strict mode is set to 'error': "+B+" ["+A+"]",Q);"warn"===g?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+B+" ["+A+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+g+"': "+B+" ["+A+"]")}},B.useStrictBehavior=function(A,B,Q){var g=this.strict;if("function"==typeof g)try{g=g(A,B,Q)}catch(A){g="error"}return!(!g||"ignore"===g||!0!==g&&"error"!==g&&("warn"===g?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+B+" ["+A+"]"),1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+g+"': "+B+" ["+A+"]"),1)))},B.isTrusted=function(A){A.url&&!A.protocol&&(A.protocol=c.protocolFromUrl(A.url));var B="function"==typeof this.trust?this.trust(A):this.trust;return Boolean(B)},A}(),U=function(){function A(A,B,Q){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=A,this.size=B,this.cramped=Q}var B=A.prototype;return B.sup=function(){return D[i[this.id]]},B.sub=function(){return D[N[this.id]]},B.fracNum=function(){return D[G[this.id]]},B.fracDen=function(){return D[h[this.id]]},B.cramp=function(){return D[t[this.id]]},B.text=function(){return D[e[this.id]]},B.isTight=function(){return this.size>=2},A}(),D=[new U(0,0,!1),new U(1,0,!0),new U(2,1,!1),new U(3,1,!0),new U(4,2,!1),new U(5,2,!0),new U(6,3,!1),new U(7,3,!0)],i=[4,5,4,5,6,7,6,7],N=[5,5,5,5,7,7,7,7],G=[2,3,4,5,6,7,6,7],h=[3,3,5,5,7,7,7,7],t=[1,1,3,3,5,5,7,7],e=[0,1,2,3,2,3,2,3],y={DISPLAY:D[0],TEXT:D[2],SCRIPT:D[4],SCRIPTSCRIPT:D[6]},J=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}],H=[];function j(A){for(var B=0;B=H[B]&&A<=H[B+1])return!0;return!1}J.forEach((function(A){return A.blocks.forEach((function(A){return H.push.apply(H,A)}))}));var o={leftParenInner:"M291 0 H417 V300 H291 z",rightParenInner:"M457 0 H583 V300 H457 z",doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},z=function(){function A(A){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=A,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var B=A.prototype;return B.hasClass=function(A){return c.contains(this.classes,A)},B.toNode=function(){for(var A=document.createDocumentFragment(),B=0;B"},a=function(){function A(A,B,Q,g){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,R.call(this,A,Q,g),this.children=B||[]}var B=A.prototype;return B.setAttribute=function(A,B){this.attributes[A]=B},B.hasClass=function(A){return c.contains(this.classes,A)},B.toNode=function(){return n.call(this,"span")},B.toMarkup=function(){return x.call(this,"span")},A}(),W=function(){function A(A,B,Q,g){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,R.call(this,B,g),this.children=Q||[],this.setAttribute("href",A)}var B=A.prototype;return B.setAttribute=function(A,B){this.attributes[A]=B},B.hasClass=function(A){return c.contains(this.classes,A)},B.toNode=function(){return n.call(this,"a")},B.toMarkup=function(){return x.call(this,"a")},A}(),S=function(){function A(A,B,Q){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=B,this.src=A,this.classes=["mord"],this.style=Q}var B=A.prototype;return B.hasClass=function(A){return c.contains(this.classes,A)},B.toNode=function(){var A=document.createElement("img");for(var B in A.src=this.src,A.alt=this.alt,A.className="mord",this.style)this.style.hasOwnProperty(B)&&(A.style[B]=this.style[B]);return A},B.toMarkup=function(){var A=""+this.alt+"=E[0]&&A<=E[1])return Q.name}return null}(this.text.charCodeAt(0));Y&&this.classes.push(Y+"_fallback"),/[îïíì]/.test(this.text)&&(this.text=L[this.text])}var B=A.prototype;return B.hasClass=function(A){return c.contains(this.classes,A)},B.toNode=function(){var A=document.createTextNode(this.text),B=null;for(var Q in this.italic>0&&((B=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((B=B||document.createElement("span")).className=r(this.classes)),this.style)this.style.hasOwnProperty(Q)&&((B=B||document.createElement("span")).style[Q]=this.style[Q]);return B?(B.appendChild(A),B):A},B.toMarkup=function(){var A=!1,B="0&&(Q+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(g)&&(Q+=c.hyphenate(g)+":"+this.style[g]+";");Q&&(A=!0,B+=' style="'+c.escape(Q)+'"');var E=c.escape(this.text);return A?(B+=">",B+=E,B+=""):E},A}(),k=function(){function A(A,B){this.children=void 0,this.attributes=void 0,this.children=A||[],this.attributes=B||{}}var B=A.prototype;return B.toNode=function(){var A=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var B in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,B)&&A.setAttribute(B,this.attributes[B]);for(var Q=0;Q":""},A}(),K=function(){function A(A){this.attributes=void 0,this.attributes=A||{}}var B=A.prototype;return B.toNode=function(){var A=document.createElementNS("http://www.w3.org/2000/svg","line");for(var B in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,B)&&A.setAttribute(B,this.attributes[B]);return A},B.toMarkup=function(){var A="","\\gt",!0),P("math",v,BA,"∈","\\in",!0),P("math",v,BA,"","\\@not"),P("math",v,BA,"⊂","\\subset",!0),P("math",v,BA,"⊃","\\supset",!0),P("math",v,BA,"⊆","\\subseteq",!0),P("math",v,BA,"⊇","\\supseteq",!0),P("math",q,BA,"⊈","\\nsubseteq",!0),P("math",q,BA,"⊉","\\nsupseteq",!0),P("math",v,BA,"⊨","\\models"),P("math",v,BA,"←","\\leftarrow",!0),P("math",v,BA,"≤","\\le"),P("math",v,BA,"≤","\\leq",!0),P("math",v,BA,"<","\\lt",!0),P("math",v,BA,"→","\\rightarrow",!0),P("math",v,BA,"→","\\to"),P("math",q,BA,"≱","\\ngeq",!0),P("math",q,BA,"≰","\\nleq",!0),P("math",v,"spacing"," ","\\ "),P("math",v,"spacing"," ","~"),P("math",v,"spacing"," ","\\space"),P("math",v,"spacing"," ","\\nobreakspace"),P("text",v,"spacing"," ","\\ "),P("text",v,"spacing"," "," "),P("text",v,"spacing"," ","~"),P("text",v,"spacing"," ","\\space"),P("text",v,"spacing"," ","\\nobreakspace"),P("math",v,"spacing",null,"\\nobreak"),P("math",v,"spacing",null,"\\allowbreak"),P("math",v,"punct",",",","),P("math",v,"punct",";",";"),P("math",q,_,"⊼","\\barwedge",!0),P("math",q,_,"⊻","\\veebar",!0),P("math",v,_,"⊙","\\odot",!0),P("math",v,_,"⊕","\\oplus",!0),P("math",v,_,"⊗","\\otimes",!0),P("math",v,"textord","∂","\\partial",!0),P("math",v,_,"⊘","\\oslash",!0),P("math",q,_,"⊚","\\circledcirc",!0),P("math",q,_,"⊡","\\boxdot",!0),P("math",v,_,"△","\\bigtriangleup"),P("math",v,_,"▽","\\bigtriangledown"),P("math",v,_,"†","\\dagger"),P("math",v,_,"⋄","\\diamond"),P("math",v,_,"⋆","\\star"),P("math",v,_,"◃","\\triangleleft"),P("math",v,_,"▹","\\triangleright"),P("math",v,"open","{","\\{"),P("text",v,"textord","{","\\{"),P("text",v,"textord","{","\\textbraceleft"),P("math",v,"close","}","\\}"),P("text",v,"textord","}","\\}"),P("text",v,"textord","}","\\textbraceright"),P("math",v,"open","{","\\lbrace"),P("math",v,"close","}","\\rbrace"),P("math",v,"open","[","\\lbrack",!0),P("text",v,"textord","[","\\lbrack",!0),P("math",v,"close","]","\\rbrack",!0),P("text",v,"textord","]","\\rbrack",!0),P("math",v,"open","(","\\lparen",!0),P("math",v,"close",")","\\rparen",!0),P("text",v,"textord","<","\\textless",!0),P("text",v,"textord",">","\\textgreater",!0),P("math",v,"open","⌊","\\lfloor",!0),P("math",v,"close","⌋","\\rfloor",!0),P("math",v,"open","⌈","\\lceil",!0),P("math",v,"close","⌉","\\rceil",!0),P("math",v,"textord","\\","\\backslash"),P("math",v,"textord","∣","|"),P("math",v,"textord","∣","\\vert"),P("text",v,"textord","|","\\textbar",!0),P("math",v,"textord","∥","\\|"),P("math",v,"textord","∥","\\Vert"),P("text",v,"textord","∥","\\textbardbl"),P("text",v,"textord","~","\\textasciitilde"),P("text",v,"textord","\\","\\textbackslash"),P("text",v,"textord","^","\\textasciicircum"),P("math",v,BA,"↑","\\uparrow",!0),P("math",v,BA,"⇑","\\Uparrow",!0),P("math",v,BA,"↓","\\downarrow",!0),P("math",v,BA,"⇓","\\Downarrow",!0),P("math",v,BA,"↕","\\updownarrow",!0),P("math",v,BA,"⇕","\\Updownarrow",!0),P("math",v,AA,"∐","\\coprod"),P("math",v,AA,"⋁","\\bigvee"),P("math",v,AA,"⋀","\\bigwedge"),P("math",v,AA,"⨄","\\biguplus"),P("math",v,AA,"⋂","\\bigcap"),P("math",v,AA,"⋃","\\bigcup"),P("math",v,AA,"∫","\\int"),P("math",v,AA,"∫","\\intop"),P("math",v,AA,"∬","\\iint"),P("math",v,AA,"∭","\\iiint"),P("math",v,AA,"∏","\\prod"),P("math",v,AA,"∑","\\sum"),P("math",v,AA,"⨂","\\bigotimes"),P("math",v,AA,"⨁","\\bigoplus"),P("math",v,AA,"⨀","\\bigodot"),P("math",v,AA,"∮","\\oint"),P("math",v,AA,"⨆","\\bigsqcup"),P("math",v,AA,"∫","\\smallint"),P("text",v,"inner","…","\\textellipsis"),P("math",v,"inner","…","\\mathellipsis"),P("text",v,"inner","…","\\ldots",!0),P("math",v,"inner","…","\\ldots",!0),P("math",v,"inner","⋯","\\@cdots",!0),P("math",v,"inner","⋱","\\ddots",!0),P("math",v,"textord","⋮","\\varvdots"),P("math",v,"accent-token","ˊ","\\acute"),P("math",v,"accent-token","ˋ","\\grave"),P("math",v,"accent-token","¨","\\ddot"),P("math",v,"accent-token","~","\\tilde"),P("math",v,"accent-token","ˉ","\\bar"),P("math",v,"accent-token","˘","\\breve"),P("math",v,"accent-token","ˇ","\\check"),P("math",v,"accent-token","^","\\hat"),P("math",v,"accent-token","⃗","\\vec"),P("math",v,"accent-token","˙","\\dot"),P("math",v,"accent-token","˚","\\mathring"),P("math",v,$,"","\\@imath"),P("math",v,$,"","\\@jmath"),P("math",v,"textord","ı","ı"),P("math",v,"textord","ȷ","ȷ"),P("text",v,"textord","ı","\\i",!0),P("text",v,"textord","ȷ","\\j",!0),P("text",v,"textord","ß","\\ss",!0),P("text",v,"textord","æ","\\ae",!0),P("text",v,"textord","œ","\\oe",!0),P("text",v,"textord","ø","\\o",!0),P("text",v,"textord","Æ","\\AE",!0),P("text",v,"textord","Œ","\\OE",!0),P("text",v,"textord","Ø","\\O",!0),P("text",v,"accent-token","ˊ","\\'"),P("text",v,"accent-token","ˋ","\\`"),P("text",v,"accent-token","ˆ","\\^"),P("text",v,"accent-token","˜","\\~"),P("text",v,"accent-token","ˉ","\\="),P("text",v,"accent-token","˘","\\u"),P("text",v,"accent-token","˙","\\."),P("text",v,"accent-token","˚","\\r"),P("text",v,"accent-token","ˇ","\\v"),P("text",v,"accent-token","¨",'\\"'),P("text",v,"accent-token","˝","\\H"),P("text",v,"accent-token","◯","\\textcircled");var QA={"--":!0,"---":!0,"``":!0,"''":!0};P("text",v,"textord","–","--",!0),P("text",v,"textord","–","\\textendash"),P("text",v,"textord","—","---",!0),P("text",v,"textord","—","\\textemdash"),P("text",v,"textord","‘","`",!0),P("text",v,"textord","‘","\\textquoteleft"),P("text",v,"textord","’","'",!0),P("text",v,"textord","’","\\textquoteright"),P("text",v,"textord","“","``",!0),P("text",v,"textord","“","\\textquotedblleft"),P("text",v,"textord","”","''",!0),P("text",v,"textord","”","\\textquotedblright"),P("math",v,"textord","°","\\degree",!0),P("text",v,"textord","°","\\degree"),P("text",v,"textord","°","\\textdegree",!0),P("math",v,"textord","£","\\pounds"),P("math",v,"textord","£","\\mathsterling",!0),P("text",v,"textord","£","\\pounds"),P("text",v,"textord","£","\\textsterling",!0),P("math",q,"textord","✠","\\maltese"),P("text",q,"textord","✠","\\maltese");for(var gA=0;gA<'0123456789/@."'.length;gA++){var EA='0123456789/@."'.charAt(gA);P("math",v,"textord",EA,EA)}for(var wA=0;wA<'0123456789!@*()-=+";:?/.,'.length;wA++){var IA='0123456789!@*()-=+";:?/.,'.charAt(wA);P("text",v,"textord",IA,IA)}for(var CA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",YA=0;YA=5?0:A>=3?1:2]){var Q=p[B]={cssEmPerMu:b.quad[B]/18};for(var g in b)b.hasOwnProperty(g)&&(Q[g]=b[g][B])}return p[B]}(this.size)),this._fontMetrics},B.getColor=function(){return this.phantom?"transparent":this.color},A}();JA.BASESIZE=6;var HA=JA,jA={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},oA={ex:!0,em:!0,mu:!0},zA=function(A){return"string"!=typeof A&&(A=A.unit),A in jA||A in oA||"ex"===A},rA=function(A,B){var Q;if(A.unit in jA)Q=jA[A.unit]/B.fontMetrics().ptPerEm/B.sizeMultiplier;else if("mu"===A.unit)Q=B.fontMetrics().cssEmPerMu;else{var g;if(g=B.style.isTight()?B.havingStyle(B.style.text()):B,"ex"===A.unit)Q=g.fontMetrics().xHeight;else{if("em"!==A.unit)throw new I("Invalid unit: '"+A.unit+"'");Q=g.fontMetrics().quad}g!==B&&(Q*=g.sizeMultiplier/B.sizeMultiplier)}return Math.min(A.number*Q,B.maxSize)},RA=function(A,B,Q){return O[Q][A]&&O[Q][A].replace&&(A=O[Q][A].replace),{value:A,metrics:d(A,B,Q)}},nA=function(A,B,Q,g,E){var w,I=RA(A,B,Q),C=I.metrics;if(A=I.value,C){var Y=C.italic;("text"===Q||g&&"mathit"===g.font)&&(Y=0),w=new m(A,C.height,C.depth,Y,C.skew,C.width,E)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+A+"' in style '"+B+"' and mode '"+Q+"'"),w=new m(A,0,0,0,0,0,E);if(g){w.maxFontSize=g.sizeMultiplier,g.style.isTight()&&w.classes.push("mtight");var M=g.getColor();M&&(w.style.color=M)}return w},xA=function(A,B){if(r(A.classes)!==r(B.classes)||A.skew!==B.skew||A.maxFontSize!==B.maxFontSize)return!1;for(var Q in A.style)if(A.style.hasOwnProperty(Q)&&A.style[Q]!==B.style[Q])return!1;for(var g in B.style)if(B.style.hasOwnProperty(g)&&A.style[g]!==B.style[g])return!1;return!0},aA=function(A){for(var B=0,Q=0,g=0,E=0;EB&&(B=w.height),w.depth>Q&&(Q=w.depth),w.maxFontSize>g&&(g=w.maxFontSize)}A.height=B,A.depth=Q,A.maxFontSize=g},WA=function(A,B,Q,g){var E=new a(A,B,Q,g);return aA(E),E},SA=function(A,B,Q,g){return new a(A,B,Q,g)},LA=function(A){var B=new z(A);return aA(B),B},mA=function(A,B,Q){var g="";switch(A){case"amsrm":g="AMS";break;case"textrm":g="Main";break;case"textsf":g="SansSerif";break;case"texttt":g="Typewriter";break;default:g=A}return g+"-"+("textbf"===B&&"textit"===Q?"BoldItalic":"textbf"===B?"Bold":"textit"===B?"Italic":"Regular")},kA={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},lA={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659],leftParenInner:["leftParenInner",.875,.3],rightParenInner:["rightParenInner",.875,.3]},KA={fontMap:kA,makeSymbol:nA,mathsym:function(A,B,Q,g){return void 0===g&&(g=[]),"boldsymbol"===Q.font&&RA(A,"Main-Bold",B).metrics?nA(A,"Main-Bold",B,Q,g.concat(["mathbf"])):"\\"===A||"main"===O[B][A].font?nA(A,"Main-Regular",B,Q,g):nA(A,"AMS-Regular",B,Q,g.concat(["amsrm"]))},makeSpan:WA,makeSvgSpan:SA,makeLineSpan:function(A,B,Q){var g=WA([A],[],B);return g.height=Math.max(Q||B.fontMetrics().defaultRuleThickness,B.minRuleThickness),g.style.borderBottomWidth=g.height+"em",g.maxFontSize=1,g},makeAnchor:function(A,B,Q,g){var E=new W(A,B,Q,g);return aA(E),E},makeFragment:LA,wrapFragment:function(A,B){return A instanceof z?WA([],[A],B):A},makeVList:function(A,B){for(var Q=function(A){if("individualShift"===A.positionType){for(var B=A.children,Q=[B[0]],g=-B[0].shift-B[0].elem.depth,E=g,w=1;w0&&(w.push(CB(I,B)),I=[]),w.push(E[C]));I.length>0&&w.push(CB(I,B)),Q&&((g=CB(BB(Q,B,!0))).classes=["tag"],w.push(g));var M=vA(["katex-html"],w);if(M.setAttribute("aria-hidden","true"),g){var F=g.children[0];F.style.height=M.height+M.depth+"em",F.style.verticalAlign=-M.depth+"em"}return M}function MB(A){return new z(A)}var FB=function(){function A(A,B){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=A,this.attributes={},this.children=B||[]}var B=A.prototype;return B.setAttribute=function(A,B){this.attributes[A]=B},B.getAttribute=function(A){return this.attributes[A]},B.toNode=function(){var A=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var B in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,B)&&A.setAttribute(B,this.attributes[B]);for(var Q=0;Q"},B.toText=function(){return this.children.map((function(A){return A.toText()})).join("")},A}(),cB=function(){function A(A){this.text=void 0,this.text=A}var B=A.prototype;return B.toNode=function(){return document.createTextNode(this.text)},B.toMarkup=function(){return c.escape(this.toText())},B.toText=function(){return this.text},A}(),sB={MathNode:FB,TextNode:cB,SpaceNode:function(){function A(A){this.width=void 0,this.character=void 0,this.width=A,this.character=A>=.05555&&A<=.05556?" ":A>=.1666&&A<=.1667?" ":A>=.2222&&A<=.2223?" ":A>=.2777&&A<=.2778?"  ":A>=-.05556&&A<=-.05555?" ⁣":A>=-.1667&&A<=-.1666?" ⁣":A>=-.2223&&A<=-.2222?" ⁣":A>=-.2778&&A<=-.2777?" ⁣":null}var B=A.prototype;return B.toNode=function(){if(this.character)return document.createTextNode(this.character);var A=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return A.setAttribute("width",this.width+"em"),A},B.toMarkup=function(){return this.character?""+this.character+"":''},B.toText=function(){return this.character?this.character:" "},A}(),newDocumentFragment:MB},UB=function(A,B,Q){return!O[B][A]||!O[B][A].replace||55349===A.charCodeAt(0)||QA.hasOwnProperty(A)&&Q&&(Q.fontFamily&&"tt"===Q.fontFamily.substr(4,2)||Q.font&&"tt"===Q.font.substr(4,2))||(A=O[B][A].replace),new sB.TextNode(A)},DB=function(A){return 1===A.length?A[0]:new sB.MathNode("mrow",A)},iB=function(A,B){if("texttt"===B.fontFamily)return"monospace";if("textsf"===B.fontFamily)return"textit"===B.fontShape&&"textbf"===B.fontWeight?"sans-serif-bold-italic":"textit"===B.fontShape?"sans-serif-italic":"textbf"===B.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===B.fontShape&&"textbf"===B.fontWeight)return"bold-italic";if("textit"===B.fontShape)return"italic";if("textbf"===B.fontWeight)return"bold";var Q=B.font;if(!Q||"mathnormal"===Q)return null;var g=A.mode;if("mathit"===Q)return"italic";if("boldsymbol"===Q)return"textord"===A.type?"bold":"bold-italic";if("mathbf"===Q)return"bold";if("mathbb"===Q)return"double-struck";if("mathfrak"===Q)return"fraktur";if("mathscr"===Q||"mathcal"===Q)return"script";if("mathsf"===Q)return"sans-serif";if("mathtt"===Q)return"monospace";var E=A.text;return c.contains(["\\imath","\\jmath"],E)?null:(O[g][E]&&O[g][E].replace&&(E=O[g][E].replace),d(E,KA.fontMap[Q].fontName,g)?KA.fontMap[Q].variant:null)},NB=function(A,B,Q){if(1===A.length){var g=hB(A[0],B);return Q&&g instanceof FB&&"mo"===g.type&&(g.setAttribute("lspace","0em"),g.setAttribute("rspace","0em")),[g]}for(var E,w=[],I=0;I0&&(U.text=U.text.slice(0,1)+"̸"+U.text.slice(1),w.pop())}}}w.push(C),E=C}return w},GB=function(A,B,Q){return DB(NB(A,B,Q))},hB=function(A,B){if(!A)return new sB.MathNode("mrow");if(ZA[A.type])return ZA[A.type](A,B);throw new I("Got group of unknown type: '"+A.type+"'")};function tB(A,B,Q,g,E){var w,I=NB(A,Q);w=1===I.length&&I[0]instanceof FB&&c.contains(["mrow","mtable"],I[0].type)?I[0]:new sB.MathNode("mrow",I);var C=new sB.MathNode("annotation",[new sB.TextNode(B)]);C.setAttribute("encoding","application/x-tex");var Y=new sB.MathNode("semantics",[w,C]),M=new sB.MathNode("math",[Y]);M.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),g&&M.setAttribute("display","block");var F=E?"katex":"katex-mathml";return KA.makeSpan([F],[M])}var eB=function(A){return new HA({style:A.displayMode?y.DISPLAY:y.TEXT,maxSize:A.maxSize,minRuleThickness:A.minRuleThickness})},yB=function(A,B){if(B.displayMode){var Q=["katex-display"];B.leqno&&Q.push("leqno"),B.fleqn&&Q.push("fleqn"),A=KA.makeSpan(Q,[A])}return A},JB=function(A,B,Q){var g,E=eB(Q);if("mathml"===Q.output)return tB(A,B,E,Q.displayMode,!0);if("html"===Q.output){var w=YB(A,E);g=KA.makeSpan(["katex"],[w])}else{var I=tB(A,B,E,Q.displayMode,!1),C=YB(A,E);g=KA.makeSpan(["katex"],[I,C])}return yB(g,Q)},HB={widehat:"^",widecheck:"ˇ",widetilde:"~",utilde:"~",overleftarrow:"←",underleftarrow:"←",xleftarrow:"←",overrightarrow:"→",underrightarrow:"→",xrightarrow:"→",underbrace:"⏟",overbrace:"⏞",overgroup:"⏠",undergroup:"⏡",overleftrightarrow:"↔",underleftrightarrow:"↔",xleftrightarrow:"↔",Overrightarrow:"⇒",xRightarrow:"⇒",overleftharpoon:"↼",xleftharpoonup:"↼",overrightharpoon:"⇀",xrightharpoonup:"⇀",xLeftarrow:"⇐",xLeftrightarrow:"⇔",xhookleftarrow:"↩",xhookrightarrow:"↪",xmapsto:"↦",xrightharpoondown:"⇁",xleftharpoondown:"↽",xrightleftharpoons:"⇌",xleftrightharpoons:"⇋",xtwoheadleftarrow:"↞",xtwoheadrightarrow:"↠",xlongequal:"=",xtofrom:"⇄",xrightleftarrows:"⇄",xrightequilibrium:"⇌",xleftequilibrium:"⇋"},jB={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},oB=function(A,B,Q,g){var E,w=A.height+A.depth+2*Q;if(/fbox|color/.test(B)){if(E=KA.makeSpan(["stretchy",B],[],g),"fbox"===B){var I=g.color&&g.getColor();I&&(E.style.borderColor=I)}}else{var C=[];/^[bx]cancel$/.test(B)&&C.push(new K({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(B)&&C.push(new K({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var Y=new k(C,{width:"100%",height:w+"em"});E=KA.makeSvgSpan([],[Y],g)}return E.height=w,E.style.height=w+"em",E},zB=function(A){var B=new sB.MathNode("mo",[new sB.TextNode(HB[A.substr(1)])]);return B.setAttribute("stretchy","true"),B},rB=function(A,B){var Q=function(){var Q=4e5,g=A.label.substr(1);if(c.contains(["widehat","widecheck","widetilde","utilde"],g)){var E,w,I,C="ordgroup"===(D=A.base).type?D.body.length:1;if(C>5)"widehat"===g||"widecheck"===g?(E=420,Q=2364,I=.42,w=g+"4"):(E=312,Q=2340,I=.34,w="tilde4");else{var Y=[1,1,2,2,3,3][C];"widehat"===g||"widecheck"===g?(Q=[0,1062,2364,2364,2364][Y],E=[0,239,300,360,420][Y],I=[0,.24,.3,.3,.36,.42][Y],w=g+Y):(Q=[0,600,1033,2339,2340][Y],E=[0,260,286,306,312][Y],I=[0,.26,.286,.3,.306,.34][Y],w="tilde"+Y)}var M=new l(w),F=new k([M],{width:"100%",height:I+"em",viewBox:"0 0 "+Q+" "+E,preserveAspectRatio:"none"});return{span:KA.makeSvgSpan([],[F],B),minWidth:0,height:I}}var s,U,D,i=[],N=jB[g],G=N[0],h=N[1],t=N[2],e=t/1e3,y=G.length;if(1===y)s=["hide-tail"],U=[N[3]];else if(2===y)s=["halfarrow-left","halfarrow-right"],U=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n "+y+" children.");s=["brace-left","brace-center","brace-right"],U=["xMinYMin","xMidYMin","xMaxYMin"]}for(var J=0;J0&&(g.style.minWidth=E+"em"),g};function RB(A,B){if(!A||A.type!==B)throw new Error("Expected node of type "+B+", but got "+(A?"node of type "+A.type:String(A)));return A}function nB(A){var B=xB(A);if(!B)throw new Error("Expected node of symbol group type, but got "+(A?"node of type "+A.type:String(A)));return B}function xB(A){return A&&("atom"===A.type||Z.hasOwnProperty(A.type))?A:null}var aB=function(A,B){var Q,g,E;A&&"supsub"===A.type?(Q=(g=RB(A.base,"accent")).base,A.base=Q,E=function(A){if(A instanceof a)return A;throw new Error("Expected span but got "+String(A)+".")}(IB(A,B)),A.base=g):Q=(g=RB(A,"accent")).base;var w=IB(Q,B.havingCrampedStyle()),I=0;if(g.isShifty&&c.isCharacterBox(Q)){var C=c.getBaseElem(Q);I=T(IB(C,B.havingCrampedStyle())).skew}var Y,M=Math.min(w.height,B.fontMetrics().xHeight);if(g.isStretchy)Y=rB(g,B),Y=KA.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:w},{type:"elem",elem:Y,wrapperClasses:["svg-align"],wrapperStyle:I>0?{width:"calc(100% - "+2*I+"em)",marginLeft:2*I+"em"}:void 0}]},B);else{var F,s;"\\vec"===g.label?(F=KA.staticSvg("vec",B),s=KA.svgData.vec[1]):((F=T(F=KA.makeOrd({mode:g.mode,text:g.label},B,"textord"))).italic=0,s=F.width),Y=KA.makeSpan(["accent-body"],[F]);var U="\\textcircled"===g.label;U&&(Y.classes.push("accent-full"),M=w.height);var D=I;U||(D-=s/2),Y.style.left=D+"em","\\textcircled"===g.label&&(Y.style.top=".2em"),Y=KA.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:w},{type:"kern",size:-M},{type:"elem",elem:Y}]},B)}var i=KA.makeSpan(["mord","accent"],[Y],B);return E?(E.children[0]=i,E.height=Math.max(i.height,E.height),E.classes[0]="mord",E):i},WB=function(A,B){var Q=A.isStretchy?zB(A.label):new sB.MathNode("mo",[UB(A.label,A.mode)]),g=new sB.MathNode("mover",[hB(A.base,B),Q]);return g.setAttribute("accent","true"),g},SB=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((function(A){return"\\"+A})).join("|"));fA({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(A,B){var Q=B[0],g=!SB.test(A.funcName),E=!g||"\\widehat"===A.funcName||"\\widetilde"===A.funcName||"\\widecheck"===A.funcName;return{type:"accent",mode:A.parser.mode,label:A.funcName,isStretchy:g,isShifty:E,base:Q}},htmlBuilder:aB,mathmlBuilder:WB}),fA({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(A,B){var Q=B[0];return{type:"accent",mode:A.parser.mode,label:A.funcName,isStretchy:!1,isShifty:!0,base:Q}},htmlBuilder:aB,mathmlBuilder:WB}),fA({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(A,B){var Q=A.parser,g=A.funcName,E=B[0];return{type:"accentUnder",mode:Q.mode,label:g,base:E}},htmlBuilder:function(A,B){var Q=IB(A.base,B),g=rB(A,B),E="\\utilde"===A.label?.12:0,w=KA.makeVList({positionType:"top",positionData:Q.height,children:[{type:"elem",elem:g,wrapperClasses:["svg-align"]},{type:"kern",size:E},{type:"elem",elem:Q}]},B);return KA.makeSpan(["mord","accentunder"],[w],B)},mathmlBuilder:function(A,B){var Q=zB(A.label),g=new sB.MathNode("munder",[hB(A.base,B),Q]);return g.setAttribute("accentunder","true"),g}});var LB=function(A){var B=new sB.MathNode("mpadded",A?[A]:[]);return B.setAttribute("width","+0.6em"),B.setAttribute("lspace","0.3em"),B};fA({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(A,B,Q){var g=A.parser,E=A.funcName;return{type:"xArrow",mode:g.mode,label:E,body:B[0],below:Q[0]}},htmlBuilder:function(A,B){var Q,g=B.style,E=B.havingStyle(g.sup()),w=KA.wrapFragment(IB(A.body,E,B),B);w.classes.push("x-arrow-pad"),A.below&&(E=B.havingStyle(g.sub()),(Q=KA.wrapFragment(IB(A.below,E,B),B)).classes.push("x-arrow-pad"));var I,C=rB(A,B),Y=-B.fontMetrics().axisHeight+.5*C.height,M=-B.fontMetrics().axisHeight-.5*C.height-.111;if((w.depth>.25||"\\xleftequilibrium"===A.label)&&(M-=w.depth),Q){var F=-B.fontMetrics().axisHeight+Q.height+.5*C.height+.111;I=KA.makeVList({positionType:"individualShift",children:[{type:"elem",elem:w,shift:M},{type:"elem",elem:C,shift:Y},{type:"elem",elem:Q,shift:F}]},B)}else I=KA.makeVList({positionType:"individualShift",children:[{type:"elem",elem:w,shift:M},{type:"elem",elem:C,shift:Y}]},B);return I.children[0].children[0].children[1].classes.push("svg-align"),KA.makeSpan(["mrel","x-arrow"],[I],B)},mathmlBuilder:function(A,B){var Q,g=zB(A.label);if(A.body){var E=LB(hB(A.body,B));if(A.below){var w=LB(hB(A.below,B));Q=new sB.MathNode("munderover",[g,w,E])}else Q=new sB.MathNode("mover",[g,E])}else if(A.below){var I=LB(hB(A.below,B));Q=new sB.MathNode("munder",[g,I])}else Q=LB(),Q=new sB.MathNode("mover",[g,Q]);return Q}}),fA({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(A,B){for(var Q=A.parser,g=RB(B[0],"ordgroup").body,E="",w=0;w","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],qB=[0,1.2,1.8,2.4,3],_B=[{type:"small",style:y.SCRIPTSCRIPT},{type:"small",style:y.SCRIPT},{type:"small",style:y.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],$B=[{type:"small",style:y.SCRIPTSCRIPT},{type:"small",style:y.SCRIPT},{type:"small",style:y.TEXT},{type:"stack"}],AQ=[{type:"small",style:y.SCRIPTSCRIPT},{type:"small",style:y.SCRIPT},{type:"small",style:y.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],BQ=function(A){if("small"===A.type)return"Main-Regular";if("large"===A.type)return"Size"+A.size+"-Regular";if("stack"===A.type)return"Size4-Regular";throw new Error("Add support for delim type '"+A.type+"' here.")},QQ=function(A,B,Q,g){for(var E=Math.min(2,3-g.style.size);EB)return Q[E]}return Q[Q.length-1]},gQ=function(A,B,Q,g,E,w){var I;"<"===A||"\\lt"===A||"⟨"===A?A="\\langle":">"!==A&&"\\gt"!==A&&"⟩"!==A||(A="\\rangle"),I=c.contains(vB,A)?_B:c.contains(OB,A)?AQ:$B;var C=QQ(A,B,I,g);return"small"===C.type?function(A,B,Q,g,E,w){var I=KA.makeSymbol(A,"Main-Regular",E,g),C=bB(I,B,g,w);return Q&&uB(C,g,B),C}(A,C.style,Q,g,E,w):"large"===C.type?dB(A,C.size,Q,g,E,w):ZB(A,B,Q,g,E,w)},EQ=function(A,B){var Q,g,E=B.havingBaseSizing(),w=QQ("\\surd",A*E.sizeMultiplier,AQ,E),I=E.sizeMultiplier,C=Math.max(0,B.minRuleThickness-B.fontMetrics().sqrtRuleThickness),Y=0,M=0,F=0;return"small"===w.type?(A<1?I=1:A<1.4&&(I=.7),M=(1+C)/I,(Q=fB("sqrtMain",Y=(1+C+.08)/I,F=1e3+1e3*C+80,C,B)).style.minWidth="0.853em",g=.833/I):"large"===w.type?(F=1080*qB[w.size],M=(qB[w.size]+C)/I,Y=(qB[w.size]+C+.08)/I,(Q=fB("sqrtSize"+w.size,Y,F,C,B)).style.minWidth="1.02em",g=1/I):(Y=A+C+.08,M=A+C,F=Math.floor(1e3*A+C)+80,(Q=fB("sqrtTall",Y,F,C,B)).style.minWidth="0.742em",g=1.056),Q.height=M,Q.style.height=Y+"em",{span:Q,advanceWidth:g,ruleWidth:(B.fontMetrics().sqrtRuleThickness+C)*I}},wQ=function(A,B,Q,g,E){if("<"===A||"\\lt"===A||"⟨"===A?A="\\langle":">"!==A&&"\\gt"!==A&&"⟩"!==A||(A="\\rangle"),c.contains(OB,A)||c.contains(vB,A))return dB(A,B,!1,Q,g,E);if(c.contains(PB,A))return ZB(A,qB[B],!1,Q,g,E);throw new I("Illegal delimiter: '"+A+"'")},IQ=gQ,CQ=function(A,B,Q,g,E,w){var I=g.fontMetrics().axisHeight*g.sizeMultiplier,C=5/g.fontMetrics().ptPerEm,Y=Math.max(B-I,Q+I),M=Math.max(Y/500*901,2*Y-C);return gQ(A,M,!0,g,E,w)},YQ={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},MQ=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function FQ(A,B){var Q=xB(A);if(Q&&c.contains(MQ,Q.text))return Q;throw new I(Q?"Invalid delimiter '"+Q.text+"' after '"+B.funcName+"'":"Invalid delimiter type '"+A.type+"'",A)}function cQ(A){if(!A.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}fA({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(A,B){var Q=FQ(B[0],A);return{type:"delimsizing",mode:A.parser.mode,size:YQ[A.funcName].size,mclass:YQ[A.funcName].mclass,delim:Q.text}},htmlBuilder:function(A,B){return"."===A.delim?KA.makeSpan([A.mclass]):wQ(A.delim,A.size,B,A.mode,[A.mclass])},mathmlBuilder:function(A){var B=[];"."!==A.delim&&B.push(UB(A.delim,A.mode));var Q=new sB.MathNode("mo",B);return"mopen"===A.mclass||"mclose"===A.mclass?Q.setAttribute("fence","true"):Q.setAttribute("fence","false"),Q}}),fA({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(A,B){var Q=A.parser.gullet.macros.get("\\current@color");if(Q&&"string"!=typeof Q)throw new I("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:A.parser.mode,delim:FQ(B[0],A).text,color:Q}}}),fA({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(A,B){var Q=FQ(B[0],A),g=A.parser;++g.leftrightDepth;var E=g.parseExpression(!1);--g.leftrightDepth,g.expect("\\right",!1);var w=RB(g.parseFunction(),"leftright-right");return{type:"leftright",mode:g.mode,body:E,left:Q.text,right:w.delim,rightColor:w.color}},htmlBuilder:function(A,B){cQ(A);for(var Q,g,E=BB(A.body,B,!0,["mopen","mclose"]),w=0,I=0,C=!1,Y=0;Y-1?"mpadded":"menclose",[hB(A.body,B)]);switch(A.label){case"\\cancel":g.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":g.setAttribute("notation","downdiagonalstrike");break;case"\\sout":g.setAttribute("notation","horizontalstrike");break;case"\\fbox":g.setAttribute("notation","box");break;case"\\fcolorbox":case"\\colorbox":if(Q=B.fontMetrics().fboxsep*B.fontMetrics().ptPerEm,g.setAttribute("width","+"+2*Q+"pt"),g.setAttribute("height","+"+2*Q+"pt"),g.setAttribute("lspace",Q+"pt"),g.setAttribute("voffset",Q+"pt"),"\\fcolorbox"===A.label){var E=Math.max(B.fontMetrics().fboxrule,B.minRuleThickness);g.setAttribute("style","border: "+E+"em solid "+String(A.borderColor))}break;case"\\xcancel":g.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return A.backgroundColor&&g.setAttribute("mathbackground",A.backgroundColor),g};fA({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(A,B,Q){var g=A.parser,E=A.funcName,w=RB(B[0],"color-token").color,I=B[1];return{type:"enclose",mode:g.mode,label:E,backgroundColor:w,body:I}},htmlBuilder:sQ,mathmlBuilder:UQ}),fA({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(A,B,Q){var g=A.parser,E=A.funcName,w=RB(B[0],"color-token").color,I=RB(B[1],"color-token").color,C=B[2];return{type:"enclose",mode:g.mode,label:E,backgroundColor:I,borderColor:w,body:C}},htmlBuilder:sQ,mathmlBuilder:UQ}),fA({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(A,B){return{type:"enclose",mode:A.parser.mode,label:"\\fbox",body:B[0]}}}),fA({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(A,B,Q){var g=A.parser,E=A.funcName,w=B[0];return{type:"enclose",mode:g.mode,label:E,body:w}},htmlBuilder:sQ,mathmlBuilder:UQ});var DQ={};function iQ(A){for(var B=A.type,Q=A.names,g=A.props,E=A.handler,w=A.htmlBuilder,I=A.mathmlBuilder,C={type:B,numArgs:g.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:E},Y=0;Y0&&(t+=.25),M.push({pos:t,isDashed:A[B]})}for(e(w[0]),Q=0;Q0&&(j<(R+=h)&&(j=R),R=0),A.addJot&&(j+=i),o.height=H,o.depth=j,t+=H,o.pos=t,t+=j+R,Y[Q]=o,e(w[Q+1])}var n,x,a=t/2+B.fontMetrics().axisHeight,W=A.cols||[],S=[];for(g=0,x=0;g=C)){var K=void 0;(g>0||A.hskipBeforeAndAfter)&&0!==(K=c.deflt(L.pregap,U))&&((n=KA.makeSpan(["arraycolsep"],[])).style.width=K+"em",S.push(n));var T=[];for(Q=0;Q0){for(var d=KA.makeLineSpan("hline",B,F),p=KA.makeLineSpan("hdashline",B,F),X=[{type:"elem",elem:Y,shift:0}];M.length>0;){var Z=M.pop(),f=Z.pos-a;Z.isDashed?X.push({type:"elem",elem:p,shift:f}):X.push({type:"elem",elem:d,shift:f})}Y=KA.makeVList({positionType:"individualShift",children:X},B)}return KA.makeSpan(["mord"],[Y],B)},eQ={c:"center ",l:"left ",r:"right "},yQ=function(A,B){var Q=new sB.MathNode("mtable",A.body.map((function(A){return new sB.MathNode("mtr",A.map((function(A){return new sB.MathNode("mtd",[hB(A,B)])})))}))),g=.5===A.arraystretch?.1:.16+A.arraystretch-1+(A.addJot?.09:0);Q.setAttribute("rowspacing",g+"em");var E="",w="";if(A.cols&&A.cols.length>0){var I=A.cols,C="",Y=!1,M=0,F=I.length;"separator"===I[0].type&&(E+="top ",M=1),"separator"===I[I.length-1].type&&(E+="bottom ",F-=1);for(var c=M;c0?"left ":"",E+=N[N.length-1].length>0?"right ":"";for(var G=1;G0&&F&&(U=1),g[c]={type:"align",align:s,pregap:U,postgap:0}}return E.colSeparationType=F?"align":"alignat",E};iQ({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(A,B){var Q={cols:(xB(B[0])?[B[0]]:RB(B[0],"ordgroup").body).map((function(A){var B=nB(A).text;if(-1!=="lcr".indexOf(B))return{type:"align",align:B};if("|"===B)return{type:"separator",separator:"|"};if(":"===B)return{type:"separator",separator:":"};throw new I("Unknown column alignment: "+B,A)})),hskipBeforeAndAfter:!0};return GQ(A.parser,Q,hQ(A.envName))},htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(A){var B={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[A.envName],Q=GQ(A.parser,{hskipBeforeAndAfter:!1},hQ(A.envName));return B?{type:"leftright",mode:A.mode,body:[Q],left:B[0],right:B[1],rightColor:void 0}:Q},htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(A){var B=GQ(A.parser,{arraystretch:.5},"script");return B.colSeparationType="small",B},htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["subarray"],props:{numArgs:1},handler:function(A,B){var Q=(xB(B[0])?[B[0]]:RB(B[0],"ordgroup").body).map((function(A){var B=nB(A).text;if(-1!=="lc".indexOf(B))return{type:"align",align:B};throw new I("Unknown column alignment: "+B,A)}));if(Q.length>1)throw new I("{subarray} can contain only one column");var g={cols:Q,hskipBeforeAndAfter:!1,arraystretch:.5};if((g=GQ(A.parser,g,"script")).body.length>0&&g.body[0].length>1)throw new I("{subarray} can contain only one column");return g},htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(A){var B=GQ(A.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},hQ(A.envName));return{type:"leftright",mode:A.mode,body:[B],left:A.envName.indexOf("r")>-1?".":"\\{",right:A.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["aligned"],props:{numArgs:0},handler:JQ,htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["gathered"],props:{numArgs:0},handler:function(A){return GQ(A.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:tQ,mathmlBuilder:yQ}),iQ({type:"array",names:["alignedat"],props:{numArgs:1},handler:JQ,htmlBuilder:tQ,mathmlBuilder:yQ}),fA({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(A,B){throw new I(A.funcName+" valid only within array environment")}});var HQ=DQ;fA({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(A,B){var Q=A.parser,g=A.funcName,E=B[0];if("ordgroup"!==E.type)throw new I("Invalid environment name",E);for(var w="",C=0;C=y.SCRIPT.id?Q.text():y.DISPLAY:"text"===A&&Q.size===y.DISPLAY.size?Q=y.TEXT:"script"===A?Q=y.SCRIPT:"scriptscript"===A&&(Q=y.SCRIPTSCRIPT),Q},WQ=function(A,B){var Q,g=aQ(A.size,B.style),E=g.fracNum(),w=g.fracDen();Q=B.havingStyle(E);var I=IB(A.numer,Q,B);if(A.continued){var C=8.5/B.fontMetrics().ptPerEm,Y=3.5/B.fontMetrics().ptPerEm;I.height=I.height0?3*c:7*c,D=B.fontMetrics().denom1):(F>0?(s=B.fontMetrics().num2,U=c):(s=B.fontMetrics().num3,U=3*c),D=B.fontMetrics().denom2),M){var e=B.fontMetrics().axisHeight;s-I.depth-(e+.5*F)0&&(B="."===(B=A)?null:B),B};fA({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(A,B){var Q,g=A.parser,E=B[4],w=B[5],I="atom"===B[0].type&&"open"===B[0].family?mQ(B[0].text):null,C="atom"===B[1].type&&"close"===B[1].family?mQ(B[1].text):null,Y=RB(B[2],"size"),M=null;Q=!!Y.isBlank||(M=Y.value).number>0;var F="auto",c=B[3];if("ordgroup"===c.type){if(c.body.length>0){var s=RB(c.body[0],"textord");F=LQ[Number(s.text)]}}else c=RB(c,"textord"),F=LQ[Number(c.text)];return{type:"genfrac",mode:g.mode,numer:E,denom:w,continued:!1,hasBarLine:Q,barSize:M,leftDelim:I,rightDelim:C,size:F}},htmlBuilder:WQ,mathmlBuilder:SQ}),fA({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(A,B){var Q=A.parser,g=(A.funcName,A.token);return{type:"infix",mode:Q.mode,replaceWith:"\\\\abovefrac",size:RB(B[0],"size").value,token:g}}}),fA({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(A,B){var Q=A.parser,g=(A.funcName,B[0]),E=function(A){if(!A)throw new Error("Expected non-null, but got "+String(A));return A}(RB(B[1],"infix").size),w=B[2],I=E.number>0;return{type:"genfrac",mode:Q.mode,numer:g,denom:w,continued:!1,hasBarLine:I,barSize:E,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:WQ,mathmlBuilder:SQ});var kQ=function(A,B){var Q,g,E=B.style;"supsub"===A.type?(Q=A.sup?IB(A.sup,B.havingStyle(E.sup()),B):IB(A.sub,B.havingStyle(E.sub()),B),g=RB(A.base,"horizBrace")):g=RB(A,"horizBrace");var w,I=IB(g.base,B.havingBaseStyle(y.DISPLAY)),C=rB(g,B);if(g.isOver?(w=KA.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:I},{type:"kern",size:.1},{type:"elem",elem:C}]},B)).children[0].children[0].children[1].classes.push("svg-align"):(w=KA.makeVList({positionType:"bottom",positionData:I.depth+.1+C.height,children:[{type:"elem",elem:C},{type:"kern",size:.1},{type:"elem",elem:I}]},B)).children[0].children[0].children[0].classes.push("svg-align"),Q){var Y=KA.makeSpan(["mord",g.isOver?"mover":"munder"],[w],B);w=g.isOver?KA.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:Y},{type:"kern",size:.2},{type:"elem",elem:Q}]},B):KA.makeVList({positionType:"bottom",positionData:Y.depth+.2+Q.height+Q.depth,children:[{type:"elem",elem:Q},{type:"kern",size:.2},{type:"elem",elem:Y}]},B)}return KA.makeSpan(["mord",g.isOver?"mover":"munder"],[w],B)};fA({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(A,B){var Q=A.parser,g=A.funcName;return{type:"horizBrace",mode:Q.mode,label:g,isOver:/^\\over/.test(g),base:B[0]}},htmlBuilder:kQ,mathmlBuilder:function(A,B){var Q=zB(A.label);return new sB.MathNode(A.isOver?"mover":"munder",[hB(A.base,B),Q])}}),fA({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(A,B){var Q=A.parser,g=B[1],E=RB(B[0],"url").url;return Q.settings.isTrusted({command:"\\href",url:E})?{type:"href",mode:Q.mode,href:E,body:PA(g)}:Q.formatUnsupportedCmd("\\href")},htmlBuilder:function(A,B){var Q=BB(A.body,B,!1);return KA.makeAnchor(A.href,[],Q,B)},mathmlBuilder:function(A,B){var Q=GB(A.body,B);return Q instanceof FB||(Q=new FB("mrow",[Q])),Q.setAttribute("href",A.href),Q}}),fA({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(A,B){var Q=A.parser,g=RB(B[0],"url").url;if(!Q.settings.isTrusted({command:"\\url",url:g}))return Q.formatUnsupportedCmd("\\url");for(var E=[],w=0;w0&&(g=rA(A.totalheight,B)-Q,g=Number(g.toFixed(2)));var E=0;A.width.number>0&&(E=rA(A.width,B));var w={height:Q+g+"em"};E>0&&(w.width=E+"em"),g>0&&(w.verticalAlign=-g+"em");var I=new S(A.src,A.alt,w);return I.height=Q,I.depth=g,I},mathmlBuilder:function(A,B){var Q=new sB.MathNode("mglyph",[]);Q.setAttribute("alt",A.alt);var g=rA(A.height,B),E=0;if(A.totalheight.number>0&&(E=(E=rA(A.totalheight,B)-g).toFixed(2),Q.setAttribute("valign","-"+E+"em")),Q.setAttribute("height",g+E+"em"),A.width.number>0){var w=rA(A.width,B);Q.setAttribute("width",w+"em")}return Q.setAttribute("src",A.src),Q}}),fA({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(A,B){var Q=A.parser,g=A.funcName,E=RB(B[0],"size");if(Q.settings.strict){var w="m"===g[1],I="mu"===E.value.unit;w?(I||Q.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+g+" supports only mu units, not "+E.value.unit+" units"),"math"!==Q.mode&&Q.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+g+" works only in math mode")):I&&Q.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+g+" doesn't support mu units")}return{type:"kern",mode:Q.mode,dimension:E.value}},htmlBuilder:function(A,B){return KA.makeGlue(A.dimension,B)},mathmlBuilder:function(A,B){var Q=rA(A.dimension,B);return new sB.SpaceNode(Q)}}),fA({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(A,B){var Q=A.parser,g=A.funcName,E=B[0];return{type:"lap",mode:Q.mode,alignment:g.slice(5),body:E}},htmlBuilder:function(A,B){var Q;"clap"===A.alignment?(Q=KA.makeSpan([],[IB(A.body,B)]),Q=KA.makeSpan(["inner"],[Q],B)):Q=KA.makeSpan(["inner"],[IB(A.body,B)]);var g=KA.makeSpan(["fix"],[]),E=KA.makeSpan([A.alignment],[Q,g],B),w=KA.makeSpan(["strut"]);return w.style.height=E.height+E.depth+"em",w.style.verticalAlign=-E.depth+"em",E.children.unshift(w),E=KA.makeSpan(["thinbox"],[E],B),KA.makeSpan(["mord","vbox"],[E],B)},mathmlBuilder:function(A,B){var Q=new sB.MathNode("mpadded",[hB(A.body,B)]);if("rlap"!==A.alignment){var g="llap"===A.alignment?"-1":"-0.5";Q.setAttribute("lspace",g+"width")}return Q.setAttribute("width","0px"),Q}}),fA({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(A,B){var Q=A.funcName,g=A.parser,E=g.mode;g.switchMode("math");var w="\\("===Q?"\\)":"$",I=g.parseExpression(!1,w);return g.expect(w),g.switchMode(E),{type:"styling",mode:g.mode,style:"text",body:I}}}),fA({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(A,B){throw new I("Mismatched "+A.funcName)}});var KQ=function(A,B){switch(B.style.size){case y.DISPLAY.size:return A.display;case y.TEXT.size:return A.text;case y.SCRIPT.size:return A.script;case y.SCRIPTSCRIPT.size:return A.scriptscript;default:return A.text}};fA({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(A,B){return{type:"mathchoice",mode:A.parser.mode,display:PA(B[0]),text:PA(B[1]),script:PA(B[2]),scriptscript:PA(B[3])}},htmlBuilder:function(A,B){var Q=KQ(A,B),g=BB(Q,B,!1);return KA.makeFragment(g)},mathmlBuilder:function(A,B){var Q=KQ(A,B);return GB(Q,B)}});var TQ=function(A,B,Q,g,E,w,I){var C,Y,M;if(A=KA.makeSpan([],[A]),B){var F=IB(B,g.havingStyle(E.sup()),g);Y={elem:F,kern:Math.max(g.fontMetrics().bigOpSpacing1,g.fontMetrics().bigOpSpacing3-F.depth)}}if(Q){var c=IB(Q,g.havingStyle(E.sub()),g);C={elem:c,kern:Math.max(g.fontMetrics().bigOpSpacing2,g.fontMetrics().bigOpSpacing4-c.height)}}if(Y&&C){var s=g.fontMetrics().bigOpSpacing5+C.elem.height+C.elem.depth+C.kern+A.depth+I;M=KA.makeVList({positionType:"bottom",positionData:s,children:[{type:"kern",size:g.fontMetrics().bigOpSpacing5},{type:"elem",elem:C.elem,marginLeft:-w+"em"},{type:"kern",size:C.kern},{type:"elem",elem:A},{type:"kern",size:Y.kern},{type:"elem",elem:Y.elem,marginLeft:w+"em"},{type:"kern",size:g.fontMetrics().bigOpSpacing5}]},g)}else if(C){var U=A.height-I;M=KA.makeVList({positionType:"top",positionData:U,children:[{type:"kern",size:g.fontMetrics().bigOpSpacing5},{type:"elem",elem:C.elem,marginLeft:-w+"em"},{type:"kern",size:C.kern},{type:"elem",elem:A}]},g)}else{if(!Y)return A;var D=A.depth+I;M=KA.makeVList({positionType:"bottom",positionData:D,children:[{type:"elem",elem:A},{type:"kern",size:Y.kern},{type:"elem",elem:Y.elem,marginLeft:w+"em"},{type:"kern",size:g.fontMetrics().bigOpSpacing5}]},g)}return KA.makeSpan(["mop","op-limits"],[M],g)},VQ=["\\smallint"],bQ=function(A,B){var Q,g,E,w=!1;"supsub"===A.type?(Q=A.sup,g=A.sub,E=RB(A.base,"op"),w=!0):E=RB(A,"op");var I,C=B.style,Y=!1;if(C.size===y.DISPLAY.size&&E.symbol&&!c.contains(VQ,E.name)&&(Y=!0),E.symbol){var M=Y?"Size2-Regular":"Size1-Regular",F="";if("\\oiint"!==E.name&&"\\oiiint"!==E.name||(F=E.name.substr(1),E.name="oiint"===F?"\\iint":"\\iiint"),I=KA.makeSymbol(E.name,M,"math",B,["mop","op-symbol",Y?"large-op":"small-op"]),F.length>0){var s=I.italic,U=KA.staticSvg(F+"Size"+(Y?"2":"1"),B);I=KA.makeVList({positionType:"individualShift",children:[{type:"elem",elem:I,shift:0},{type:"elem",elem:U,shift:Y?.08:0}]},B),E.name="\\"+F,I.classes.unshift("mop"),I.italic=s}}else if(E.body){var D=BB(E.body,B,!0);1===D.length&&D[0]instanceof m?(I=D[0]).classes[0]="mop":I=KA.makeSpan(["mop"],KA.tryCombineChars(D),B)}else{for(var i=[],N=1;N0){for(var C=E.body.map((function(A){var B=A.text;return"string"==typeof B?{type:"textord",mode:A.mode,text:B}:A})),Y=BB(C,B.withFont("mathrm"),!0),M=0;M=0?C.setAttribute("height","+"+E+"em"):(C.setAttribute("height",E+"em"),C.setAttribute("depth","+"+-E+"em")),C.setAttribute("voffset",E+"em"),C}});var fQ=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];fA({type:"sizing",names:fQ,props:{numArgs:0,allowedInText:!0},handler:function(A,B){var Q=A.breakOnTokenText,g=A.funcName,E=A.parser,w=E.parseExpression(!1,Q);return{type:"sizing",mode:E.mode,size:fQ.indexOf(g)+1,body:w}},htmlBuilder:function(A,B){var Q=B.havingSize(A.size);return ZQ(A.body,Q,B)},mathmlBuilder:function(A,B){var Q=B.havingSize(A.size),g=NB(A.body,Q),E=new sB.MathNode("mstyle",g);return E.setAttribute("mathsize",Q.sizeMultiplier+"em"),E}}),fA({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(A,B,Q){var g=A.parser,E=!1,w=!1,I=Q[0]&&RB(Q[0],"ordgroup");if(I)for(var C="",Y=0;YQ.height+Q.depth+w&&(w=(w+c-Q.height-Q.depth)/2);var s=Y.height-Q.height-w-M;Q.style.paddingLeft=F+"em";var U=KA.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:Q,wrapperClasses:["svg-align"]},{type:"kern",size:-(Q.height+s)},{type:"elem",elem:Y},{type:"kern",size:M}]},B);if(A.index){var D=B.havingStyle(y.SCRIPTSCRIPT),i=IB(A.index,D,B),N=.6*(U.height-U.depth),G=KA.makeVList({positionType:"shift",positionData:-N,children:[{type:"elem",elem:i}]},B),h=KA.makeSpan(["root"],[G]);return KA.makeSpan(["mord","sqrt"],[h,U],B)}return KA.makeSpan(["mord","sqrt"],[U],B)},mathmlBuilder:function(A,B){var Q=A.body,g=A.index;return g?new sB.MathNode("mroot",[hB(Q,B),hB(g,B)]):new sB.MathNode("msqrt",[hB(Q,B)])}});var OQ={display:y.DISPLAY,text:y.TEXT,script:y.SCRIPT,scriptscript:y.SCRIPTSCRIPT};fA({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(A,B){var Q=A.breakOnTokenText,g=A.funcName,E=A.parser,w=E.parseExpression(!0,Q),I=g.slice(1,g.length-5);return{type:"styling",mode:E.mode,style:I,body:w}},htmlBuilder:function(A,B){var Q=OQ[A.style],g=B.havingStyle(Q).withFont("");return ZQ(A.body,g,B)},mathmlBuilder:function(A,B){var Q=OQ[A.style],g=B.havingStyle(Q),E=NB(A.body,g),w=new sB.MathNode("mstyle",E),I={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[A.style];return w.setAttribute("scriptlevel",I[0]),w.setAttribute("displaystyle",I[1]),w}}),OA({type:"supsub",htmlBuilder:function(A,B){var Q=function(A,B){var Q=A.base;return Q?"op"===Q.type?Q.limits&&(B.style.size===y.DISPLAY.size||Q.alwaysHandleSupSub)?bQ:null:"operatorname"===Q.type?Q.alwaysHandleSupSub&&(B.style.size===y.DISPLAY.size||Q.limits)?XQ:null:"accent"===Q.type?c.isCharacterBox(Q.base)?aB:null:"horizBrace"===Q.type&&!A.sub===Q.isOver?kQ:null:null}(A,B);if(Q)return Q(A,B);var g,E,w,I=A.base,C=A.sup,Y=A.sub,M=IB(I,B),F=B.fontMetrics(),s=0,U=0,D=I&&c.isCharacterBox(I);if(C){var i=B.havingStyle(B.style.sup());g=IB(C,i,B),D||(s=M.height-i.fontMetrics().supDrop*i.sizeMultiplier/B.sizeMultiplier)}if(Y){var N=B.havingStyle(B.style.sub());E=IB(Y,N,B),D||(U=M.depth+N.fontMetrics().subDrop*N.sizeMultiplier/B.sizeMultiplier)}w=B.style===y.DISPLAY?F.sup1:B.style.cramped?F.sup3:F.sup2;var G,h=B.sizeMultiplier,t=.5/F.ptPerEm/h+"em",e=null;if(E){var J=A.base&&"op"===A.base.type&&A.base.name&&("\\oiint"===A.base.name||"\\oiiint"===A.base.name);(M instanceof m||J)&&(e=-M.italic+"em")}if(g&&E){s=Math.max(s,w,g.depth+.25*F.xHeight),U=Math.max(U,F.sub2);var H=4*F.defaultRuleThickness;if(s-g.depth-(E.height-U)0&&(s+=j,U-=j)}var o=[{type:"elem",elem:E,shift:U,marginRight:t,marginLeft:e},{type:"elem",elem:g,shift:-s,marginRight:t}];G=KA.makeVList({positionType:"individualShift",children:o},B)}else if(E){U=Math.max(U,F.sub1,E.height-.8*F.xHeight);var z=[{type:"elem",elem:E,marginLeft:e,marginRight:t}];G=KA.makeVList({positionType:"shift",positionData:U,children:z},B)}else{if(!g)throw new Error("supsub must have either sup or sub.");s=Math.max(s,w,g.depth+.25*F.xHeight),G=KA.makeVList({positionType:"shift",positionData:-s,children:[{type:"elem",elem:g,marginRight:t}]},B)}var r=EB(M,"right")||"mord";return KA.makeSpan([r],[M,KA.makeSpan(["msupsub"],[G])],B)},mathmlBuilder:function(A,B){var Q,g=!1;A.base&&"horizBrace"===A.base.type&&!!A.sup===A.base.isOver&&(g=!0,Q=A.base.isOver),!A.base||"op"!==A.base.type&&"operatorname"!==A.base.type||(A.base.parentIsSupSub=!0);var E,w=[hB(A.base,B)];if(A.sub&&w.push(hB(A.sub,B)),A.sup&&w.push(hB(A.sup,B)),g)E=Q?"mover":"munder";else if(A.sub)if(A.sup){var I=A.base;E=I&&"op"===I.type&&I.limits&&B.style===y.DISPLAY||I&&"operatorname"===I.type&&I.alwaysHandleSupSub&&(B.style===y.DISPLAY||I.limits)?"munderover":"msubsup"}else{var C=A.base;E=C&&"op"===C.type&&C.limits&&(B.style===y.DISPLAY||C.alwaysHandleSupSub)||C&&"operatorname"===C.type&&C.alwaysHandleSupSub&&(C.limits||B.style===y.DISPLAY)?"munder":"msub"}else{var Y=A.base;E=Y&&"op"===Y.type&&Y.limits&&(B.style===y.DISPLAY||Y.alwaysHandleSupSub)||Y&&"operatorname"===Y.type&&Y.alwaysHandleSupSub&&(Y.limits||B.style===y.DISPLAY)?"mover":"msup"}return new sB.MathNode(E,w)}}),OA({type:"atom",htmlBuilder:function(A,B){return KA.mathsym(A.text,A.mode,B,["m"+A.family])},mathmlBuilder:function(A,B){var Q=new sB.MathNode("mo",[UB(A.text,A.mode)]);if("bin"===A.family){var g=iB(A,B);"bold-italic"===g&&Q.setAttribute("mathvariant",g)}else"punct"===A.family?Q.setAttribute("separator","true"):"open"!==A.family&&"close"!==A.family||Q.setAttribute("stretchy","false");return Q}});var PQ={mi:"italic",mn:"normal",mtext:"normal"};OA({type:"mathord",htmlBuilder:function(A,B){return KA.makeOrd(A,B,"mathord")},mathmlBuilder:function(A,B){var Q=new sB.MathNode("mi",[UB(A.text,A.mode,B)]),g=iB(A,B)||"italic";return g!==PQ[Q.type]&&Q.setAttribute("mathvariant",g),Q}}),OA({type:"textord",htmlBuilder:function(A,B){return KA.makeOrd(A,B,"textord")},mathmlBuilder:function(A,B){var Q,g=UB(A.text,A.mode,B),E=iB(A,B)||"normal";return Q="text"===A.mode?new sB.MathNode("mtext",[g]):/[0-9]/.test(A.text)?new sB.MathNode("mn",[g]):"\\prime"===A.text?new sB.MathNode("mo",[g]):new sB.MathNode("mi",[g]),E!==PQ[Q.type]&&Q.setAttribute("mathvariant",E),Q}});var vQ={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},qQ={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};OA({type:"spacing",htmlBuilder:function(A,B){if(qQ.hasOwnProperty(A.text)){var Q=qQ[A.text].className||"";if("text"===A.mode){var g=KA.makeOrd(A,B,"textord");return g.classes.push(Q),g}return KA.makeSpan(["mspace",Q],[KA.mathsym(A.text,A.mode,B)],B)}if(vQ.hasOwnProperty(A.text))return KA.makeSpan(["mspace",vQ[A.text]],[],B);throw new I('Unknown type of space "'+A.text+'"')},mathmlBuilder:function(A,B){if(!qQ.hasOwnProperty(A.text)){if(vQ.hasOwnProperty(A.text))return new sB.MathNode("mspace");throw new I('Unknown type of space "'+A.text+'"')}return new sB.MathNode("mtext",[new sB.TextNode(" ")])}});var _Q=function(){var A=new sB.MathNode("mtd",[]);return A.setAttribute("width","50%"),A};OA({type:"tag",mathmlBuilder:function(A,B){var Q=new sB.MathNode("mtable",[new sB.MathNode("mtr",[_Q(),new sB.MathNode("mtd",[GB(A.body,B)]),_Q(),new sB.MathNode("mtd",[GB(A.tag,B)])])]);return Q.setAttribute("width","100%"),Q}});var $Q={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Ag={"\\textbf":"textbf","\\textmd":"textmd"},Bg={"\\textit":"textit","\\textup":"textup"},Qg=function(A,B){var Q=A.font;return Q?$Q[Q]?B.withTextFontFamily($Q[Q]):Ag[Q]?B.withTextFontWeight(Ag[Q]):B.withTextFontShape(Bg[Q]):B};fA({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0},handler:function(A,B){var Q=A.parser,g=A.funcName,E=B[0];return{type:"text",mode:Q.mode,body:PA(E),font:g}},htmlBuilder:function(A,B){var Q=Qg(A,B),g=BB(A.body,Q,!0);return KA.makeSpan(["mord","text"],KA.tryCombineChars(g),Q)},mathmlBuilder:function(A,B){var Q=Qg(A,B);return GB(A.body,Q)}}),fA({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(A,B){return{type:"underline",mode:A.parser.mode,body:B[0]}},htmlBuilder:function(A,B){var Q=IB(A.body,B),g=KA.makeLineSpan("underline-line",B),E=B.fontMetrics().defaultRuleThickness,w=KA.makeVList({positionType:"top",positionData:Q.height,children:[{type:"kern",size:E},{type:"elem",elem:g},{type:"kern",size:3*E},{type:"elem",elem:Q}]},B);return KA.makeSpan(["mord","underline"],[w],B)},mathmlBuilder:function(A,B){var Q=new sB.MathNode("mo",[new sB.TextNode("‾")]);Q.setAttribute("stretchy","true");var g=new sB.MathNode("munder",[hB(A.body,B),Q]);return g.setAttribute("accentunder","true"),g}}),fA({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(A,B,Q){throw new I("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(A,B){for(var Q=gg(A),g=[],E=B.havingStyle(B.style.text()),w=0;w0&&(this.undefStack[this.undefStack.length-1][A]=B)}else{var E=this.undefStack[this.undefStack.length-1];E&&!E.hasOwnProperty(A)&&(E[A]=this.current[A])}this.current[A]=B},A}(),Mg={},Fg=Mg;function cg(A,B){Mg[A]=B}cg("\\noexpand",(function(A){var B=A.popToken();return A.isExpandable(B.text)&&(B.noexpand=!0,B.treatAsRelax=!0),{tokens:[B],numArgs:0}})),cg("\\expandafter",(function(A){var B=A.popToken();return A.expandOnce(!0),{tokens:[B],numArgs:0}})),cg("\\@firstoftwo",(function(A){return{tokens:A.consumeArgs(2)[0],numArgs:0}})),cg("\\@secondoftwo",(function(A){return{tokens:A.consumeArgs(2)[1],numArgs:0}})),cg("\\@ifnextchar",(function(A){var B=A.consumeArgs(3);A.consumeSpaces();var Q=A.future();return 1===B[0].length&&B[0][0].text===Q.text?{tokens:B[1],numArgs:0}:{tokens:B[2],numArgs:0}})),cg("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),cg("\\TextOrMath",(function(A){var B=A.consumeArgs(2);return"text"===A.mode?{tokens:B[0],numArgs:0}:{tokens:B[1],numArgs:0}}));var sg={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};cg("\\char",(function(A){var B,Q=A.popToken(),g="";if("'"===Q.text)B=8,Q=A.popToken();else if('"'===Q.text)B=16,Q=A.popToken();else if("`"===Q.text)if("\\"===(Q=A.popToken()).text[0])g=Q.text.charCodeAt(1);else{if("EOF"===Q.text)throw new I("\\char` missing argument");g=Q.text.charCodeAt(0)}else B=10;if(B){if(null==(g=sg[Q.text])||g>=B)throw new I("Invalid base-"+B+" digit "+Q.text);for(var E;null!=(E=sg[A.future().text])&&E":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};cg("\\dots",(function(A){var B="\\dotso",Q=A.expandAfterFuture().text;return Q in Dg?B=Dg[Q]:("\\not"===Q.substr(0,4)||Q in O.math&&c.contains(["bin","rel"],O.math[Q].group))&&(B="\\dotsb"),B}));var ig={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};cg("\\dotso",(function(A){return A.future().text in ig?"\\ldots\\,":"\\ldots"})),cg("\\dotsc",(function(A){var B=A.future().text;return B in ig&&","!==B?"\\ldots\\,":"\\ldots"})),cg("\\cdots",(function(A){return A.future().text in ig?"\\@cdots\\,":"\\@cdots"})),cg("\\dotsb","\\cdots"),cg("\\dotsm","\\cdots"),cg("\\dotsi","\\!\\cdots"),cg("\\dotsx","\\ldots\\,"),cg("\\DOTSI","\\relax"),cg("\\DOTSB","\\relax"),cg("\\DOTSX","\\relax"),cg("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),cg("\\,","\\tmspace+{3mu}{.1667em}"),cg("\\thinspace","\\,"),cg("\\>","\\mskip{4mu}"),cg("\\:","\\tmspace+{4mu}{.2222em}"),cg("\\medspace","\\:"),cg("\\;","\\tmspace+{5mu}{.2777em}"),cg("\\thickspace","\\;"),cg("\\!","\\tmspace-{3mu}{.1667em}"),cg("\\negthinspace","\\!"),cg("\\negmedspace","\\tmspace-{4mu}{.2222em}"),cg("\\negthickspace","\\tmspace-{5mu}{.277em}"),cg("\\enspace","\\kern.5em "),cg("\\enskip","\\hskip.5em\\relax"),cg("\\quad","\\hskip1em\\relax"),cg("\\qquad","\\hskip2em\\relax"),cg("\\tag","\\@ifstar\\tag@literal\\tag@paren"),cg("\\tag@paren","\\tag@literal{({#1})}"),cg("\\tag@literal",(function(A){if(A.macros.get("\\df@tag"))throw new I("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),cg("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),cg("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),cg("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),cg("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),cg("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),cg("\\\\","\\newline"),cg("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Ng=V["Main-Regular"]["T".charCodeAt(0)][1]-.7*V["Main-Regular"]["A".charCodeAt(0)][1]+"em";cg("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Ng+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),cg("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Ng+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),cg("\\hspace","\\@ifstar\\@hspacer\\@hspace"),cg("\\@hspace","\\hskip #1\\relax"),cg("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),cg("\\ordinarycolon",":"),cg("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),cg("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),cg("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),cg("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),cg("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),cg("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),cg("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),cg("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),cg("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),cg("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),cg("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),cg("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),cg("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),cg("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),cg("∷","\\dblcolon"),cg("∹","\\eqcolon"),cg("≔","\\coloneqq"),cg("≕","\\eqqcolon"),cg("⩴","\\Coloneqq"),cg("\\ratio","\\vcentcolon"),cg("\\coloncolon","\\dblcolon"),cg("\\colonequals","\\coloneqq"),cg("\\coloncolonequals","\\Coloneqq"),cg("\\equalscolon","\\eqqcolon"),cg("\\equalscoloncolon","\\Eqqcolon"),cg("\\colonminus","\\coloneq"),cg("\\coloncolonminus","\\Coloneq"),cg("\\minuscolon","\\eqcolon"),cg("\\minuscoloncolon","\\Eqcolon"),cg("\\coloncolonapprox","\\Colonapprox"),cg("\\coloncolonsim","\\Colonsim"),cg("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),cg("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),cg("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),cg("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),cg("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"),cg("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),cg("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),cg("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}"),cg("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}"),cg("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}"),cg("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}"),cg("\\nleqq","\\html@mathml{\\@nleqq}{≰}"),cg("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}"),cg("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}"),cg("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}"),cg("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}"),cg("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}"),cg("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}"),cg("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}"),cg("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}"),cg("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}"),cg("\\imath","\\html@mathml{\\@imath}{ı}"),cg("\\jmath","\\html@mathml{\\@jmath}{ȷ}"),cg("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"),cg("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"),cg("⟦","\\llbracket"),cg("⟧","\\rrbracket"),cg("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"),cg("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"),cg("⦃","\\lBrace"),cg("⦄","\\rBrace"),cg("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"),cg("⦵","\\minuso"),cg("\\darr","\\downarrow"),cg("\\dArr","\\Downarrow"),cg("\\Darr","\\Downarrow"),cg("\\lang","\\langle"),cg("\\rang","\\rangle"),cg("\\uarr","\\uparrow"),cg("\\uArr","\\Uparrow"),cg("\\Uarr","\\Uparrow"),cg("\\N","\\mathbb{N}"),cg("\\R","\\mathbb{R}"),cg("\\Z","\\mathbb{Z}"),cg("\\alef","\\aleph"),cg("\\alefsym","\\aleph"),cg("\\Alpha","\\mathrm{A}"),cg("\\Beta","\\mathrm{B}"),cg("\\bull","\\bullet"),cg("\\Chi","\\mathrm{X}"),cg("\\clubs","\\clubsuit"),cg("\\cnums","\\mathbb{C}"),cg("\\Complex","\\mathbb{C}"),cg("\\Dagger","\\ddagger"),cg("\\diamonds","\\diamondsuit"),cg("\\empty","\\emptyset"),cg("\\Epsilon","\\mathrm{E}"),cg("\\Eta","\\mathrm{H}"),cg("\\exist","\\exists"),cg("\\harr","\\leftrightarrow"),cg("\\hArr","\\Leftrightarrow"),cg("\\Harr","\\Leftrightarrow"),cg("\\hearts","\\heartsuit"),cg("\\image","\\Im"),cg("\\infin","\\infty"),cg("\\Iota","\\mathrm{I}"),cg("\\isin","\\in"),cg("\\Kappa","\\mathrm{K}"),cg("\\larr","\\leftarrow"),cg("\\lArr","\\Leftarrow"),cg("\\Larr","\\Leftarrow"),cg("\\lrarr","\\leftrightarrow"),cg("\\lrArr","\\Leftrightarrow"),cg("\\Lrarr","\\Leftrightarrow"),cg("\\Mu","\\mathrm{M}"),cg("\\natnums","\\mathbb{N}"),cg("\\Nu","\\mathrm{N}"),cg("\\Omicron","\\mathrm{O}"),cg("\\plusmn","\\pm"),cg("\\rarr","\\rightarrow"),cg("\\rArr","\\Rightarrow"),cg("\\Rarr","\\Rightarrow"),cg("\\real","\\Re"),cg("\\reals","\\mathbb{R}"),cg("\\Reals","\\mathbb{R}"),cg("\\Rho","\\mathrm{P}"),cg("\\sdot","\\cdot"),cg("\\sect","\\S"),cg("\\spades","\\spadesuit"),cg("\\sub","\\subset"),cg("\\sube","\\subseteq"),cg("\\supe","\\supseteq"),cg("\\Tau","\\mathrm{T}"),cg("\\thetasym","\\vartheta"),cg("\\weierp","\\wp"),cg("\\Zeta","\\mathrm{Z}"),cg("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),cg("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),cg("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),cg("\\bra","\\mathinner{\\langle{#1}|}"),cg("\\ket","\\mathinner{|{#1}\\rangle}"),cg("\\braket","\\mathinner{\\langle{#1}\\rangle}"),cg("\\Bra","\\left\\langle#1\\right|"),cg("\\Ket","\\left|#1\\right\\rangle"),cg("\\blue","\\textcolor{##6495ed}{#1}"),cg("\\orange","\\textcolor{##ffa500}{#1}"),cg("\\pink","\\textcolor{##ff00af}{#1}"),cg("\\red","\\textcolor{##df0030}{#1}"),cg("\\green","\\textcolor{##28ae7b}{#1}"),cg("\\gray","\\textcolor{gray}{#1}"),cg("\\purple","\\textcolor{##9d38bd}{#1}"),cg("\\blueA","\\textcolor{##ccfaff}{#1}"),cg("\\blueB","\\textcolor{##80f6ff}{#1}"),cg("\\blueC","\\textcolor{##63d9ea}{#1}"),cg("\\blueD","\\textcolor{##11accd}{#1}"),cg("\\blueE","\\textcolor{##0c7f99}{#1}"),cg("\\tealA","\\textcolor{##94fff5}{#1}"),cg("\\tealB","\\textcolor{##26edd5}{#1}"),cg("\\tealC","\\textcolor{##01d1c1}{#1}"),cg("\\tealD","\\textcolor{##01a995}{#1}"),cg("\\tealE","\\textcolor{##208170}{#1}"),cg("\\greenA","\\textcolor{##b6ffb0}{#1}"),cg("\\greenB","\\textcolor{##8af281}{#1}"),cg("\\greenC","\\textcolor{##74cf70}{#1}"),cg("\\greenD","\\textcolor{##1fab54}{#1}"),cg("\\greenE","\\textcolor{##0d923f}{#1}"),cg("\\goldA","\\textcolor{##ffd0a9}{#1}"),cg("\\goldB","\\textcolor{##ffbb71}{#1}"),cg("\\goldC","\\textcolor{##ff9c39}{#1}"),cg("\\goldD","\\textcolor{##e07d10}{#1}"),cg("\\goldE","\\textcolor{##a75a05}{#1}"),cg("\\redA","\\textcolor{##fca9a9}{#1}"),cg("\\redB","\\textcolor{##ff8482}{#1}"),cg("\\redC","\\textcolor{##f9685d}{#1}"),cg("\\redD","\\textcolor{##e84d39}{#1}"),cg("\\redE","\\textcolor{##bc2612}{#1}"),cg("\\maroonA","\\textcolor{##ffbde0}{#1}"),cg("\\maroonB","\\textcolor{##ff92c6}{#1}"),cg("\\maroonC","\\textcolor{##ed5fa6}{#1}"),cg("\\maroonD","\\textcolor{##ca337c}{#1}"),cg("\\maroonE","\\textcolor{##9e034e}{#1}"),cg("\\purpleA","\\textcolor{##ddd7ff}{#1}"),cg("\\purpleB","\\textcolor{##c6b9fc}{#1}"),cg("\\purpleC","\\textcolor{##aa87ff}{#1}"),cg("\\purpleD","\\textcolor{##7854ab}{#1}"),cg("\\purpleE","\\textcolor{##543b78}{#1}"),cg("\\mintA","\\textcolor{##f5f9e8}{#1}"),cg("\\mintB","\\textcolor{##edf2df}{#1}"),cg("\\mintC","\\textcolor{##e0e5cc}{#1}"),cg("\\grayA","\\textcolor{##f6f7f7}{#1}"),cg("\\grayB","\\textcolor{##f0f1f2}{#1}"),cg("\\grayC","\\textcolor{##e3e5e6}{#1}"),cg("\\grayD","\\textcolor{##d6d8da}{#1}"),cg("\\grayE","\\textcolor{##babec2}{#1}"),cg("\\grayF","\\textcolor{##888d93}{#1}"),cg("\\grayG","\\textcolor{##626569}{#1}"),cg("\\grayH","\\textcolor{##3b3e40}{#1}"),cg("\\grayI","\\textcolor{##21242c}{#1}"),cg("\\kaBlue","\\textcolor{##314453}{#1}"),cg("\\kaGreen","\\textcolor{##71B307}{#1}");var Gg={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},hg=function(){function A(A,B,Q){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=B,this.expansionCount=0,this.feed(A),this.macros=new Yg(Fg,B.macros),this.mode=Q,this.stack=[]}var B=A.prototype;return B.feed=function(A){this.lexer=new Cg(A,this.settings)},B.switchMode=function(A){this.mode=A},B.beginGroup=function(){this.macros.beginGroup()},B.endGroup=function(){this.macros.endGroup()},B.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},B.popToken=function(){return this.future(),this.stack.pop()},B.pushToken=function(A){this.stack.push(A)},B.pushTokens=function(A){var B;(B=this.stack).push.apply(B,A)},B.consumeSpaces=function(){for(;" "===this.future().text;)this.stack.pop()},B.consumeArgs=function(A){for(var B=[],Q=0;Qthis.settings.maxExpand)throw new I("Too many expansions: infinite loop or need to increase maxExpand setting");var E=g.tokens;if(g.numArgs)for(var w=this.consumeArgs(g.numArgs),C=(E=E.slice()).length-1;C>=0;--C){var Y=E[C];if("#"===Y.text){if(0===C)throw new I("Incomplete placeholder at end of macro body",Y);if("#"===(Y=E[--C]).text)E.splice(C+1,1);else{if(!/^[1-9]$/.test(Y.text))throw new I("Not a valid argument number",Y);var M;(M=E).splice.apply(M,[C,2].concat(w[+Y.text-1]))}}}return this.pushTokens(E),E},B.expandAfterFuture=function(){return this.expandOnce(),this.future()},B.expandNextToken=function(){for(;;){var A=this.expandOnce();if(A instanceof E){if("\\relax"!==A.text&&!A.treatAsRelax)return this.stack.pop();this.stack.pop()}}throw new Error},B.expandMacro=function(A){return this.macros.has(A)?this.expandTokens([new E(A)]):void 0},B.expandTokens=function(A){var B=[],Q=this.stack.length;for(this.pushTokens(A);this.stack.length>Q;){var g=this.expandOnce(!0);g instanceof E&&(g.treatAsRelax&&(g.noexpand=!1,g.treatAsRelax=!1),B.push(this.stack.pop()))}return B},B.expandMacroAsText=function(A){var B=this.expandMacro(A);return B?B.map((function(A){return A.text})).join(""):B},B._getExpansion=function(A){var B=this.macros.get(A);if(null==B)return B;var Q="function"==typeof B?B(this):B;if("string"==typeof Q){var g=0;if(-1!==Q.indexOf("#"))for(var E=Q.replace(/##/g,"");-1!==E.indexOf("#"+(g+1));)++g;for(var w=new Cg(Q,this.settings),I=[],C=w.lex();"EOF"!==C.text;)I.push(C),C=w.lex();return I.reverse(),{tokens:I,numArgs:g}}return Q},B.isDefined=function(A){return this.macros.has(A)||Eg.hasOwnProperty(A)||O.math.hasOwnProperty(A)||O.text.hasOwnProperty(A)||Gg.hasOwnProperty(A)},B.isExpandable=function(A){var B=this.macros.get(A);return null!=B?"string"==typeof B||"function"==typeof B||!B.unexpandable:Eg.hasOwnProperty(A)},A}(),tg={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"}},eg={"á":"á","à":"à","ä":"ä","ǟ":"ǟ","ã":"ã","ā":"ā","ă":"ă","ắ":"ắ","ằ":"ằ","ẵ":"ẵ","ǎ":"ǎ","â":"â","ấ":"ấ","ầ":"ầ","ẫ":"ẫ","ȧ":"ȧ","ǡ":"ǡ","å":"å","ǻ":"ǻ","ḃ":"ḃ","ć":"ć","č":"č","ĉ":"ĉ","ċ":"ċ","ď":"ď","ḋ":"ḋ","é":"é","è":"è","ë":"ë","ẽ":"ẽ","ē":"ē","ḗ":"ḗ","ḕ":"ḕ","ĕ":"ĕ","ě":"ě","ê":"ê","ế":"ế","ề":"ề","ễ":"ễ","ė":"ė","ḟ":"ḟ","ǵ":"ǵ","ḡ":"ḡ","ğ":"ğ","ǧ":"ǧ","ĝ":"ĝ","ġ":"ġ","ḧ":"ḧ","ȟ":"ȟ","ĥ":"ĥ","ḣ":"ḣ","í":"í","ì":"ì","ï":"ï","ḯ":"ḯ","ĩ":"ĩ","ī":"ī","ĭ":"ĭ","ǐ":"ǐ","î":"î","ǰ":"ǰ","ĵ":"ĵ","ḱ":"ḱ","ǩ":"ǩ","ĺ":"ĺ","ľ":"ľ","ḿ":"ḿ","ṁ":"ṁ","ń":"ń","ǹ":"ǹ","ñ":"ñ","ň":"ň","ṅ":"ṅ","ó":"ó","ò":"ò","ö":"ö","ȫ":"ȫ","õ":"õ","ṍ":"ṍ","ṏ":"ṏ","ȭ":"ȭ","ō":"ō","ṓ":"ṓ","ṑ":"ṑ","ŏ":"ŏ","ǒ":"ǒ","ô":"ô","ố":"ố","ồ":"ồ","ỗ":"ỗ","ȯ":"ȯ","ȱ":"ȱ","ő":"ő","ṕ":"ṕ","ṗ":"ṗ","ŕ":"ŕ","ř":"ř","ṙ":"ṙ","ś":"ś","ṥ":"ṥ","š":"š","ṧ":"ṧ","ŝ":"ŝ","ṡ":"ṡ","ẗ":"ẗ","ť":"ť","ṫ":"ṫ","ú":"ú","ù":"ù","ü":"ü","ǘ":"ǘ","ǜ":"ǜ","ǖ":"ǖ","ǚ":"ǚ","ũ":"ũ","ṹ":"ṹ","ū":"ū","ṻ":"ṻ","ŭ":"ŭ","ǔ":"ǔ","û":"û","ů":"ů","ű":"ű","ṽ":"ṽ","ẃ":"ẃ","ẁ":"ẁ","ẅ":"ẅ","ŵ":"ŵ","ẇ":"ẇ","ẘ":"ẘ","ẍ":"ẍ","ẋ":"ẋ","ý":"ý","ỳ":"ỳ","ÿ":"ÿ","ỹ":"ỹ","ȳ":"ȳ","ŷ":"ŷ","ẏ":"ẏ","ẙ":"ẙ","ź":"ź","ž":"ž","ẑ":"ẑ","ż":"ż","Á":"Á","À":"À","Ä":"Ä","Ǟ":"Ǟ","Ã":"Ã","Ā":"Ā","Ă":"Ă","Ắ":"Ắ","Ằ":"Ằ","Ẵ":"Ẵ","Ǎ":"Ǎ","Â":"Â","Ấ":"Ấ","Ầ":"Ầ","Ẫ":"Ẫ","Ȧ":"Ȧ","Ǡ":"Ǡ","Å":"Å","Ǻ":"Ǻ","Ḃ":"Ḃ","Ć":"Ć","Č":"Č","Ĉ":"Ĉ","Ċ":"Ċ","Ď":"Ď","Ḋ":"Ḋ","É":"É","È":"È","Ë":"Ë","Ẽ":"Ẽ","Ē":"Ē","Ḗ":"Ḗ","Ḕ":"Ḕ","Ĕ":"Ĕ","Ě":"Ě","Ê":"Ê","Ế":"Ế","Ề":"Ề","Ễ":"Ễ","Ė":"Ė","Ḟ":"Ḟ","Ǵ":"Ǵ","Ḡ":"Ḡ","Ğ":"Ğ","Ǧ":"Ǧ","Ĝ":"Ĝ","Ġ":"Ġ","Ḧ":"Ḧ","Ȟ":"Ȟ","Ĥ":"Ĥ","Ḣ":"Ḣ","Í":"Í","Ì":"Ì","Ï":"Ï","Ḯ":"Ḯ","Ĩ":"Ĩ","Ī":"Ī","Ĭ":"Ĭ","Ǐ":"Ǐ","Î":"Î","İ":"İ","Ĵ":"Ĵ","Ḱ":"Ḱ","Ǩ":"Ǩ","Ĺ":"Ĺ","Ľ":"Ľ","Ḿ":"Ḿ","Ṁ":"Ṁ","Ń":"Ń","Ǹ":"Ǹ","Ñ":"Ñ","Ň":"Ň","Ṅ":"Ṅ","Ó":"Ó","Ò":"Ò","Ö":"Ö","Ȫ":"Ȫ","Õ":"Õ","Ṍ":"Ṍ","Ṏ":"Ṏ","Ȭ":"Ȭ","Ō":"Ō","Ṓ":"Ṓ","Ṑ":"Ṑ","Ŏ":"Ŏ","Ǒ":"Ǒ","Ô":"Ô","Ố":"Ố","Ồ":"Ồ","Ỗ":"Ỗ","Ȯ":"Ȯ","Ȱ":"Ȱ","Ő":"Ő","Ṕ":"Ṕ","Ṗ":"Ṗ","Ŕ":"Ŕ","Ř":"Ř","Ṙ":"Ṙ","Ś":"Ś","Ṥ":"Ṥ","Š":"Š","Ṧ":"Ṧ","Ŝ":"Ŝ","Ṡ":"Ṡ","Ť":"Ť","Ṫ":"Ṫ","Ú":"Ú","Ù":"Ù","Ü":"Ü","Ǘ":"Ǘ","Ǜ":"Ǜ","Ǖ":"Ǖ","Ǚ":"Ǚ","Ũ":"Ũ","Ṹ":"Ṹ","Ū":"Ū","Ṻ":"Ṻ","Ŭ":"Ŭ","Ǔ":"Ǔ","Û":"Û","Ů":"Ů","Ű":"Ű","Ṽ":"Ṽ","Ẃ":"Ẃ","Ẁ":"Ẁ","Ẅ":"Ẅ","Ŵ":"Ŵ","Ẇ":"Ẇ","Ẍ":"Ẍ","Ẋ":"Ẋ","Ý":"Ý","Ỳ":"Ỳ","Ÿ":"Ÿ","Ỹ":"Ỹ","Ȳ":"Ȳ","Ŷ":"Ŷ","Ẏ":"Ẏ","Ź":"Ź","Ž":"Ž","Ẑ":"Ẑ","Ż":"Ż","ά":"ά","ὰ":"ὰ","ᾱ":"ᾱ","ᾰ":"ᾰ","έ":"έ","ὲ":"ὲ","ή":"ή","ὴ":"ὴ","ί":"ί","ὶ":"ὶ","ϊ":"ϊ","ΐ":"ΐ","ῒ":"ῒ","ῑ":"ῑ","ῐ":"ῐ","ό":"ό","ὸ":"ὸ","ύ":"ύ","ὺ":"ὺ","ϋ":"ϋ","ΰ":"ΰ","ῢ":"ῢ","ῡ":"ῡ","ῠ":"ῠ","ώ":"ώ","ὼ":"ὼ","Ύ":"Ύ","Ὺ":"Ὺ","Ϋ":"Ϋ","Ῡ":"Ῡ","Ῠ":"Ῠ","Ώ":"Ώ","Ὼ":"Ὼ"},yg=function(){function A(A,B){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new hg(A,B,this.mode),this.settings=B,this.leftrightDepth=0}var B=A.prototype;return B.expect=function(A,B){if(void 0===B&&(B=!0),this.fetch().text!==A)throw new I("Expected '"+A+"', got '"+this.fetch().text+"'",this.fetch());B&&this.consume()},B.consume=function(){this.nextToken=null},B.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},B.switchMode=function(A){this.mode=A,this.gullet.switchMode(A)},B.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");var A=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),A},B.parseExpression=function(B,Q){for(var g=[];;){"math"===this.mode&&this.consumeSpaces();var E=this.fetch();if(-1!==A.endOfExpression.indexOf(E.text))break;if(Q&&E.text===Q)break;if(B&&Eg[E.text]&&Eg[E.text].infix)break;var w=this.parseAtom(Q);if(!w)break;"internal"!==w.type&&g.push(w)}return"text"===this.mode&&this.formLigatures(g),this.handleInfixNodes(g)},B.handleInfixNodes=function(A){for(var B,Q=-1,g=0;g0&&!M||0===C&&!M&&"math"===this.mode,c=this.parseGroupOfType("argument to '"+A+"'",Y,M,g,F);if(!c){if(M){w.push(null);continue}throw new I("Expected group after '"+A+"'",this.fetch())}(M?w:E).push(c)}return{args:E,optArgs:w}},B.parseGroupOfType=function(A,B,Q,g,E){switch(B){case"color":return E&&this.consumeSpaces(),this.parseColorGroup(Q);case"size":return E&&this.consumeSpaces(),this.parseSizeGroup(Q);case"url":return this.parseUrlGroup(Q,E);case"math":case"text":return this.parseGroup(A,Q,g,void 0,B,E);case"hbox":var w=this.parseGroup(A,Q,g,void 0,"text",E);return w?{type:"styling",mode:w.mode,body:[w],style:"text"}:w;case"raw":if(E&&this.consumeSpaces(),Q&&"{"===this.fetch().text)return null;var C=this.parseStringGroup("raw",Q,!0);if(C)return{type:"raw",mode:"text",string:C.text};throw new I("Expected raw group",this.fetch());case"original":case null:case void 0:return this.parseGroup(A,Q,g,void 0,void 0,E);default:throw new I("Unknown group type as "+A,this.fetch())}},B.consumeSpaces=function(){for(;" "===this.fetch().text;)this.consume()},B.parseStringGroup=function(A,B,Q){var g=B?"[":"{",E=B?"]":"}",w=this.fetch();if(w.text!==g){if(B)return null;if(Q&&"EOF"!==w.text&&/[^{}[\]]/.test(w.text))return this.consume(),w}var C=this.mode;this.mode="text",this.expect(g);for(var Y,M="",F=this.fetch(),c=0,s=F;(Y=this.fetch()).text!==E||Q&&c>0;){switch(Y.text){case"EOF":throw new I("Unexpected end of input in "+A,F.range(s,M));case g:c++;break;case E:c--}M+=(s=Y).text,this.consume()}return this.expect(E),this.mode=C,F.range(s,M)},B.parseRegexGroup=function(A,B){var Q=this.mode;this.mode="text";for(var g,E=this.fetch(),w=E,C="";"EOF"!==(g=this.fetch()).text&&A.test(C+g.text);)C+=(w=g).text,this.consume();if(""===C)throw new I("Invalid "+B+": '"+E.text+"'",E);return this.mode=Q,E.range(w,C)},B.parseColorGroup=function(A){var B=this.parseStringGroup("color",A);if(!B)return null;var Q=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(B.text);if(!Q)throw new I("Invalid color: '"+B.text+"'",B);var g=Q[0];return/^[0-9a-f]{6}$/i.test(g)&&(g="#"+g),{type:"color-token",mode:this.mode,color:g}},B.parseSizeGroup=function(A){var B,Q=!1;if(!(B=A||"{"===this.fetch().text?this.parseStringGroup("size",A):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;A||0!==B.text.length||(B.text="0pt",Q=!0);var g=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(B.text);if(!g)throw new I("Invalid size: '"+B.text+"'",B);var E={number:+(g[1]+g[2]),unit:g[3]};if(!zA(E))throw new I("Invalid unit: '"+E.unit+"'",B);return{type:"size",mode:this.mode,value:E,isBlank:Q}},B.parseUrlGroup=function(A,B){this.gullet.lexer.setCatcode("%",13);var Q=this.parseStringGroup("url",A,!0);if(this.gullet.lexer.setCatcode("%",14),!Q)return null;var g=Q.text.replace(/\\([#$%&~_^{}])/g,"$1");return{type:"url",mode:this.mode,url:g}},B.parseGroup=function(B,Q,E,w,C,Y){var M=this.mode;C&&this.switchMode(C),Y&&this.consumeSpaces();var F,c=this.fetch(),s=c.text;if(Q?"["===s:"{"===s||"\\begingroup"===s){this.consume();var U=A.endOfGroup[s];this.gullet.beginGroup();var D=this.parseExpression(!1,U),i=this.fetch();this.expect(U),this.gullet.endGroup(),F={type:"ordgroup",mode:this.mode,loc:g.range(c,i),body:D,semisimple:"\\begingroup"===s||void 0}}else if(Q)F=null;else if(null==(F=this.parseFunction(w,B,E)||this.parseSymbol())&&"\\"===s[0]&&!Gg.hasOwnProperty(s)){if(this.settings.throwOnError)throw new I("Undefined control sequence: "+s,c);F=this.formatUnsupportedCmd(s),this.consume()}return C&&this.switchMode(M),F},B.formLigatures=function(A){for(var B=A.length-1,Q=0;Q=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+B[0]+'" used in math mode',A);var Y,M=O[this.mode][B].group,F=g.range(A);if(X.hasOwnProperty(M)){var c=M;Y={type:"atom",mode:this.mode,family:c,loc:F,text:B}}else Y={type:M,mode:this.mode,loc:F,text:B};w=Y}else{if(!(B.charCodeAt(0)>=128))return null;this.settings.strict&&(j(B.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+B[0]+'" used in math mode',A):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+B[0]+'" ('+B.charCodeAt(0)+")",A)),w={type:"textord",mode:"text",loc:g.range(A),text:B}}if(this.consume(),C)for(var s=0;s void) => void +); + +(function () { + if (typeof extendMarkdownIt !== 'undefined') { + const emoji = require('markdown-it-emoji'); + + extendMarkdownIt((md: markdownIt.MarkdownIt) => { + md.use(emoji); + }); + } +}()); + diff --git a/extensions/notebook-markdown-extensions/notebook/katex.ts b/extensions/notebook-markdown-extensions/notebook/katex.ts new file mode 100644 index 00000000..066d9c5a --- /dev/null +++ b/extensions/notebook-markdown-extensions/notebook/katex.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import type * as markdownIt from 'markdown-it'; + +import 'katex/dist/katex.min.css'; + +declare const extendMarkdownIt: undefined | ( + (f: (md: markdownIt.MarkdownIt) => void) => void +); + +(function () { + const katex = require('@iktakahiro/markdown-it-katex'); + if (typeof extendMarkdownIt !== 'undefined') { + + extendMarkdownIt((md: markdownIt.MarkdownIt) => { + md.use(katex); + }); + } +}()); diff --git a/extensions/notebook-markdown-extensions/notebook/tsconfig.json b/extensions/notebook-markdown-extensions/notebook/tsconfig.json new file mode 100644 index 00000000..e19cd4a6 --- /dev/null +++ b/extensions/notebook-markdown-extensions/notebook/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../shared.tsconfig.json", + "compilerOptions": { + "outDir": "./dist/", + "jsx": "react", + "lib": [ + "es2018", + "DOM", + "DOM.Iterable" + ] + } +} diff --git a/extensions/notebook-markdown-extensions/package.json b/extensions/notebook-markdown-extensions/package.json new file mode 100644 index 00000000..0402da4c --- /dev/null +++ b/extensions/notebook-markdown-extensions/package.json @@ -0,0 +1,51 @@ +{ + "name": "notebook-markdown-extensions", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "icon": "icon.png", + "publisher": "vscode", + "enableProposedApi": true, + "license": "MIT", + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "engines": { + "vscode": "^1.54.0" + }, + "categories": [ + "Other" + ], + "contributes": { + "notebookMarkdownRenderer": [ + { + "id": "markdownItRenderer-katex", + "displayName": "Markdown it katex renderer", + "entrypoint": "./notebook-out/katex.js" + }, + { + "id": "markdownItRenderer-emoji", + "displayName": "Markdown it emoji renderer", + "entrypoint": "./notebook-out/emoji.js" + } + ] + }, + "scripts": { + "compile": "npm run build-notebook", + "watch": "npm run build-notebook", + "build-notebook": "npx webpack-cli --config webpack.notebook.js --mode production" + }, + "dependencies": { + "@iktakahiro/markdown-it-katex": "^4.0.1", + "markdown-it-emoji": "^2.0.0" + }, + "devDependencies": { + "@types/markdown-it": "^0.0.0", + "css-loader": "^5.0.2", + "markdown-it": "^12.0.4", + "style-loader": "^2.0.0", + "url-loader": "^4.1.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/notebook-markdown-extensions/package.nls.json b/extensions/notebook-markdown-extensions/package.nls.json new file mode 100644 index 00000000..e9ae9594 --- /dev/null +++ b/extensions/notebook-markdown-extensions/package.nls.json @@ -0,0 +1,4 @@ +{ + "displayName": "Markdown Notebook math", + "description": "Provides rich language support for Markdown." +} diff --git a/extensions/notebook-markdown-extensions/webpack.notebook.js b/extensions/notebook-markdown-extensions/webpack.notebook.js new file mode 100644 index 00000000..d996af41 --- /dev/null +++ b/extensions/notebook-markdown-extensions/webpack.notebook.js @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +const path = require('path'); + +module.exports = { + entry: { + katex: './notebook/katex.ts', + emoji: './notebook/emoji.ts', + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + use: ['url-loader?limit=100000'] + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'] + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'notebook-out') + } +}; diff --git a/extensions/notebook-markdown-extensions/yarn.lock b/extensions/notebook-markdown-extensions/yarn.lock new file mode 100644 index 00000000..9df105d4 --- /dev/null +++ b/extensions/notebook-markdown-extensions/yarn.lock @@ -0,0 +1,320 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@iktakahiro/markdown-it-katex@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@iktakahiro/markdown-it-katex/-/markdown-it-katex-4.0.1.tgz#65ff9d12afd4c0b7684dd247abe7ce42fc1edac3" + integrity sha512-kGFooO7fIOgY34PSG8ZNVsUlKhhNoqhzW2kq94TNGa8COzh73PO4KsEoPOsQVG1mEAe8tg7GqG0FoVao0aMHaw== + dependencies: + katex "^0.12.0" + +"@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/markdown-it@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.0.tgz#8f6acaa5e3245e275f684e95deb3e518d1c6ab16" + integrity sha1-j2rKpeMkXidfaE6V3rPlGNHGqxY= + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +css-loader@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.2.tgz#24f758dae349bad0a440c50d7e2067742e0899cb" + integrity sha512-gbkBigdcHbmNvZ1Cg6aV6qh6k9N6XOr8YWzISLQGrwk2mgOH8LLrizhkxbDhQtaLtktyKHD4970S0xwz5btfTA== + dependencies: + camelcase "^6.2.0" + cssesc "^3.0.0" + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.4" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.4" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +katex@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" + integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== + dependencies: + commander "^2.19.0" + +linkify-it@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" + integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== + dependencies: + uc.micro "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +markdown-it-emoji@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz#3164ad4c009efd946e98274f7562ad611089a231" + integrity sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ== + +markdown-it@^12.0.4: + version "12.0.4" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.4.tgz#eec8247d296327eac3ba9746bdeec9cfcc751e33" + integrity sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-types@^2.1.27: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@^8.2.4: + version "8.2.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.6.tgz#5d69a974543b45f87e464bc4c3e392a97d6be9fe" + integrity sha512-xpB8qYxgPuly166AGlpRjUdEYtmOWx2iCwGmrv4vqZL9YPVviDVPZPRXxnXr6xPZOdxQ9lp3ZBFCRgWJ7LE3Sg== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +style-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 873107fd..6efde64f 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -311,5 +311,9 @@ "when": "shellExecutionSupported" } ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/npm/src/commands.ts b/extensions/npm/src/commands.ts index 8fda1077..6847f322 100644 --- a/extensions/npm/src/commands.ts +++ b/extensions/npm/src/commands.ts @@ -22,10 +22,7 @@ export function runSelectedScript(context: vscode.ExtensionContext) { } let document = editor.document; let contents = document.getText(); - let selection = editor.selection; - let offset = document.offsetAt(selection.anchor); - - let script = findScriptAtPosition(contents, offset); + let script = findScriptAtPosition(editor.document, contents, editor.selection.anchor); if (script) { runScript(context, script, document); } else { diff --git a/extensions/npm/src/npmMain.ts b/extensions/npm/src/npmMain.ts index 568c5ea3..6ed3b753 100644 --- a/extensions/npm/src/npmMain.ts +++ b/extensions/npm/src/npmMain.ts @@ -10,6 +10,7 @@ import { runSelectedScript, selectAndRunScriptFromFolder } from './commands'; import { NpmScriptsTreeDataProvider } from './npmView'; import { getPackageManager, invalidateTasksCache, NpmTaskProvider } from './tasks'; import { invalidateHoverScriptsCache, NpmScriptHoverProvider } from './scriptHover'; +import { NpmScriptLensProvider } from './npmScriptLens'; let treeDataProvider: NpmScriptsTreeDataProvider | undefined; @@ -62,6 +63,7 @@ export async function activate(context: vscode.ExtensionContext): Promise } return ''; })); + context.subscriptions.push(new NpmScriptLensProvider()); } function canRunNpmInCurrentWorkspace() { diff --git a/extensions/npm/src/npmScriptLens.ts b/extensions/npm/src/npmScriptLens.ts new file mode 100644 index 00000000..067209da --- /dev/null +++ b/extensions/npm/src/npmScriptLens.ts @@ -0,0 +1,113 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as path from 'path'; +import { + CodeLens, + CodeLensProvider, + Disposable, + EventEmitter, + languages, + TextDocument, + Uri, + workspace +} from 'vscode'; +import * as nls from 'vscode-nls'; +import { findPreferredPM } from './preferred-pm'; +import { readScripts } from './readScripts'; + +const localize = nls.loadMessageBundle(); + +const enum Constants { + ConfigKey = 'debug.javascript.codelens.npmScripts', +} + +const getFreshLensLocation = () => workspace.getConfiguration().get(Constants.ConfigKey); + +/** + * Npm script lens provider implementation. Can show a "Debug" text above any + * npm script, or the npm scripts section. + */ +export class NpmScriptLensProvider implements CodeLensProvider, Disposable { + private lensLocation = getFreshLensLocation(); + private changeEmitter = new EventEmitter(); + private subscriptions: Disposable[] = []; + + /** + * @inheritdoc + */ + public onDidChangeCodeLenses = this.changeEmitter.event; + + constructor() { + this.subscriptions.push( + workspace.onDidChangeConfiguration(evt => { + if (evt.affectsConfiguration(Constants.ConfigKey)) { + this.lensLocation = getFreshLensLocation(); + this.changeEmitter.fire(); + } + }), + languages.registerCodeLensProvider( + { + language: 'json', + pattern: '**/package.json', + }, + this, + ) + ); + } + + /** + * @inheritdoc + */ + public async provideCodeLenses(document: TextDocument): Promise { + if (this.lensLocation === 'never') { + return []; + } + + const tokens = readScripts(document); + if (!tokens) { + return []; + } + + const title = localize('codelens.debug', '{0} Debug', '$(debug-start)'); + const cwd = path.dirname(document.uri.fsPath); + if (this.lensLocation === 'top') { + return [ + new CodeLens( + tokens.location.range, + { + title, + command: 'extension.js-debug.npmScript', + arguments: [cwd], + }, + ), + ]; + } + + if (this.lensLocation === 'all') { + const packageManager = await findPreferredPM(Uri.joinPath(document.uri, '..').fsPath); + return tokens.scripts.map( + ({ name, nameRange }) => + new CodeLens( + nameRange, + { + title, + command: 'extension.js-debug.createDebuggerTerminal', + arguments: [`${packageManager.name} run ${name}`, workspace.getWorkspaceFolder(document.uri), { cwd }], + }, + ), + ); + } + + return []; + } + + /** + * @inheritdoc + */ + public dispose() { + this.subscriptions.forEach(s => s.dispose()); + } +} diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index d5497f82..553558de 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -3,21 +3,20 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { JSONVisitor, visit } from 'jsonc-parser'; import * as path from 'path'; import { commands, Event, EventEmitter, ExtensionContext, Range, Selection, Task, TaskGroup, tasks, TextDocument, TextDocumentShowOptions, ThemeIcon, TreeDataProvider, TreeItem, TreeItemLabel, TreeItemCollapsibleState, Uri, - window, workspace, WorkspaceFolder + window, workspace, WorkspaceFolder, Position, Location } from 'vscode'; import * as nls from 'vscode-nls'; +import { readScripts } from './readScripts'; import { createTask, getPackageManager, getTaskName, isAutoDetectionEnabled, isWorkspaceFolder, NpmTaskDefinition, NpmTaskProvider, startDebugging, - TaskLocation, TaskWithLocation } from './tasks'; @@ -78,7 +77,7 @@ class NpmScript extends TreeItem { task: Task; package: PackageJSON; - constructor(_context: ExtensionContext, packageJson: PackageJSON, task: Task, public taskLocation?: TaskLocation) { + constructor(_context: ExtensionContext, packageJson: PackageJSON, task: Task, public taskLocation?: Location) { super(task.name, TreeItemCollapsibleState.None); const command: ExplorerCommands = workspace.getConfiguration('npm').get('scriptExplorerAction') || 'open'; @@ -87,9 +86,9 @@ class NpmScript extends TreeItem { title: 'Edit Script', command: 'vscode.open', arguments: [ - taskLocation?.document, + taskLocation?.uri, taskLocation ? { - selection: new Range(taskLocation.line, taskLocation.line) + selection: new Range(taskLocation.range.start, taskLocation.range.start) } : undefined ] }, @@ -153,37 +152,18 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { startDebugging(this.extensionContext, script.task.definition.script, path.dirname(script.package.resourceUri!.fsPath), script.getFolder()); } - private findScript(document: TextDocument, script?: NpmScript): number { - let scriptOffset = 0; - let inScripts = false; + private findScriptPosition(document: TextDocument, script?: NpmScript) { + const scripts = readScripts(document); + if (!scripts) { + return undefined; + } - let visitor: JSONVisitor = { - onError() { - return scriptOffset; - }, - onObjectEnd() { - if (inScripts) { - inScripts = false; - } - }, - onObjectProperty(property: string, offset: number, _length: number) { - if (property === 'scripts') { - inScripts = true; - if (!script) { // select the script section - scriptOffset = offset; - } - } - else if (inScripts && script) { - let label = getTaskName(property, script.task.definition.path); - if (script.task.name === label) { - scriptOffset = offset; - } - } - } - }; - visit(document.getText(), visitor); - return scriptOffset; + if (!script) { + return scripts.location.range.start; + } + const found = scripts.scripts.find(s => getTaskName(s.name, script.task.definition.path) === script.task.name); + return found?.nameRange.start; } private async runInstall(selection: PackageJSON) { @@ -194,7 +174,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { if (!uri) { return; } - let task = await createTask(this.extensionContext, 'install', ['install'], selection.folder.workspaceFolder, uri, true, undefined, []); + let task = await createTask(await getPackageManager(this.context, selection.folder.workspaceFolder.uri, true), 'install', ['install'], selection.folder.workspaceFolder, uri, undefined, []); tasks.executeTask(task); } @@ -209,8 +189,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { return; } let document: TextDocument = await workspace.openTextDocument(uri); - let offset = this.findScript(document, selection instanceof NpmScript ? selection : undefined); - let position = document.positionAt(offset); + let position = this.findScriptPosition(document, selection instanceof NpmScript ? selection : undefined) || new Position(0, 0); await window.showTextDocument(document, { preserveFocus: true, selection: new Selection(position, position) }); } diff --git a/extensions/npm/src/readScripts.ts b/extensions/npm/src/readScripts.ts new file mode 100644 index 00000000..bcceabf4 --- /dev/null +++ b/extensions/npm/src/readScripts.ts @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { JSONVisitor, visit } from 'jsonc-parser'; +import { Location, Position, Range, TextDocument } from 'vscode'; + +export interface INpmScriptReference { + name: string; + value: string; + nameRange: Range; + valueRange: Range; +} + +export interface INpmScriptInfo { + location: Location; + scripts: INpmScriptReference[]; +} + +export const readScripts = (document: TextDocument, buffer = document.getText()): INpmScriptInfo | undefined => { + let start: Position | undefined; + let end: Position | undefined; + let inScripts = false; + let buildingScript: { name: string; nameRange: Range } | void; + let level = 0; + + const scripts: INpmScriptReference[] = []; + const visitor: JSONVisitor = { + onError() { + // no-op + }, + onObjectBegin() { + level++; + }, + onObjectEnd(offset) { + if (inScripts) { + end = document.positionAt(offset); + inScripts = false; + } + level--; + }, + onLiteralValue(value: unknown, offset: number, length: number) { + if (buildingScript && typeof value === 'string') { + scripts.push({ + ...buildingScript, + value, + valueRange: new Range(document.positionAt(offset), document.positionAt(offset + length)), + }); + buildingScript = undefined; + } + }, + onObjectProperty(property: string, offset: number, length: number) { + if (level === 1 && property === 'scripts') { + inScripts = true; + start = document.positionAt(offset); + } else if (inScripts) { + buildingScript = { + name: property, + nameRange: new Range(document.positionAt(offset), document.positionAt(offset + length)) + }; + } + }, + }; + + visit(buffer, visitor); + + if (start === undefined) { + return undefined; + } + + return { location: new Location(document.uri, new Range(start, end ?? start)), scripts }; +}; diff --git a/extensions/npm/src/scriptHover.ts b/extensions/npm/src/scriptHover.ts index b216fb06..02a2d4d5 100644 --- a/extensions/npm/src/scriptHover.ts +++ b/extensions/npm/src/scriptHover.ts @@ -3,20 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { - ExtensionContext, TextDocument, commands, ProviderResult, CancellationToken, - workspace, tasks, Range, HoverProvider, Hover, Position, MarkdownString, Uri -} from 'vscode'; -import { - createTask, startDebugging, findAllScriptRanges -} from './tasks'; -import * as nls from 'vscode-nls'; import { dirname } from 'path'; +import { + CancellationToken, commands, ExtensionContext, + Hover, HoverProvider, MarkdownString, Position, ProviderResult, + tasks, TextDocument, + Uri, workspace +} from 'vscode'; +import * as nls from 'vscode-nls'; +import { INpmScriptInfo, readScripts } from './readScripts'; +import { + createTask, + getPackageManager, startDebugging +} from './tasks'; const localize = nls.loadMessageBundle(); let cachedDocument: Uri | undefined = undefined; -let cachedScriptsMap: Map | undefined = undefined; +let cachedScripts: INpmScriptInfo | undefined = undefined; export function invalidateHoverScriptsCache(document?: TextDocument) { if (!document) { @@ -42,20 +46,16 @@ export class NpmScriptHoverProvider implements HoverProvider { let hover: Hover | undefined = undefined; if (!cachedDocument || cachedDocument.fsPath !== document.uri.fsPath) { - cachedScriptsMap = findAllScriptRanges(document.getText()); + cachedScripts = readScripts(document); cachedDocument = document.uri; } - cachedScriptsMap!.forEach((value, key) => { - let start = document.positionAt(value[0]); - let end = document.positionAt(value[0] + value[1]); - let range = new Range(start, end); - - if (range.contains(position)) { + cachedScripts?.scripts.forEach(({ name, nameRange }) => { + if (nameRange.contains(position)) { let contents: MarkdownString = new MarkdownString(); contents.isTrusted = true; - contents.appendMarkdown(this.createRunScriptMarkdown(key, document.uri)); - contents.appendMarkdown(this.createDebugScriptMarkdown(key, document.uri)); + contents.appendMarkdown(this.createRunScriptMarkdown(name, document.uri)); + contents.appendMarkdown(this.createDebugScriptMarkdown(name, document.uri)); hover = new Hover(contents); } }); @@ -103,7 +103,7 @@ export class NpmScriptHoverProvider implements HoverProvider { let documentUri = args.documentUri; let folder = workspace.getWorkspaceFolder(documentUri); if (folder) { - let task = await createTask(this.context, script, ['run', script], folder, documentUri); + let task = await createTask(await getPackageManager(this.context, folder.uri), script, ['run', script], folder, documentUri); await tasks.executeTask(task); } } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 7d860ae3..96db9e0d 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -5,15 +5,15 @@ import { TaskDefinition, Task, TaskGroup, WorkspaceFolder, RelativePattern, ShellExecution, Uri, workspace, - DebugConfiguration, debug, TaskProvider, TextDocument, tasks, TaskScope, QuickPickItem, window, Position, ExtensionContext, env, - ShellQuotedString, ShellQuoting + TaskProvider, TextDocument, tasks, TaskScope, QuickPickItem, window, Position, ExtensionContext, env, + ShellQuotedString, ShellQuoting, commands, Location } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; import * as minimatch from 'minimatch'; import * as nls from 'vscode-nls'; -import { JSONVisitor, visit, ParseErrorCode } from 'jsonc-parser'; import { findPreferredPM } from './preferred-pm'; +import { readScripts } from './readScripts'; const localize = nls.loadMessageBundle(); @@ -40,7 +40,7 @@ export interface TaskLocation { export interface TaskWithLocation { task: Task, - location?: TaskLocation + location?: Location } export class NpmTaskProvider implements TaskProvider { @@ -57,7 +57,7 @@ export class NpmTaskProvider implements TaskProvider { return tasks.map(task => task.task); } - public resolveTask(_task: Task): Promise | undefined { + public async resolveTask(_task: Task): Promise { const npmTask = (_task.definition).script; if (npmTask) { const kind: NpmTaskDefinition = (_task.definition); @@ -75,7 +75,7 @@ export class NpmTaskProvider implements TaskProvider { if (kind.script !== INSTALL_SCRIPT) { cmd.unshift('run'); } - return createTask(this.context, kind, cmd, _task.scope, packageJsonUri); + return createTask(await getPackageManager(this.context, _task.scope.uri), kind, cmd, _task.scope, packageJsonUri); } return undefined; } @@ -278,29 +278,30 @@ async function provideNpmScriptsForFolder(context: ExtensionContext, packageJson const result: TaskWithLocation[] = []; const prePostScripts = getPrePostScripts(scripts); + const packageManager = await getPackageManager(context, folder.uri, showWarning); - for (const each of scripts.keys()) { - const scriptValue = scripts.get(each)!; - const task = await createTask(context, each, ['run', each], folder!, packageJsonUri, showWarning, scriptValue.script); - const lowerCaseTaskName = each.toLowerCase(); + for (const { name, value, nameRange } of scripts.scripts) { + const task = await createTask(packageManager, name, ['run', name], folder!, packageJsonUri, value); + const lowerCaseTaskName = name.toLowerCase(); if (isBuildTask(lowerCaseTaskName)) { task.group = TaskGroup.Build; } else if (isTestTask(lowerCaseTaskName)) { task.group = TaskGroup.Test; } - if (prePostScripts.has(each)) { + if (prePostScripts.has(name)) { task.group = TaskGroup.Clean; // hack: use Clean group to tag pre/post scripts } // todo@connor4312: all scripts are now debuggable, what is a 'debug script'? - if (isDebugScript(scriptValue.script)) { + if (isDebugScript(value)) { task.group = TaskGroup.Rebuild; // hack: use Rebuild group to tag debug scripts } - result.push({ task, location: scriptValue.location }); + + result.push({ task, location: new Location(packageJsonUri, nameRange) }); } // always add npm install (without a problem matcher) - result.push({ task: await createTask(context, INSTALL_SCRIPT, [INSTALL_SCRIPT], folder, packageJsonUri, showWarning, 'install dependencies from package', []) }); + result.push({ task: await createTask(packageManager, INSTALL_SCRIPT, [INSTALL_SCRIPT], folder, packageJsonUri, 'install dependencies from package', []) }); return result; } @@ -311,7 +312,7 @@ export function getTaskName(script: string, relativePath: string | undefined) { return script; } -export async function createTask(context: ExtensionContext, script: NpmTaskDefinition | string, cmd: string[], folder: WorkspaceFolder, packageJsonUri: Uri, showWarning: boolean = true, detail?: string, matcher?: any): Promise { +export async function createTask(packageManager: string, script: NpmTaskDefinition | string, cmd: string[], folder: WorkspaceFolder, packageJsonUri: Uri, detail?: string, matcher?: any): Promise { let kind: NpmTaskDefinition; if (typeof script === 'string') { kind = { type: 'npm', script: script }; @@ -319,7 +320,6 @@ export async function createTask(context: ExtensionContext, script: NpmTaskDefin kind = script; } - const packageManager = await getPackageManager(context, folder.uri, showWarning); function getCommandLine(cmd: string[]): (string | ShellQuotedString)[] { const result: (string | ShellQuotedString)[] = new Array(cmd.length); for (let i = 0; i < cmd.length; i++) { @@ -392,151 +392,39 @@ export async function runScript(context: ExtensionContext, script: string, docum let uri = document.uri; let folder = workspace.getWorkspaceFolder(uri); if (folder) { - let task = await createTask(context, script, ['run', script], folder, uri); + const task = await createTask(await getPackageManager(context, folder.uri), script, ['run', script], folder, uri); tasks.executeTask(task); } } export async function startDebugging(context: ExtensionContext, scriptName: string, cwd: string, folder: WorkspaceFolder) { - const config: DebugConfiguration = { - type: 'pwa-node', - request: 'launch', - name: `Debug ${scriptName}`, - cwd, - runtimeExecutable: await getPackageManager(context, folder.uri), - runtimeArgs: [ - 'run', - scriptName, - ], - }; - - if (folder) { - debug.startDebugging(folder, config); - } + commands.executeCommand( + 'extension.js-debug.createDebuggerTerminal', + `${await getPackageManager(context, folder.uri)} run ${scriptName}`, + folder, + { cwd }, + ); } export type StringMap = { [s: string]: string; }; -async function findAllScripts(document: TextDocument, buffer: string): Promise> { - let scripts: Map = new Map(); - let script: string | undefined = undefined; - let inScripts = false; - let scriptOffset = 0; +export function findScriptAtPosition(document: TextDocument, buffer: string, position: Position): string | undefined { + const read = readScripts(document, buffer); + if (!read) { + return undefined; + } - let visitor: JSONVisitor = { - onError(_error: ParseErrorCode, _offset: number, _length: number) { - console.log(_error); - }, - onObjectEnd() { - if (inScripts) { - inScripts = false; - } - }, - onLiteralValue(value: any, _offset: number, _length: number) { - if (script) { - if (typeof value === 'string') { - scripts.set(script, { script: value, location: { document: document.uri, line: document.positionAt(scriptOffset) } }); - } - script = undefined; - } - }, - onObjectProperty(property: string, offset: number, _length: number) { - if (property === 'scripts') { - inScripts = true; - } - else if (inScripts && !script) { - script = property; - scriptOffset = offset; - } else { // nested object which is invalid, ignore the script - script = undefined; - } + for (const script of read.scripts) { + if (script.nameRange.start.isBeforeOrEqual(position) && script.valueRange.end.isAfterOrEqual(position)) { + return script.name; } - }; - visit(buffer, visitor); - return scripts; + } + + return undefined; } -export function findAllScriptRanges(buffer: string): Map { - let scripts: Map = new Map(); - let script: string | undefined = undefined; - let offset: number; - let length: number; - - let inScripts = false; - - let visitor: JSONVisitor = { - onError(_error: ParseErrorCode, _offset: number, _length: number) { - }, - onObjectEnd() { - if (inScripts) { - inScripts = false; - } - }, - onLiteralValue(value: any, _offset: number, _length: number) { - if (script) { - scripts.set(script, [offset, length, value]); - script = undefined; - } - }, - onObjectProperty(property: string, off: number, len: number) { - if (property === 'scripts') { - inScripts = true; - } - else if (inScripts) { - script = property; - offset = off; - length = len; - } - } - }; - visit(buffer, visitor); - return scripts; -} - -export function findScriptAtPosition(buffer: string, offset: number): string | undefined { - let script: string | undefined = undefined; - let foundScript: string | undefined = undefined; - let inScripts = false; - let scriptStart: number | undefined; - let visitor: JSONVisitor = { - onError(_error: ParseErrorCode, _offset: number, _length: number) { - }, - onObjectEnd() { - if (inScripts) { - inScripts = false; - scriptStart = undefined; - } - }, - onLiteralValue(value: any, nodeOffset: number, nodeLength: number) { - if (inScripts && scriptStart) { - if (typeof value === 'string' && offset >= scriptStart && offset < nodeOffset + nodeLength) { - // found the script - inScripts = false; - foundScript = script; - } else { - script = undefined; - } - } - }, - onObjectProperty(property: string, nodeOffset: number) { - if (property === 'scripts') { - inScripts = true; - } - else if (inScripts) { - scriptStart = nodeOffset; - script = property; - } else { // nested object which is invalid, ignore the script - script = undefined; - } - } - }; - visit(buffer, visitor); - return foundScript; -} - -export async function getScripts(packageJsonUri: Uri): Promise | undefined> { - +export async function getScripts(packageJsonUri: Uri) { if (packageJsonUri.scheme !== 'file') { return undefined; } @@ -548,9 +436,7 @@ export async function getScripts(packageJsonUri: Uri): PromiseRDl2J=v_)D;TP1sU-P^jY*KJ*~jZLw^U{hpzG0h}^ zX$BHH4grS*--KNVAtaCloZL`u5(kn1HzCrE!%Iv;_IfAp@66eC;pV>I_kRC=cdegh zG@2Qm`aHjkhqs*?$n?w-O>eeD1p4+l6i9hxoo4Cxy;ickWr?r>5ff zfA=K5*Ka@n!kyo_Z|2_#`4GQnyOW^o;>YZM?EN4ADgKEaIsK0gC`WL#=^H;kca5d{ zGh*OZ{5oZQj-AQ3{}>bhB>oW}tB5dhJ+8skFA$sZnH|;RAAaW4_xRjG3Pk9iK6eQ* zpR;b~dBjIlr+t6=K0W8`&FgS~+*W}~Ig{cDC7Q{j;=j||i5j0Q0&B5b_?G^bv{IBn zAZigu|HYx!?Pitv_ z?4#8*4yB?(?KDJ-66;V012Ga4u|n_JiGxfbQ%NuBBh$$Y;v_EOCLU5v{3JkvL?R&) zCJ_=PwIoL3q=7V|9a5x;G?P}6CT%23a-^Mfk}lFsddO@ths-7O$zrmU43cGJh%6^7 z$ttoM^>wAA3&~D$5xJP`BD=|@&Xq|MsgFmncPNhCtoIakh{p;WWm%L2AM_wgAAg__v$xp}|lmA6NC4V8u$!FxRZTs*qkdXLgET~=G)5D&i8j+#nx+}r zMzb_e+i3^wq+PU|7HE-9p;Kuu?W5D^bUKU9rgP|AI*-n$3&=t8HS%@x4CyD+$N*VL z7Ll2>jw~Qc$UIUcUNDpw$TqT_+(~;daxG*Qd5rv+d`=rN@@}CNgZT)xk+;C$3bdbO z$Ot)ye2IJutn7EBhWsmelhl!Vk_U}p4CDXre@4~-mY?xv0AIum=U~#Jyp97inUvRa zU`~_r1`f<_Qr^gcc}~h_agg6&yNLsHpOiOqke_0^g#+?{l+WfMFJilu12Te?w{egT zY|r6<+#uz1IT(j6pT|M9*q+b9dbGTq1M-EGcW^+`kn#l_kU6A$AqS)nDevTf93th5 zI3STo`C<+*WK!P60VzewyE!1QNcj>DNIp`A)xiK6M#`6QK$?;A4gR(MT&jHy<$~SNj z*4{UA&<1R8;-GeHZ|0z3Y;WP961Mv|r~}*EIcNmiFLBU%Y`@GwYq7n91M-=a@8lrt z9(Qpt%c#ui06=<^^4%QFZYkfx!8BC)UJj#3I{XdA?3$8$P{d! z;DDYX|fIcGSr#YaRNcrm=&{3rP3`GN%;pH(8;9yLk?(XQhtpCdYY7f!~u;>%5QK$ca!p)9MIyV ze1rq~oRojc0nJXzKjVOoC*^DZj%3RzS+{a)2L@ z^1pF_DUk9nIKUZ5`Ij7E52XAn4)6$4KFR?`LCU}80Jk9J_c*{ZNcnvZvKHIlaDaJ` z@^3l7K}h*`9AG1)`~e4e2`PWb0fs`#A8~-Ikn+ECfVGhF?>WF z^+-j{0oF$<8V>M3QqgjN36e?`2RI?AK*lkE9g>Qk13Zyb3>;vLq+;X%cO(@P2UsMj zm^sK-u(fc2S(1vC100i7Y#d;lq+;g)?<5rm2N)=+I61&YNyWthR!S;v4)9Y_@o<2t zl1eoPI4h}mIlx{?#m502ODcX2Fj`Wn;Q+TKl>i4=E~x}Lz;{VS;sEm{l@JH>)K$V9 zV8f&m;Q%itl_&>!8QWS8aAi`7aey_GN}L1ynN$)SVA7;g#{o`FD)k&-*QC|(S_a>DT2Us|%G;x5BlS(rOm^rDmaDbzeN-GE0I;o^Nz}rbB!vO|QDs3F# z@}!dG0IMgJ90&M4spL7p^hu?i1Du~!Iyk`oNu`qmb^xh#alj%Vm2M8$2Bgx%0V{!2 z3LI>}SBf0497tsf2W$vZnaTlcf>e4rU{{bz9|tT9Qt9V_twAc&IAC><%5)CcAEYva z1C|J>%;bPgLMpR3V4aZ4Y!28dq%wyC77MA&<$&!%D)TsC#gNK;4kBYaz`=Zzm4zHs z#C8z}RbjiBgQ~Gz!a=LBUCKdq*bZ_~1GdXJs1e&C4$9`=at_Mo+zJkA#dakJbz-}U zgSxO?%|YGR4s%cswre=358JgI)Q{~t4qAildJY=Ib^`|uVY`uoMzKAMgT}Dk#6j73 z-^@YTINicQ**HC$gR-%?m4mXexs8Lev3U*$Wn=SP4$8*nc^s6D$MZRuhrY6%gR=3s zgM+g1cmW4xw*jIVc;0mvGQNY%k@YY}{SO zLD{&woP)CQRpOv*eC^?&YU-VtXqGY-dur zjRRIRsqEu`JxwaNbHK7Dl`nC?#wL|7bHLgrl{+|KcazGU9I(Jil16Dby z+|5DQx%Y6uQYV#rIhePpavuk*cT%~Z19m*A9N>UOPbv>^z_urq2RX>+*gnJod!JOk z!U4;lRKCiAm;t2iKDExwQNO~2}WHBn!xKCXFP`*@YPs!+A0>fx$yR~@PPeU+>W>2kV$ z-4@+`-K+Yfeue%~L&Pv-c+T*t(P+HD_zP2;X@%)F(+|yc<}K#i&99h$W*N4;VQsSB zX??@`sm*8$+FEP{+n{Ze?H0S!-eiB&{(_^*F~zaMal7N7@j<$doJ}n?D=`MP~B4f6>o!gqxVYh4}A^3-M)|gGyT{5 ze_OMn=3tE+m>zg8@Qa`^*c2QM{#H^+ap`jDu=F3HO<`wvOZd4+A@XkY>gW$^_r$7W z@5i^t566F;@Fg}TZb|&SuDfne-Jv?Ueq;T8^`AD(Z+N)jlg8S{%aeuV&gAb?OH%iw z#+nLETbkZ&`n1{J{7UotEt-}>%fXf-tqrYfTVHA|r>*JE^m*wI(kC)QnHw`l+MI2J zZMV1mu^#u|3vOEQ@_>He<$?0TD8>^SBeth+>heN|x4!^M`xTb&2mNieV`Ssf2wO6hi zTKDw2F^o_Z!jS(EKZYMa0w2#D#>r`0BA$qcv>L6(<@C5E>TY$jO^~K@MVij$@;Ms8 zDY<;Mpvt829sZfA7;h`kd@danoMs`?L}^<#(L|N=a7Ci6Nr;#Qc0=W#Mr)?HKYl3N zmdE#LcGTt6h#&X&?bs=QvU5jYe@oM1O6_`4t19fikS2ALcN25*tV4|KLk@~xnX8dyZ^v))qFD1W4so17C7mj77xOM(1P}NqiN!ag4iVR9U-3! z3R-o9^@!4bY1U#&FNp_*sXJ#-V}50pwy(YLtSOpcNH=il^!6gtVTA&F9H9c!DSl_MA40jlWX%|eTv~j_fc8Q&F?-|#yqA`I@#BC^_ z0UumpThtcLhHV*}xJ}+$koVGE1tC*p+ald1?`2~O=O4uRCirXIOkdHk*5%3AJmI`8 zlh0~#xr^GuHZkl9i#MHkTf(1kNRmRse zzi^(IkY7v6uP3Qk0BfDRCc->mF}UBg6m_N^Aw%2c*Hcs+-znTGpGaPdU&3!IKb)K_ zpYVWijQtkXMo}{~cwTtmK=MH2=Hh1h#(@LLO>~v~=w|*K!gqv2%DKEHTwxF0f8aoB zvvLZZ^FZSRNnG}YbCuRY9TGwfyPfN(M#Is_g(6y>Gj`pL#9Qt=CQW`1pqlXEamT+p>4w2zq0WTRQNE8`M1K_L@P7X+HO zDEOibP_&8I4w%b&9YG zP^VU7q2WZlnWi&2io#{1&Y(b@X4(XWo(@tmrMJYSqmEdr)#Ecc97mCIWA*Q7NXo9i7Bouf)+@(M#uU%i#*}e4T%;2WM3{5NVqs7K;jnz%H z4xQd^Z>nzGmiE?%Z<>>q{2p(k)8R-9f=*X&PI{WNd*jVD?bD`(XIKRJ2YS29YvD79Pns^TyG556v|RiMUzNx||m3$)Gx{TA93B6NzUtZf#6yk6gY$ zJwXvCNi;0>SJV3WXLt3L)@NyTEO^urZE9_fIFAP9!}hjVi8|ybJT=L9-C1odi;E#z z;~9UPE}k{F)U|ziyH?w<{F2_A=FU8?p}HyRz@^mCzFT#VxMf7T{v#bht*LGRv>}*7`9sFlPfCTBtPY@uXo8$ zN)nx&OXle8klbi+LZmb{(>vwY-MS=gl#L_&PuMZa|HN&&x;mXSzE8^KBw@$+eFmM7 zX&yhJ(+S>WsW?&`#lHgnp~zfsq%fYVSlmM?qz>~%OhmP|uxJ`TBIOV&6!OInn?9t+ zAx%%b?V^(WJC~RokDWNd5`)wy>u!Rd-H#To$DN|t1Oztj!UT2u-y9pG$H%0R&=@^jl3yE>Mx`;~*svrGOR^E|aD2E} zXt_lSg`|C{(L!O2PTl90Bm}LX8AT)_)F-Scw zr`zLd5^_`%#VANb)6rH?i5?mO+Hzeq?Pjyp;nZSV5ZL543vLgnM!XeU8w)c8g`>b-p25(i!c>J}O#N*opaid@~pWU{H&19QEL)wAAjq6<8SL8Fxja}r87NXH}3JpV!k~_9c@WB1fv>h@yaFPWH>am z>*9KKZ7{iYu@qUBr8p^r^G=s%T4-jb2g4p4l%UN6)f$6XA4aF3&!qx%s+|EtVB8LM zdhAzFqsI#{thr2l4DFsr++;CYJ=@kqBW4<)(S+8+D4;~y7-yo=llO2E=*dG;7Ab^v z9+R(`<`Yoqpnnj70VD=sergpC$k<(x3Qx8!UAMHgZA78>~s;(%4Q_{gw+h z)vI>JE*DZ(dgIlUhJ+2VE%N?o&$OQC8llGRnzeG>%2_UVjUfEAwsmPMUbVQ1IJnYo z7u$rP8RBKJi&V{R=_b|g*dB4_3ZYH3+gA^Y>tma1quo)wYO~_(CA0dbtVyTWOzE4o zWHu@cJ5!nO2hnB@%y>5Hqlip4A_9^@J9NSF?!zdY!>n}7g{UhGOw0xmlRwMU{={VW zVC%pPVOuu&9oTyQo6jPSi#M$<%EkgF1v;n5y9HgduQ2gfDxUf)O&-Mdtul}$o4 zg6`95JkFpRv>d`83^d;)D(8wCc0N0eaeKzzSrS2x+X0wbZVNSwt{_H15Le-*n8ZO9 z1_WdLAX=c085b3;_L$A=b=sWXsv8n9lR-yKdY8drtg&0{^(k*%z!&ptz?Iq;uGw~8 zM=l?de91a*4Hfk6YO~*HFxOZ6S|Go-E^VA$TCf=Ga-d{s-eTD!+?7Ias~>n#?O#$Yu#44$B) zE?{%GV*VOmJmr%@ZRel2ZSBHNo0U?H#vk_v>a5`!zsX}TnB|W(uotYp&ZWuWww7#j ztJmucS)+QJ!7G`oHHIpO-tLoZ&Zzm1W(%z{d0aY^)guKwS~Dw*NBFD!9{TQ07Rx=2 zqv+sYf@cR@3S2vyr3nv&AzD@Rpe4~e2}W8by8$~&C*?da6<|oY%_@&#DloIHAm(!- z)H<81C$ES`z-2H=F#;HQK^G?4l)GVEMDPu>&e$CwY!!=52++t8+EJ9>PadfY=uLie zwc9{xjW?0>OQC$OGuP3U9j;FVYgii@eNLM{P*>g55V6)!lf!MdP@TaPOWaW9bvPVe zv&|l?3kO~LDxKaGuoz87t--Ey=&Pkzt@)283%f)Is%bMAYph0}#-gt^d(;|>)#snn zxO8hXtjSq4f`NZTelPiz8oi;~F#U%yzcrV{MHthc7^> zKT&T9)Y+wKr`>MQm@Jn1_|-bWjPBQJ<+lxP$*DJMjV6;NU^M8eOgaomlLfsNO$2;) zgT2b2@fq27cB+qBA`Y*&xi#C8S(9Aa>9axsbGzq$a1||>M27haL8-*3n8`aJM2ljE zx-!|eIHngYIju{X8iGq}7D2nfU-Aje7Z>PgG}0urfqv4r+xve!hrIt zj|SF@k;U6}G$H0aIw1jNfPd_R_%pdW^}Xh&=}+YlwI}7zi_se+X?8@^j=wBWNBFo< zE8k7~;__>=TV}L&DTkN{=C;xG;#8JRpxoI(#p}oaoc`C$3-oVd_4q!KHq^?06W~y- zVi$-{!Cqr!F)Mau01~Ca7?+atdxuZKwZ;b+SEEumhFz6R>Kvlzt|EGI2}!lhZGrJb#uri`n%$>cLN- z7g(WQlt0WvlLzwhhsqoKcw9Ml#uq5#BnM4Fa^Y7UicxP1gKk61fpezD_kqQ}Nsmv~ zN8E;eC}9evDsCHJ2pR(QG$Hr4ptSwzuTY+6BM(c_WOl+|{f&Ne(H)UWK? zt>KQEDZ(+Gef1P+8vho%q5df~?GdYe^4^MHgLyP2?#*U0*kqH6Ilq)UcXe!kM6ybO zt_`i*FW$a>pc67U(6v6jT|8)&9@*Z$`~39!u7D(U4y@n4>-^RY*q>}irk@*Fyn)6c zgW0WH%~X-X0>ncr$__aVz7Z)9(ONX{9WlT_Xw z8JjqUFUFD+2a|KIoER&ttz7ULKmwpIpraVYKrcfnD)xJZ!bSkgF^g&_Hbo86A6`?{IfAOD2! zpR}V6V)S+(>u3&(>Tt6WR#G^d0dbye0N9IBkRbG|axe?4d-6+-Hrm7#K8%>O+X)+7 zs!foqe6*(Nd`<62@Mnq`c!`m-%6HS6E2Pdm|kYyhdu+ zdxYM}w~9T;Xy}Q*OkNtneS~ATk*MDv#eAE*JlYjLa!!3)cF8o?F-X2V}q>+7iyD`r&>6! zpbIj2I_bqq(8HtjcrmoP80kP2dsj%(Q5b4bmtYUo2FwB-=_~f7E=lc{*C#JY_80n- zdxUi9K&ZgmvJiraE{r+-TC-Fu*#vjkKK_k;?rl0$ecPcCONj~M}wb5KKL z#gaUGOrArZr+-c^$JhKkdUpX5l9>uOwQAjy`uHd;~ynIntajM zC--n@LarYY+Z4NyfW$K@$Yf14TM*FBi6{&OP{;)63_Bb|La{3vVHA={LQerlsN%Eq zz_1*Zl7g~Tb%<3 zP@NW2t#{rkr8>i?P4fEW4gYUyligRS%h`BsURxx8oh}?m-f+X|b*W*wb*I%OnstT0 z(EMTM%loH&l{upha_S51K12^Q?_9Vu@=to{RPiZ2v)Qj??mWm4_z=$M9rOYBGu)%_ z9_DF+Pg`-?hZ&E|GZK`b@y8xZj*QR`l59JEpq;k23pYRZSZXvmno>6M%QeD|n$zZ! zh&w6LhLOMjb{=JzA0M9Ke?EZ@7ugs8WZF!O8>VNRn6-o|wEc?#7~3h`^9A*y#CLWn zzNJih>9T*OPfolo9An?T!5mO5LV$+)7{AB-Im|P`{1V(Nfw;Ycg;4U@gf^RTS?H;K zErz6vMF=1SA?R=pL|rtSfzg;zT#{(tgcc5mkx=MB>A=Kxgnb;53MIiI!A~biCH%?z zUU{XM+_596L|$+Pv`UG6J1UKoN)NCLB*bCp;gGx+{=8lIUVa^3iehYgayu09WIwYu zv%`~`K&kVH$iTA>U#SNrg7xoFqd=^X%&D5kAxLXiVyrkbi!utwq{8^XutfLnWFMK^ zaO_v~`C(}$jTe{Ca36pdF%**j0O1$<)lN4~Y{$pfrNY>ll%6>`KMpFg)`>o2zmaiy znB!K2#}--wo>3*@bRhdp`edjmZ*^ZEIv^Yqw@Kq~N(bD}NkV4)Px|Y(hZN4rW%ohw zNybZ=uSj98@M45%IHGacG;V|`a#>pwRlGafPI`3gzFHdd3CDc!2)N$*z^3d*=JF6)6;x2+ zwvfDV1u$PsKIaJ145PO&^AS3PpObpDh$X_jXFCPPg{V8GW!^bRG_c4hkH~5vvf&;5 z%c^s?tzCbaM%&!-FXwGtyWvu;rm5wMhV_}%1M^eOGxj`m?FzbH z0vN`GOkw_SAD94R%^-Sl_^#l5irSRsNrRCW5!uVfPEFHO6cJ5#k~20_8+fTZmlsn@ zr_VY#Yx+{GU=ekLz0)3?);p*ZDV1NJQD}=uQlzbL+vE z%ON0-(-YZ@7fXb)F_@08=S@q_Sz^j3XX=VYm1!V3%{y~orgvI$z@#b`^fSj0H_bn) zo}NxmSC0uPc^_5FCHj26t+%(0T~sKF!N9`gv`}qrXj*b%KvMM-bTgCrL?S=dIzy$J z(K?KkNA2>Z^7!0;q2`w-dC&XEE#P&S^8d9CC_SoRi$jR~pQ@oQ{FiEMmY34?;~xYf zE%b0cgPOFbX6T9ql~i+jP1M~*-Hen{lk^O=dPaIREw;&@%>FH1CSUB-)5j*(Vheu} z{-W430hX^1o&$O*APRwrhsXr>-FenA06n|?`b%c(x_4Z=Yfe?i#`x;RZJLJpD;H)o zi4R$zM|d@^>)MV}s=BscyIX$Er>&d6dU0A+H+SWtx8Td=V|&7Wva(eP%qM@+PH-Ry zlLt<>oI1wF5NtVRGRdzOCrGoxe*_t}7-xXcx#2uh7@#ue%D=h&b{f9@yWd~G{`>2M zW4Osv_?wVPE z<$HfTaUXsTfiDQ(%0}UsJTQ5^n4GZri9;u3VK2N0M@L@%(KF9HLqB6Na`{JlpLzCK zoIc@aNh#+O%*f-kLw-$uT}-ieWHBlnL-e_Mb?yKhGk9F1V**f-luC{Y}p`_G}$Hkr#pM#AVgePwvTSY+gVM(xA1jITLPyn{L z76VcXOB{xdM~wsoaCh{+hEW?BxN(sDd>qOTQ zYMcglb4^12INCbAI*qA~w&(nf=~WRr2@z8V_=UqpqcPio;o+k~=1KW2xO42nhvNZy z;ma~YOA|8e7RYA@_){laX9Ld#x)@R#g4aU1$As-AAg5X85Q`*nqY;e+`(2T6d6sts z)1Em+i%?}6ak0*^G_lkh2u}+|{cEXto!@L0dJT@w?{zxT`E<-JzrH%LdgtoIs>C{f zz~NXDU+V3Y64U+bzU6Iijk{dRnZoA*FK*+|83eQ0zfS&itv?!?HsDphbh%^cy!`Ci z#JY>t#n<6B)8kT?cWHd7!%1uW>xT5MIDW~|^-3q)qLXvsr;}ruqIHyn67TRZJv=<& z27@b%ojW(1U=*WgOS}5J|1G++=aZJJJ; zABf92I&9U+Bg}Xf?(G8$^jDebY`<+pBfPMhj%Jn26ZFB5lwc@ktc2v8#0AOZvmr$87s3gVfK zGRs;FbZok^w9&ULdhHWW-#Bl|h5H}4sb#qN=q_o~WtXghZ0g-P;14b8jt*>ZtlfJ5 z(1P2ywwdP?FC1$g&dqR#2ez}e;NxoUsc{9(oe^y`6SIkPF|fvuJV8@m7+Cz8n{ka1 zIRT83o$gM;idRPZ!g;D@Bu&_%*!RjC^~!(klwZZ1@9v~}c~pKCYhd;81u}03oB)vy z2d(qXAAfefpVoaQER=sSA-{H@9pdY5^&PcINM1O7=Ng!(W3 z^5lI``w97KqcIa5gU7RxCgr!$C;__jyDz^oVW(U!UWT?nKB_|*D@s5PJP7iJndsm- z2)!jvdEL-t=MLu{TCx6X*?biprrLoiQ|Am!>y3Xy{?BfD!>J|_t{Qu2%Iu-J3)Wc8 z{oBLgSgdEbM-H57)rsHNW1j25kO^gucg5c#ozXF9=i|MP4L{a<{6M%@1a*e()-!C?X;U> zym4Q^Ws_}%oF5k)ZlF~VLKz4l&l7(kG|rUGcJi+E|CEs$0I~|E94{mVx<$ z&hVL+gk$r^pAi-*qy5kxus!j`HbVz|RhjRA^iFY2w(NyUP=oi^`jxc-{PE3Rm~ z?%D==Rr|#a+i9HAJMMS13AZ)esA{?Bs$I>h>lCeQ_6^%Ds+i=Ad4S1&?HsHSEhOI7_*d=aW zsJgvjuPWQwom1n+s)ZYcZqeo1wnl|}H?*&9$EyLiuB+?+vP!jV^^$or^SKU0hiA@P zvUaj>nT~R?Ord;M$&*BOn__z=ps>MwP7Y4bSZA=hN-h6kG7?WWNe8ZbAho%$IeDO1 zFd&5NKn9K^jlWc+A2HkTKynK*ch1GvlXB}IxDWGYxG?IGAj7A579*9V2sx06CtmiG z5YliYAszZjGiVAzB4Z;X!pj$52itZwjP8qq^ep))48^|8r^wvTI5e>ioyebQc^&qKV{vcZrLRqJL=9p zoOK@^HreeyyPXtI;~u4WFthg zXJpFI}8bZ3-_u%buX54bB4q??UwRhq~T38)yXQO@Tl{Vi3UeAPTZT- zT|_x87*i}pc3N459rEi(Pp>!9Zjo|3k<-KK{Dtx%YIS;D(FZ9wX-_NJxV<#WNH%LZ zmWIoM0bu8IM#siRCVUSE!D)DZ@=O_cba;{Siias1jZK!28K6K(q8%9BuSrFi31e9I zaMD9FHYS=v%D{r}2v*L-7#sgnsl@CF#SbFp#f#YLX@|lyAd!Ot@<2QkLP=3&Oi*W! zN=F~;YPfLcQYq9ZkEH0dJdz3==gpZpb51@fZaXR!I~zmNlASvn(5iSY}I8kJz?%ksuO=2UYR?e9zS0^IDWz` z|6}M5y`Wk-zG`HJ#EzbRKPC$>CZO=ScT355RuW+m0m^5?;=!QY5R_jH1Re|s7X?qe z1#4;i$eJL1URWeie=sOl1>}DZ2I&gs073>`V9m)fcMjs4Rk*(oZNnl%EJCD)cL$*& z$a1HK?~JkBuuKf*S8ZD@%SLOTIB*C%m`^WN7@DGdy|DcnYRzjWuS9Y+Y1mDc*y}6R#+tO0( zoi%U9oGE=9I<%hFJ>6g4R>-#3*EwA3d}iI1#qO!;ZM9BO@ONx)-(%XJ+&}pe52~Y~ z>NW@0OhXMkHY`n%ZQ-&z>0a8jw>;cB;C z5VS3&wk6Ix?{qF{E42h>2k>#RBWBRAsP*47Sh{joVyY?VQ^%XaqTgdTHl(c6OR0;_ zpKEViz2ltOj(81i7Z0)%C4OsvbcI15b1XjXW_RAHeAEhp-CZ5NTDr0{_|;Uc(eCk! z;ikCS7qre_(fMq`Rln+@^Jm%WS6pz;hGKDovrO`viQI1Hp=Ye{|LmnN6$}5ppT5NG zedN3SGiN>Lbq9sdz`0Fq2BLuzm~q(zq?DMxtMP*ml6Q^Y3}3a7xhwg*-zD#&#Suiu zxPO(cf8qLu=K?ZIUs1U%3xTEiLb@xTDLyl^A_Jf#v;&2C4MpxaF<7MS>{T3J$W}qX zAHjela8MkaJc|V)kPNYlrLnUY&SWQG7w(IRvBY%04ZdFXJV1h&gNHLxH+%+cTBzaK z!!DeD$j^eqS8@L#c|(JwA;ewO5R%PISR(5VZnNXJZcZ;f_pBj=7mD2-8#axt}YvJJjteN^ws%Cnoi63i`X2JxRiG+7h3rQVS)N zf@&y4lrxw7N$(c;OR)=u{bbXIj_xAjBSSxC6&P(D+``Dlmcdp8VYvZ;Qt#T$PGgnZ zt<;m9e--@2kd5u3I=%*wk{|ijFe}bHMY!utWTp=w z@bjVEgN$|g@xg|sCCR2-Z|`gOw4U9TUUE-5v!!+FU}Mvg6gw(@^@wNu;YofiWJbm> znc8z%Z_lzPV+}uXH5&HI4>s&KG`fB=f46dc@X3?1gO#6UocR<_>&cR9Gm7I4{tyvH zrpr@AxE%BRw33-e5%d;z9F_idLGs2Mle?39_a-kmtsr9~81cuYqjLQPslCY?lOF*$ zCNE%P1NloByo@K>;Bl>i*Sa438*2a@VUQ75Cfh79hL47#o~W9WeH%hokoOo85b4n{ zRw2P#)fQ*OyhL|NM~nJ5-Et7Q1*7yZVw=l&9(<^{DLL!9WIfen)}AH5QF!n&EEWN| zX4Ivy*K9$_7Xd z7A1m*l`mXi!&E80HtSITuwQ+){UFp8TLhaN^pWgPasGIvUyYX&mSjtVakV3s8~MJmAPaVaY-m){;xjYFK2MC`h$H z<+UuK8v57oqi2DWF2ouIxGQSdr=t9%-}e!{%=gg`e16FCC#U`b)jQxr5V;r(S(}xp zltty626&9+bJ5Z(BSVLFu4u^3{HK0BKGY_Rd>9wGhbfwGcorHY|@QUZ)j{pem%s`lef}c!z0@tPd&!WG_X(nDeDYbhUXVE z@@KJm=&@P25M$}~;HHS$A#p~btMIeim}Q80nm`fr7_iyXwq0=bsPiBokR=)00SsGR zmbKRy)}dr|rI1v>t5hh0fSdxoGB=vl7hoJ=!A?#dVxmkcjqjs3XFb$&K*9(*FmA^s zxCZYSQv7XZjvD39&}myJ7UXk%$YrtxBVuA+vb8m=L0M$NBQ76JA{q>KQYe5Sbbx0I zzaDX5fdD&(JjY{Wux2O6)?MH$?8%BAW+@@YJ+U}JiK=^|xG4+|ELLLo7JiA_VzCYV zTle?#qZ>AqWaB7;)LgT*p&k6w(gHWssvC2~rFIcN1+ zq-C+C#OxoE8u<=<+k%$)_`&+&z=BbxVeDVa{Bm)GRKRTF2^fIv7A|~+pm$#A3fCB- zfw;D*N^3WSqP=Igi&U*aLcWx=Bk$YhQmbvrX+u7z$CRV+%EUsuXP0uSpwtjCC3@@@ zQ;oeCaW@3}wbyGG1k6;GYn80d;bKee>Ol3>+9~Z#shU)aY4Ig}7N;v1j7RHZc29LA zTvyu=sc*gI(S`0BHP%>Mx}twbPrvDHToeqfO`F@}9T&F+1M0>VKb*burmDWVbs^ey zc4+qO6=$myv9HHhn$d);UzBq{PQ@IMB{k;XoA}1V@&S-V;oPv-UjU%7G+W->=UIv>tmc_VuYPgOhXeXDF*l$;l(g5OE-dFu`Q9*5+WE#D!wR z&8CL$3W{S`csBT0aE2uBN7;~YLX9~$tli(cvwsQ}gk9rzZ28EYrCUoLdN^?)lx0jw z_)<<+(q-K*f0efDauagklwQEhRenqn1WYI4R}!qLvh3FpCm4bRc?~irB~1Zo@w#*L zCMW90~6W z?YHlDEXtIsrE5yd_U~U-x<-07bWLe!|Ncd#YrW6JPcipWjgmtuyo2i(rAtZN4%aVo z;QG^U_q+WIOV@Z$yT!B0jpf;=c>P+Qjd~h)Wb3#F@azwSm}nHTC94P?=2VC)ZUx1` zz*ada86Xzwgc&}uzKeNov#GH71u%t5K;%LA4RRc1)7zFq3c;7YJ%WrBUhBCY4U( z)#!C0J5~-Cs?EYY*MnCkWpkZnzVM&Dr&?kEq)Ivak+YL6W)n>5!4ayOn z8b9UM*t8}ivPRje`-!$?+}MGbTfMSQjzGswOliTzf()4G>VykHaEzibM$crV!IjVi zuviem2CRAsXGh1>^6xOMKXkvT^Trr`fW|pmKpq#8%8E)H=P5@C>uI4}N*!vpP)>Km z^H9v~m5yS$>{wA6Lsl3&6RFRUl*3yr+CygT;nC3vIVOAx{aDSOa|rhs%H>klj4}q# z`m;de=y+yJvn5e%!4!r;UU3aZ%#N&Vz?t>wMbn_ zFZFo@;gC0^9viFbUUBy7DTc8zmBE{D+_2`OIs+D|g{K!9G=e~@lbwYQmm=nwTpSa> zA$|@1{3J37Rx({ULHQ8WM(!BP&_X%b7_vFt8PQ!3V8_E31aBGCAIsrlCATqd4!;I_ z)&cB$!6iQQ+1)rxAhid8t}hTeDWlF4|A@TY>3C|=I;Fpq35rGOtfQD&u7x`QQ_QA8GawKR9|xKy zkyZSHEH2$d)!2uT&a&7DroErn!}wKD_OL$PX3<8#u}R?IER9@Y3=@L2}zUa z4pt@m6H@z2M$f6vq0fa_AL&h9y^ZoFn@JaR`&dutYMU^a!Pha4p2j!|!=^8yz2JOi zTu6)5HMZza87Poirwu5PMK{f?4On}M?hJAYm@qs!wv+_H|2nvsq;tR;WM{IA=^9^B z=ae!wA2rzr)-FJcr7*~97qm!SscJgQnDV*ee!WVAfnYU@cU0H-l3u~03^|wZU{ly# zO=)(BHA9^@m`_|dG3J^V*o{$-)^20o(T$ zzMG7(J`LGsgw)_`fniZ%N{k9s4@=eeqB(csC>sKuzL#=@sG#F@3NQ=5nFGKjzPCuAjlBg2M4*JoFSgmF|TW@ z!{W7Jovvd>vNKql)#?SE$64FpxpA+1SsafY*VY6g!H(1{i_I$9z4p#zZP4x$ZB-_d zN~IP=r@`Ygxil_|2g!Hp>aE=a9XgHKp|yIYhSr;JYH0|0ZCXb_H1)6CKd;Lk&fSkS zp{Dz*n`~*F!<+6}JF83bch;zM=Aamfh}l4wSMpDfuIWtsoVr$fqvs(6Fip#hM!nw} z5uH^=QC(%w8;v0Q2Cp_?a%idymQ;hgbN-iC_SY?pSX9(tmZH(H#Yk0_MG!v|?fpl{ zpDp;nU6M|w&fV-;0~+3LN(15zO~W69#9A*m(Ri(BLp&0RwW#8zRXQl+!5V1xbP7e1 z;VX2Z8>SBpr8n!1x&R&z;&xaJx?rmmQTaDz zXSQjnh;^rCM|Dj&J-4ej6sUHX4LUE_pg$VOH%_(a^fueZ`<4pqu}OG%QtytPH*Q-$ zd}~C|X$^xqm1xwP4Mx4sfgiy$N2pnEHl@{~rOt0mbzd{T!|7>kprXoPa$78JlR+iY zLa$geJ+`8~#cQuJy1k*B3|29`@4H)-Vo%sD-^Cbpk{c&m?Tb0_SO${KBZ|XB4&pf& zx@Z_y`9@?h3gBQ(BKBDGpxu(?8qeLj;)fL_q3 z5j%4k_06Gp9iGMFYN|D;O%}UOErO=$t4#VTwILJK>z&3bab@4sKrq;zU$pe4rHk_I z!C+u&-%9bNGk#hr!-@-BnX=d+k;mC>yAW66-QikdAxpV8pT z2kPs>ttPWdUt=~ZoAJHnd z@~{`zkD9V*iS-LFK||58!Qd)g{byXbJ}jP35J_J+a+soG>ZU=n?I*6x|teML{`JE5ae z&-_xYc<_w7y@&hf|K7RGybaca@K63OITT@XD){2lFWs4y^QL}(>1M>;7Kx!8jqr{>K zmfSh{_>3sr-*nei*Cz)?8fP>#%xILP1c=ng!W1n$QKYrWQ9JxJ%r`Su7!@wQDtSX{ zfHurnIKCvaSCEivXKUZiE1jb*lX&3M~*0uD-ni{#Urk!3VUq&C6U-J2AuRq7E zeI_?2{p26RSHMxme2Zl92 zQYs=9;ajEC^F@S(ihFYhTlgrX$Dcvs1G5;E5F1K@KjF|s{w2$vVC!cHo;LwUA%_yz zp4g`yY`F{44){h)DO)^tjQyReBlp?4;2{VoJ-}jFxC0h%f*Y_W;c(A5!X@|>Wvvaq znLNnc=qy+;TpAuO!H5|vjf@~C1Pjuc8*XkHo_D=829 zVTIwoqJ!c&7zY?0jMg?W@o5nh<;0TLw0K+=d_GLf=I}`eg8{KMh~G3OyRw1AWDHS! zxGLxg4X$de3yJmhVyLch)nKT}QbjF658Xj`cq|g7(~Ti{M1H~QHW=L2>SAB9dg;>Y z0yZ|io2rEugE@CNYPSVc_4TTN%^nRW3&BDs+#>tv4!1vB2+eH74d^s$q9N6outM0f z8{pmQOr+fCmdQGO3wZ$%v@D5Du+lRUOwAy#EcrCYToK4S73cOe)^+#(;Flxq1?lMC zhMOLHWKX|p&NYucdL44vzw`c^wP-j6(xS!-&V&b#-iySBum zo8|;IT<#jWGxgk`#@wgMaF2KgW*PDx;DJkEO0l29yA6qT$bNtk3wzd<5Df6d6|w%Q z1Qg+x`-rWJDvgO>miH$+mfDcFMH$I&3!=#WWWg@)n zPj9%dZKb5sZ`tCqxTr=qkHuk_%kPm#Y#TyI>!a!V+HJKae{hg(N8y9<$h~l6hh`|5`R42yJ&icU?4Hzc7#tEnT@J z^bagnC>G%nxkBne!#?faU-wPy-RPcC6|k|K6`!@HN`7%v{!-Q6EA;o*>Sy@R{7n~3-c}3c?Ijd`4)jbKhdX8VNDkEF|@M( z2Z33rtiP10h>mO$3$PRz`%#Dwb9^XPEHYUj5j^OAp?dZWZSy6`<(xic)rt*gt>`_g zL)*B#^rhLs;(2x5Hk;4a*YogGGZ!w?Z5eFeQ_q$vh)-5c&CTDs`RsF+Eoi70#g^I~ zx7_`uOP9v9C*CvmrDv~RF|@M3kaxGXANs))&61t|y~tKGO!@+!Ml84)zIdb>Ac~BV z6)7vRnT@fAx(jHH7 z>gdLGiBf!0L? zl}&DCeIAwxVOKfmakEr+7Ycvo!n-wm;oY9OFFdi?xa7d9GsJ|DNET*rrheBasDuS*8KR4z?OdDq1j(-leMvz7k z+*6#OqLND@WHj=dRZW&^gTrx^&05o-r6El%9tY#R+GdjWJDq|?Z}s)kSMmXqTkmvM z=^LiWg@VoO(4W*%+t5##4>5T9G1KxfHY?B&$WqA_MKyfSQOrjWmOSJJ8+yuOJftam zuomfK*)1&();p=bPNUUUSsR-gtyNmRSV#4qhTsa>MW2?|1l|_adXsnR%t){r?EKxp z8tMEH{Yv!{@nuf48IO3i*{pb4qRzRz_VH?YZIFINx^RY8V>Nnf%$91S#XRFe32nl4 z>Ne=qS?u}Pj0mEqzeo6)GP!U3JWAs@hjuopfqs;RO_lBG&Rg`n4F$N&Es$T#S}aGgn`TnA^B za$PkR-hAOYjo8%VY4Cgf{+!=oi&(S;ZI#hvrB;VO@Ar9qjh=$p7j}3YuDUvVZFP06 zt**YoRnugs8o#yRY4pL{lb^g$YvLE?YJ6UQ11|JN*oE~8Y#kl6AeN~*7%%_dy}b#1o7I&*ocq4o_r;Pd%hqN~vMtG*Y|Bd`CC;8WJK2d7 zFLLa7MY6MjDFg`HKv-I!B$TBs(9o8hE^((Ybb+=&ccz3+r_<>+w6vXeXmR7W-*fIO z*$!p?)9L(vpBL%fm%E&M?m5qS4w>;pnWzu%`Ylt?YZuHWXML$Qi3r+@P>eU|1aoP? zt2ODX8bwEPQ#xgwtU*ZJFq(jx-c6_V0ss0IwOIHradp_OeP1)B83L zB^x%y88fS-FHHevurXO4t_rVq=|wXvDEx`Vk68|Nu3WXOzm*x<^<9KTxZTN;(b&?< zHkU~a#Y;oU;Y|U9KD9d$tqe+E?xRD}T64*Z#&Vxsu$ZY#WF45}S89P;X~k@CDUZ2= zNDM%!34ovu(uQ|N3_=8qL!>|exJ1aI1$zK04Mz~DSe~T4fV#L~PQnK9j!cSU)l!*a zt$AzTR*SZ5;KixpsbV34kEs_2%Cwd(nJpIW>={RGwegHW3BshCHc0C?u$xj-gO0i? z;~70onBXR#N!PWt)urKwHr&_Ha3A5~R-gmK`20(Vi4T3$_D|OmhlfDt*0uvhpq4;mVJHul@V8Ckk7| zP5@YdY7%ZI^~qTowa*^Mhj8WWvkqZ><-(l{^$dzVA^}T7B|1ICsXd}jMi7gUP}A51 zVoGN_tZnGdoRyM~vDCU?XoFBB^ALjn=jmB}TetYuUm6JRUEjatfNN5(*`=|nReiy_ zps%uqv52iPy*Aw00YYb|kv+!=VrAsL^wo6wKx2P@BeNMdx80;R_{&&bpfA4B8|iQ9 z?C>>)ig0>pX-8*UJvv!I_SHgHD(5~D*HOXcg_qctDta8L58Ude)vdIg6JAM=#2%r#6aW)f}z6oOqI?)tu z3^V%+ZQZS4j`w;i5#3U?qUwdJm6fZT8+X)$ceYz_G;ObM?QVMkN8r!r!vPEj@`J>9 zTX&lgo70sms*KoExw6Wb+@?*b+V?gYaoG!Lb^E1_wA9+&YQljjI@gFB;LFquO{0J# zkvXz}mI;wgM$-d0)!304g8Lx2_A-xJhA}#yCZ}%Lpallf5aZm z6Bh_?6GC+ceKbuLj5)b7&%KtUe0p{cu>mo&Y{nqYH3TNg9D|6$hlJ!#Khig#0buS4 zgEb^+IkkS;t0u^*K&-6^2aSM9xfhXPo#QRJeUGr2Xp2IgW*(j9lsg)C!HB|%#n55- z_fkQjQ)pa9ugR$q6C%8+Dp=7JqB1?z8i5fMq5N=soAq{+R#YZHMGX_RLJ$>#SuZGQ zP*n;@ID5;wD()jAj#RYtwuW+vTn z9xqFFA=E2y%X9UbhN& zAA2t>Ud%R0PcAOrSlM0+M@IWnc;UBS^U(I_`d`0wbo1S9tGvrsw6ATr^v%ldUCpZa zmags1s>;p9ZH<0KNquV~AQp=cmPzln&6eeuLS=VEYc@ELgW!(gX5j}DPyOSVqP2Bh zciLa3RlifJuHMqKqe)S{xoi7(EDCph8%}rQB2WCUUKRF@9)2KN!lzVcAeU?<|aY!y7;dkQAuulYFUrW-} zAiTI%Vo%t4q=YMp*^pDMC&fi@L3KiTVEmpdAK~NWdmDrm+2t4mz7+gYr4adnQrU0` z1eW)K2jDfXzht*FQKpYJlgW6cda8c&+}dC^2ik+Q6H#o~}qmh5PslT(B%Bs~2h>ciwnL}!-qry&{m zT?Q@zLQKTdoVEaZ0W6^TkSG#n)U}1g)biX4hW{&oDnw&FGTpGV0e@h?Vn_0A=q$>p z6yEg;&Xd7qkAoW?<@@B9p{s}SCWW z0Uoab-~+sM{Ur%;dJdH?-qhaK(+>&Pu1^D? zUfd_G5EOoCFJU0?z6W;9{%Wi6omtyT zx6t5TDV}^+g8I*X_xW%3_DU<+6>x{`oWCx`Z4pWkl3IqJ@@NKtRFrADULIpCoe8rI zv;V-_3b9%2KczVPj`SPW@Sg=;;Vd{M32lh+6jA?RGn{`7){}Mhf}lBm?77bfPe=z@r}PZ#td!nlA3k-5Vcq%j&pkKy-o>!eaz-6{2)67H z&E6?U#syylbn9eDX;n^%Vs*82jkaO+>PDOH>XPpZtfHw#BfTknZMIoh_Wi)@&jY>X zO+~iG)fIu@v2Um~o+?dg$sN<|YcJ<@0hd?|C<6B3xX& ztzm^=1FRq!3x(s}gvQv~pw~HlO}@(yZeF@%1rz-pyKDDtHAsJKtw@@@+kGW2&%Xmu zqNvH=&acyz9c$ZFV zvsA~cgCL+?{z<*A*sQWt#j33~t!}p~Tr7O$aaK(ZmSpM@YGFwud@zy%B+;Ct{XC)L1?H#VU%0QrSeG!kb@z;m}d zr5&l;Am(jb~>l8|PWE^Fh}GKw|trI?Hyjox;gS9+4(kYwN1*I-S}*cA49= zebtt?l)Zg|P_d#kl`36PapL5)C-E$@jqB#TeU+k0DB`)?0Sg>R714AO2z!o{i$qqz z3k8<#Jj6-3Y9uure<=2lbX$BlH4=L$_SDGhuaCqZe2{J9U-6OG+4|wvUmuP=^bq@H zOkR@yYdAd|docFUJ=l!z;ex%IY`nzpLcDK&JO!6+km%5v;IxAxoDXpzvPrI!9^sT> zXQqfckv)6i_YjzWKzwQxOtQo#yH30bex&ta5QFap6WlyD-4B%}J(F*54~zG6UmT`S zc1-Z#8-RnrPGEHCLa;pIjR`NAbaj3Dcg@Ye`?T-3U;eW5%o*W8d}Jg(JRGAx;fdck zk$>TLKD50zza)IQl|b#OfIlU10q`m8 zyy|)UDQ=A0<5oPIMIMU^#OqgNBx-u;LMUoVeiCu0Nk_pH7^bz&Q_S6^Z9dnez3^TB zM0mx*cr84QI;7|xcw}L1$@3_=!WfX@_IJ`uAQFNxtULgNuLCU$9BWJ19o2n%T2#^P z{PWvo%i9CC82<$1$|%hqjNgBMJOe$aS-7pVa2O7D*aGd#%VPX<>I$R1KYoA3{jp3k zJT>2@WV=G%YgmYxrkL(IEf>YGFmU=5Co81@So|Zf8T4@!d~q4TmQY#JM8Qw*Tkw_6 zbNb~Y3>S{cO0;1@Oj7ejP!7){Kw9<`lz+^@UWH!NAQ|B3d1M@(rwtS$xHWaV)c>rrERtWmlEsgy< znR8cvV=I%^jWury$ICoLplx^6w=HR{cU8E(MJ@60rsN+z5dcTRfAoaIfF%gmdCJ?D zFs4+RZ9bq>fLQU_%!FTE(q8WA9J+qfTA#<`Tf6D{At|ddhN`#u+KTOJwE{nCwY?#| zH5x)*4O{D$*15lYTYM`oPeQ=7@(2^qj0Lz2f+z>zxB*rGJ`w2IG|?dIJ=yb#FptcW z)57CvZ$Nr!mGl~<3t~Bi8!Cf>Cv4K&?u^~(Tf4f^VTcDR+yNlYV1R7`HqKEA+lBP3 z2|)w1yH=rlBHz{Hz`zz+8q;ad9q|u3wC?8BYvBU=vzW(hx*YZK(mA}xV;r+y%`wiS z$ejEjGFLu_dgWAquturWctCn+CuRaks5JDTYPb+6tT>4}Y=$uo_Nt}QdD>a!wXzC8sfwp?0REV@CdJgsj8dH{ zwVy#22Jwl@#(}3UwQte8at=B?R1%&2d|54FI-7jSh)jnee7Q*JZNW@NQP$egZa=LP zO=P1r>Z%)zHdV1TUK0Z9v&dXo9n$w{5rfCw-`&<@LQB`_74*QC;O8V2clo~wWw_YwPWx#*wq+@Bd^2wXAR$j_1 z{wn7Uo-kxdO!$@$5$$?sT`9a-g{Z&6y#E(@zgU3lDGm%v6kkCSd+wj6SFQzfbuo_c zqEiqNTs{Ct0rLss6lEz^_(oVz`oee9X)(q{38cw|onmYXY9kcK1u`X$7D+s7@SSrl zNf{z7i2~cx=&6{+SVIVpR5uAF>|j-~bhUJ~E6n;0Gr{jqx6eLBodv$?mMha@{6Lws z$2&OaWe=AfNT-Y~4R$HJgB{$qP5ST-)*pP(azEWyo-f@7{A&<)%ayomq=_}vi0Ux( zQKZJhz`?P3q_K<09LBM~XwhmrBo&83Hp0BX{Vg;_hDLkK8tGML@|4>m&0q9*eqyv% zR9KCyu}V}SV@Ih&C4uQdXH@Ggsbvb4L9bH&n@-2fh!+U>Oj^@#nd(IaYuIQHmXN_e z{Ec&^8%lp-RGZCeT;wKGnad;?i_3)VDx(JGBCBCzdiG_dpi&9Sf76y|ndK={k+n=? z@&$BHVyZP~yCgi92lJJ=G=DXCBfK9O&Umr|&|z>U^Tii2lqX}i#*Q*|EIr3>4w@@D z!(lrUdTJ))M|ks5$&CeKlx42P3E+sVh5muWD~!;>S6G*GufkOBS%q$Z`4 zlI`FOj2U^VjQLQL=)K-VnGiy<$v%IKc|rp7CVo*`bZ=29LN)r78gWSWIHie`J;*o{ zyYzE!!uxSgrEt41R^z*kReC;-4bsmZD}uG5tmv`Vlxnr|wYmBq!aS~&eDsL8gWm-~ zp)g$&StA52RT4yTlIjR?LNsdQ*UD{6(BA;mc8NpQ@G|Gq#;U|(pa11l>Se#Ly`;J1 zY3I_2U#GL^4ANiJMxWV@$}V=By(VOcfZ5Yxz+`=0z*|-muu^aZk|DH}1=tF-daDh< zZlhkOl-4QqdZQ=ouxm_4>Wi`u^_TF;B+1qen;;2%dPagK*8=X95|RO|`w+8olR{FLAp)htwq=X)cwb~58 znao%%!B#x(cO7+!;<{Bvwc5CM1m5$0)UOs40I#xq*~l-LFLL=EP~r<- z?>VK8mpFg*!dv`R&31(R7rzPBtk0-ni%_#xeO}KgaIm!T`99SW_d&@O^S5<((Fn;N z`TO`+CfFM3v(1k`{`YgQ2z%am^Wfw}q1{!Y>}B3juuw89C~JqMDHzKCz)niP6M%M* z+b41do`sbui2eji74#99H!wh^ge9oyq`>vIn>!MA| zde&Wf;-J@{f&i z==pQ@{DpIy!t6sf2qMlAGyu>KBCwfoWD<13NPY$apU{H2#S>(V&0szWfFk{f zLtLGZy)dAgO(QJV>e0;tvQEznK zd*)>H#7ON>PEKp$AYC{oLzW&WGaSQ-knMRsD?B42Bx$C`@vE|Zp6n_%v z+gnzp%HL-T_+NWOj)vR7Rx!3!z@V6e3x>=L-`;_Yw(m%1!N^iQ-`F=$? z3mve|Z{rNHT+H##H8*;LC3c>2ntK2^Cfg240Pu~VCNdYeD*y#4LK`6~Ih1H%voL0b ziBp_?k0Y&t&AN0RYCYOTq})WIeQxu{n%df$jhhu#M`>G$%WoDoSWQ|T;tn+?ozqZc zTyNI83`huidhJ^A?8TQMjCBi}wb$T$Txh`+1+!JFH)t!OF0&g^hYEvLYxNpEh7zx} z%4aGucuf9qb*1!GgyqZQz+v%flmq7Tm`JD`m?d%n10Np&VVaRp^!>KF*z<=QTXfc{ zH4fL#RlB=4Z#>OrX^X9DwZpYT-m*qCuHUljxLDz@s9C@JrmLQ~_NqO(zuuB>@1H<@ zP|leUka;VCh2ODg5856EP1t$i@l68hhFJ~1Q0&-5m_|%lFuN;K*@0q2?{v`?V!lw@ z)j$wN>@}D&!$^Vf1dyupu37_FggW6u_ddrO>*JsSYK_-7cCct=+#d+|VwKhGUuel6 zk3^$2@%pAFe$cz3U88-ywN84tzV-DYy`z}sb=_KnLS@k!Z91FM+B|hh%QH#g<`q}g z$67!1;D=gcbyu!vIT(qTZP~HK8;czL%c7WXv%ENdkUbx-yYhxB>-eE>21_+6smwh* z>}Ed!C9nmPrz%k}S`pZ3)S1=S9GjN0&GP)=tT=*F3PN9M;kZwV1puf{@QTSM6-{u# zDprW~brH)DDO6NWAW7%*N2nrX8**?v5vZ!u>iE7Bw_clRR4h4k{py|fZgx(b{aCMb zh(mQkcL&;>G2hlb+k7$Sl8?ySkj06x&Vt=+S$+MXC5pz(wYQ$w7gwis+fIM#nyS=o zEdcU_8Y}KAam50`ia@N`b05Px{ZGTbF_i-T96#J=Da#32zP&e><08hn`Vm?QI}+#W zhZG^m3;mNDo2)HlGA0Z+ucu`R9 zbD#1FUo_ z(4%C}I2p&h%>H)`-5^SxBe`Akcd6<}<|DTSxX}E67k^sbH);|&#~%a67_KSIl!aRJF6TN#(m{r4n)oC5G7l0S-pUnKq*almf)PD8+5H-kwt1y9f_*uh}C z27`%Qo|LvmM$41M+MZ_%1xPW#&47477+e7v&bI>Y{m!=-Vr4F8ubryh@sg*;gTGKH zwk8@~6MJb#?WvzhFXy$!-eKo$YVEjR#&cB`^=6@(o0L*ix1s$*Rd7Awq1Q~ zF5CtXe*XTWxWCMT3R)~~4o8W}7ICsN3E3qNkhl4PB@g%>e9-rRgrI40=*6Cv?(UYJ z7xUlJYs3L5%cft7w_y%Uc=<-+Kc$M`R=EHKI1oad(v{3g=nit%ptxVz*9#C28RFHh z2-)l+E#k(2xBSBI*~)-ly6~cOZy+Fia`n+wtB&46AFG=7G&Suxw7aQkcXH1j4^S^K z!R^^2p7KlgIxWmM`&?tDdfBpoaC1O9mOlq4N-a&hhv+1HT(cYJrP@+B59ELHSQx<= zl;`yToumWwY@oJiVq)aocO#rLV_K5J#F@eF0JDbl2ioWbvj(%_FW*Pbg6|QMfP8s! zgb=b-6*zLp2V#beAdb22hDANdmV6bW@%~}aojAUktC$2iMI9s@aAuNjNoHQ;*h#v$ z$<9$u6JeARvg|&GArO_~{=DMnMqTJs%@)Wsh!wpWY&)8n+M#4~|={c{(3~y`LZ16;C zW758bR`MI+;(_IASy?Pn)!?$fGq}=(be2WM2&R)}uB%FQRV2WTX)|=;o}U`(REp|q zdznhp==L&iyTR;Y$oeVHPM2WS-KbG{i>g)H&LC(IkhGOKtQ&N3BP*>dW5!xdQ@pYs z0Xwp{pXeCiF~SN!3HXuYk!bE=K|5{$H{@o@2xmu=RHF(A6il$Yh%y0RGu01j0RyR( zfC&ZNNo_*xc370lpJH?!RKys>8j_AVFBjz0%eUSXU1~G#-ycr06>O4O1EE;BJPa~@ zn7eEmvqGm=ShSX+=Hi;BWvkjN?aoqfMbKN~MhaZcwkZ3-1nHKWqv<|l5rT~)eH~}Y z(v5Y=ifg2A>~*-xG-?xa*lM(;lEK85H!WVx^eJm-X@#|&4d!tf7y@t1x7}f}2mU!o zS#sULUr_KRlleRff|{HD{O8z9hp*nfW1v1=T6Se$&&`*;DE9n0{^!`srJh5N9C13Y z-rIY%&-YSoNS7HLY}Bq~`9g7N zVX_ewhNvb!Op&$%IzJfjNvDC(Z?b|;%!Nh=R+l_|dJ}4-{6B;qqNJOio_%Hd8$}*u z#x45BH=LC|i^W&z?28@$So~<}1F^@ZqEApJC~_hK$qQ^D?B{-aDNDly?+~`)1S^xi z6Fa{5W6`4!UO&1r`pNBA#Ga(*l>NoS;uz|z4LS_)7X*<7vYXrjK_cn$*{U>wV|oT zQ+#%A`4esrt7@D*mFK|S0lg6#wbih(E0yZnXxO^lQ0rNtUtY~wbXmphFY;N~*?;A+=6Gk>*Y`2hO*Q60bv)9h z1MvmG*;e_9s-!5q9dz=##V0cG{+G$UUBt4Chgs zOq^?fV!k$u><+(m_C@whv#gK$V@J~;Km(B4y5KyP$7O1FA-r7;+TLQkR{-JM=z4NY zgo?Tymu&E#Abw8n{hy$s&i5UXc@!7H^V{)$j;Sa_6X%u(_R5hY z^9M{>vI#`m^>h=Gqus^snzfzrpLEhgP~Sb}dkRU@V4!)NfTaHMlT4DnN>RpteV+=d zQ6jj6)TZb;Kmp`@X=r>fL{M??x!(KcPlGY&49&bQ#K7GYu>4Hy-d6)B?e!rF)9p8Ye4}9t8*CA6Srik{g>@a$|C;z3)h- ztu1q;ul;;!h=hbVfh3>bA-0)09S_kqCcBI&$0S#I6N3GJ25W~JPiQ#>5Upt-K z-ky1#2d!7H*}ghD-zJEojQCF*7A>VVL7qiqrm+Xq{AFbJHpG2G(-Z%OHd-_)PN{VhwO78Qf2Pb$2!@ounJiKRSvV|sq8@JOf;5msQuLV#0M@}ySgfxChX=k zb_$!)vFMr1K<=uE@lVw@%%r1LtJhw_;hhCPCD|9{>^_U^aI%484gCqRLBOUVheMj( zA7}S}(0X2I&OZ6%WtU06&in1IL%opA z8`e}Uv)Z-H-h}LKOgKCHofIWexsSadrG+^AsdQX4%nmU#GtUlffWq6lK{~!bu9&%0 z38QWaRkVOTlBgpALP3tkri4RTZUy5lz;xmRU5?qee5X0S<&1x3_7zyg>pLMwU~ScQ zfew%TV!hbWrSqTRC>Y3_B4EH1&p+Q;j~IKj=PvD3XMPMhD?Y-dT9|8e#5aojL(br~ zJPwISchrz-N(5e+#YkF2Ts9(m;CFax!0z`AIFN~98d_FL(0&u<-n+U4=@VL)>Rk0c zl}iKQ-J||xx(2qaUi{ENyvW};I5R^IZvcz`2-PYoJ*sgjyQ@-6&pHs+ zFSiqtNm^Ki5siZ9lKts2TQWT!Io8GH`*hs0EWCy{e0%*k4Bk`X1N)q_^+XN|ZUUR| z(e=ol068v?Kg6L)xJ(n;Un#Xf;^m})9n*1A(+E;13s@Rs0@wnx0`jNl9rM$eWlv+^ zKlg?&?SBL0#WXcX+5iOhVgdW)5gh}`-2LRaC;5cY4!;w4bJGKMUI zh)^nTr08`d&Yyu~g!s8{Iz4sYY{OK_ht!~yq=eWRD7PFo`={>nrDs2lBU8vE+J${c z?ywI)BU#^j9PxEDYo`p@ghwG$6@2qBLquS3O^IaVh72L>wF)NL`Sf|1(lDAl+9`en zfvG`;Y%yYqr$JSu{dLW+8=^&YrBqyyesfuiE0O?zv&T+g)taY`=9`Kzf?fLLObO zZbOPb>DwicldAgm@JgnTX6hH?DiDUUuKfo1fovS_$W>LeL;!)r8ln7st@^^{na8&I zmP=36u+43!Za>~>i}jpb-`SB4MIxbe$A_08ehaZ!%fw%de(vQ?>6&VGMNP2ek}L1H zb#%$>sc?9~As_BYhtWj~?dWN=O&Q-?hB5|c0_i7m0I>sX)KCUU*AI{%!J1H_jlsV~ zeM*hUApRq?U$}PTVV%`wWJe56o9^)J_XzPJRMoDO3@dBV#wg4gX`@?(27}9{V~mcS zeRWEB{K9vU{*})^=G!!3Fl*rX-M*+xo`=XfF4_}JG)Mu=D?LoM82EW9TP4g5PC`n; z{S}eZ)&y05<6-3FLC*qOGm3;SfV#0(tFhhJCW>voc9SJ#F}C~LMG+rH%SKP6v^3&j z8?do(ggHIGQaGX%kUi-TasWVueB#X1>?SfSyJ_K*i>h1j`5EFlvu-U#FZ2F4X@D&NPnqA`t9FyrHOZ_!2m` zC}K?CmwPk>TL<|<$p_o)l1(9emMFG=>Qg^j7&B;zefR^7meaUr@UD{V$Tg=DWqXQesn4-Tv+m z8LGe$s4K3;IH9Ei5I@0Xx*Uf}9tYXq07+|21SpCa+PO0SE!&O3rVR-jLJk3ueVCQj2g^4h_8}aKZ(7md!35Rs?`SofOMMM>K94uG)X(-1ed6*)qu=M5+FX`i zx1%@NzT_pp!T_Q;qfM)_Y4sL|LE(RCNqe$y$J%t6@Y%DCy*tB|E4*%(%k5pUVOMYC zSw!=hLRz&+sW$0s_7cEC{u7jm)zuyC#*Y@p@=v3VTo`dl%V|QA71DF8$kN$_N}xq( zJ|bilT;Ps8j9+*%<--&S627JKO<(E@j-Rk+|2#AE0&AAO!2$fj1(v$Shn{pr>99BD zyCsb{@X}4Q>21QYOJ={w9!|;FecnX)$HHfD$lZAE86pdwfhGtLl#mVo%`>pOrI%R~ zE`K^ETc-0f}-9KYqTucdgec%Z{N@TIrDbB$V^NbqaSex${;`;o6b zGp@v`pP-AdRKdEE|9+P>$GxdlVrSY@*Os@lkX}VR@iPBZkb9m1qyXw4MsC~Sz`mNmKfVW$uw^Zh5Um%Ze8pHv8&>10dbg~zE@ZO z0%YX5sTnzKOAF2-0OL6@RQ+yk>;oT&!OR1>_!mhWhFok$NfX){)_8Jmp{t>AVVYB0 zDOM3i6Kt`PtCb^)DcBee)|8MBi-UnI7@n&KcwJ>Pm^j30H|}2TH@8uBq2Z*J|okZS1I2_?K*0*KF{GSG6jm%YW>Sx$zfH zCTEY~16N_A@>S>CJn7IfZetO*Ccu(FC{+3<4=Pmg$KfmGB=I~=4h3@at>jRp{{_1E zd#*!l`D93&yAIBj&slI0o^)sK8aDv}@Wi6ep(cW8@C03!5o%6i_&|GaCF?;FHimLo zvVaQ+I6=KDvt~kSQv5!C$qvB-p*Rkc6j)Fia_$@iC=djilEy%G_7m!u-I|yAsJgNWT7;MKKkm+02k=R~Qp=t21=`-7!OUs27 z71sadTB=bldG)|pM_u+8CD>KtXNpddIDZfU&?p%#}jZ)9uf(az$4ORr{{ zP)W#cbO!`&SwIzE88+CM5MJMtSlg!cnu>gCKue4YwI2rd*0qbn4mf?{p}G=>F4W9s z?`bHjE728K2)=lS*rJBhNaZTg=-`G}rS=6^?F0N@R9RM+`&A0(278qcJ}#}<6LZ-d z#mZux3Pg$;9l(_VXL!9wTh&}!9S^aiauP#ouLT?g&H0S*r%|-(BBp03$`Jhp>>?g7 zpyZSet_V1yclGs2k27mOlE&)#neDt6Ca)eN~# z2qq7n(H^2d7rffQL;UclW-#J|VrE z?=OTo5TVbs+>GSOp0Ev z!3 zf}}wOKgOrTPhy_A7V>lNqCR+-52HdhhXWHBpn04dP;@{DK@<|Y9=ap( zJK-DdM3Q*($Txyq%B()~gIob=G^cc6#H4T)M5zB^=Yy9oXF|ZYD^PxEhv*CHUBz|b z!~MN&iwWO;M1Z4>iF#wuXw=f~Yo1{AVoB3pYC?&6cui$>7vM%&znR9_NIFLfh0~aw{ zBoh=xZNuOLF9H9b-GUi#0ho!lI|W-DrfTpy$omWS0_q0_*qkUQRFG@I{CY435uODq z5}En~NfB2M5s-y@Wk^GM4lZl}Auz|lwdIg|a_zF$++;?8C5VDZWUu!$5TAL4hz9hu zJA@cY>?*V&`57o@rTh%w2qk+Xlr-{Oz&QjV6H&_#V&w^XX^R8@Bz`dOxe;##ae~{= z{MZd(6|M4zf$Bg{Lp!;GmVcg<+r3ah<5S;1;BoSOx(xkH&t)d2Xu$8G2bD)$B7;*{ zWUsZp(s<)oTw30DO=rumo?&13`75t{U%bA&_xp#WmNmcK<3S|*%TW3NADXYXAzUwy zP^IWx6sa;1g2oeSQYI0IYgaaf#OtM(TBY^n<*cQZJzGBeOT;0&ebNuv1FXUU>YBTR z*Up?zNAYMfznh#7Z9(oJmMVoEb^Kxv@JAWjPk>P2W8;kD+j zC7KuD2~DTr34KAc@?h@Lglch5Ym~eV+~oj2>h|V2uWRe>8vU}q+<~NYBljzCzXa}G z7;h=+KL)Eo*P;`60w?f<@BG;N~P3w)*_2nS1bq~9d_%Hy{rTooqWi;SW?lTcWO)<>cVEEgs60eeOhfh zD7Y*!uTWy}S)CT6(c@bxXv+Mx;3Dvb?B#}1NC~qEWILrEJqVVU*0=@1S^^qIgQ<^@Q` zq1Kds+g)E|wLM?yH<-YV7BO2y?HLf>6f4&hIT`L+<>i4i>=*^E z7uhylXv1X7Ko8|P(vWG-0hbRjk@m!IVM$5il80_?&~ZnD0B(rVIC7baCIYD&x!u;!d%X^No>}8L^eH)=|%q{>Z?p zB>gjbBG!brr>C2x8=KCZ0|V0Rj~`{rKm7VrPd)UbN7>d7)4k+2_XO^xfi$#24#CZZ zw{lW!Z_*VJ1EDlb{TCUdsS6-{5;E5hcSh>uYLdQ3hRe%`ZmmCjs6*Yprap(|fnBEih6%sH&D{^t>I0}#ji-H!T9z6qh2rZ-)00JF?5j-TY=Fzkj z@{ngXq0nA}EI)(vH$^t5yP^RRWv+lpYcM&S24-?zke-gR4a}Ch@4nQTGt#}Wv9Z|L zXnbreKKi0AnuzMOisEoITr4J423?UxAu1H+BArU9RSAUqB`T{ z3airwR6LTgf8%X|?#Xd6rf2mwIFQIa}*;S`t#;NA*9 z?yNF%K5KQb%CN)TbY=Tb4wbR5Ep05a);K*H)9(F)%{qli zGePmfEbP+k#Wys_m_bq#a>>iS@Iao{7{C_l6zjaH+-Rw}s@-ndxqqHCnu#)kQ`3-Tx5jmh$_?A^*r1!RJIU z$V5PnK~#IZeN!8!e+X%y)Od)GWPo%BGdY@go?QR{FiLdD!-lC23*(18cP8vFG4%3C zWX!vuV&Xr-(04FH;t2b~H@Q1V)jWfV*W+OI`+XX|256D+I^dJW6~H%vTR}2=j4ZGE zFMO!rdyv0z?*gZS9M?n{K-+aM?&O0_zXjoeY%yYgB6j z9#2{AhWqK?-xsU;@lZ&HxuWCA7}uX)1XP7Sn@<@)@kq$&`22r|KV1UcDgjs%Y@f9N zUmdv^c}o7td0!ma$?VYR{G`*_(N6-HEYeu5CRYT!GF19afrTpz-v>D+X~075PGh7+ zRKht__c_w5dD=~oOIgXMoN`K#0XHQ>35Iz` z5(q^2h165iIWzswQ_Eqfp?w&nwyaB=@3JycdB&;Q( z#!i&nS30%NbEa%c`j?h%Ese>pX6enIod-}JvRwJ8IF50id%k79a`a~^0T+z*b{7bs zsJGJe*((Bxs%AUtwtxMZ5yiUN6LlwQH;6lL`}p_jx4-a6pR%+5n%ZmX)~Yt2xJN39 z3crksLM*A@_sPtb8+F35`0Toxe82mt zIDwu)S=72xkfBV>`x@)hlTes!*{_4^_t3vG?+`;Wf zQ8f9o`Mx-W*-r&9nb7j!1Omv4xK_x#38SXE053*`LC@9#_ygY@*Mce6<12XU{|x^lsCWxb?dH7?a#I1kXG6slcsMDbmUfA zEUT`F+&XFjl+|(Fe<`(B!pm~vi@r@!i#f3^p(^@0AQy$XFyR+u%RZ1ZuyTOp8yO?1 zIn)1-SYNgD%>LS(@F$7g#>R+mrSLDTWKDI_zviMh4e-tP)A9{fszX8^UbYIogdzO&nD?F zX|^aOoseGr!VK$>{``medMVh+DT?tX0bOANXmqQr1U~2yMo!k7k1h?P0r>>rTuJ7gU z+HcqONKdU(fwyuKfQ&cp-OG;r@Z?E$&+MzGPQCGCtIcZr@myP)=MzO+;=>7S{D@T; zT1X^{#?$h_FNC0n|?wbqYS*q6KoPg^3y< zB1xW?8esVV+wO6>Eyl&4c1DUtUA9yk^9VJ-_OnFA4(U$!R<%*E#VTVemBOfgHLy}t zn5-&xxp%wX1bfZww+~xv?WH#qg~zB}U;buAgY=k7_zcsi>w5R>)r0Fnh?d=> zu^`BNAE+91Z|ZocSwVjo#yb!KmSALNC8UdMG_dCZ^~$qM)b*Fh`YyC{eEAfZTeVm_sIq3B`SgOf^r z1IP%WsToEBK;^i$)SSdVLNnr(xdN2}D>{aqL{gccK2*!h0tMiJLNe)c!s84V2XFwm zrW2DD$Qto<-L>nlHdIAxclawpwio}=AqpOY&*pWlJU+G~+O>0e1)DXAI;~bzt5u69 z5AD`EjlUNfJ#MnRfr7x8=qR^j4_D`A_wA2Gs}-iFLyd}D;C5lfKK5GmKe^rZCbvcZ z<>-rur`M}ApaBw1hHE;nuQ#z!Fu1!r_WV~$f)&L^aG@71J3h9@7Fw~ZE;joS_*Rrk zkd`c)9NuMc>1NpHD>_QZvKTp(2sU~qqlYg$5wDI8mQE^~LZA8m{#AEM`>Vg|Syxh| z*Q<>$Reu$kIF$k-XZ4Ew_)NN&EPL{qND#L$5R# zRK{TSB?FDkqEK4jv2KNXNt3R!thrve;HkA649$b}E8AK&6+v0A)I?&HL6=7mwJLvI zyAL@y-H4cp$6bzSV0kIpq(c{8+ED8C82oO=&2 z5p@%VfD!&5_zxf~i7bw+unFW*XRoJY*?2CVTAcr8tF1r#nN^xO_xb4;o|oRC6{dUs z-1PJ3ge^0v*k!p``rXfCVLXckwsYxczOXcX_uc8G&;8@l)IIm4F4D~x<}QL)$Bu^r zvo;>@Z_Qq$#NqNgJbiVnGu;`xTCA9vnx5wVa>Uw$2Oz(O`2w0_XZ%F$1foVx#5$$7 zm~%ty#1tkL@6BrT&&(zLM`!fJ)r3=!W$F;-WMr#e1V<$WA0x#FtT31Z<_APIO)3Co zty;Z%`%?2V%hv4WeXW=>zyuD@JZaQZ@l8$Uk|oi_d!m+A!%HqQUQpK%yyLQ{3#POrM2u z{9f@MXf3sfb?U}=iJ?15P9eC3(29T~g2W}6TMmpBjGQ1az(@x8JWQm7wt|-hIF}|2 zts*6tEh6Slno>8W6p_YAJ!E-(IH)3YDEm=-=q~^8knf(M_`tn^Lx%$Q>aJJs->1Fa zb?E`;wfgDrvAftOihO>or=3ts$A*JnXxB zI5zZQ-=RbPdxm1ecl%P;Irn!tPinimv?rZi`<>Tm_wQ#%G(|c=^cL&v7C;Scuygu6 zZiim0_XaH`E|;s=q|<4QAbOKtP8RxDp*))Z_oacd!x*Rj8(-BJ`xO${#QwHd8Tb|D zttr%*>^IZ{Lma?Ua$OEFJdo#bvJ@sq3l;&cWzTW~O3b)tQgBdqrKZ#Ll|B#aJu-&w zgYqlU8nqHtZ+ zf^c2vrI3cCfIv9?^%Fk6BDb8=LxTdkVP_(-GqWRsvVT|BeRsqunJq@l48txZOg#nt%R_V~zjkXaAd@_kZ<_a{c~U{53Dv zTEtp{c9%ofU73d*!A;&`9u3NCG_vAB&!O)y>>&D8nl*V_k@@q2?_L2*r!2QgpXYu{8SMk}B}_c9H6VTnNS&L=2gPp`dgRkd}x#q{%KMC?$ND3&H`avMbfK z_L581BDHw_i`_Nfh~O4IbB@(i-~QzGpil7^v{J^k{pgowa4!yHczrHQj{(9{hEYem9hEr`R4iL0~JBUgD8D z93i#P21c0ha@d#Gf`e;2wG&K}abdItVES-t1aT1t0x`IhR)MkyV{AoH5D5)`|44lu zQWJ$K{H>nP!y15e2!uFs5oJqLC(@LEK#ZkQXVpGeNvYlI(HfFTjmBAO4J68~noCU% zr4n?82E8|2S_F1Zl}Z$qTAklvW0z2J%UM;;@_XCPtf*VbT63@~!N~Y;B{74MX{~z8 zm!-N2z1FPt)TTpTZ&+Pow-#x9E{D~ETtCRA;EcEo8jId&m7Y$|e1LsXTK0i|{Uo&+ zS?{9u_r5qW%td+YldS{)V@_JIp`C>#I)TXI{fn+!^dXcY3IyfD zy^Y`}1OF#Q8KVp_r-LP}F$^Lp+K)~L+5wbYs0J(x*djYG3CS#*Rn!=EYrr){TB}!p zK&FI@@IHbD6rM|1x-oErc$Kb%`oeSo@k!k64_Vj*ff)EtqqQ{ba%j|o&J?b&vBi!u zheE4UILa#ghP1vBRD~9c5{Z5_Dy@!Xpw>By?OIK1o8G216j!)as&=)(YPT3v^kvnl zrLSlmrFOkTe;fI5c3^>+D*!Qqbs(292O#YaJmMGpV(wrOT~mrRc0I z_LRDdo&F*n)0!Rn05VG>Y_(K+9<__HxQOQFsm6Q6=@qlz+(F(+~Wt7&cuFeOSD6{O}idDI|Ph>FMACbi`hr5*QlEF}>0(vF|e+L>bXBxcs2ph7PzdQjyhbQ8L)dxH?8t4i@SIQ%{zXZ|;jhw*`Wj%CqT@PO)dD`DGQhNAk-$ zSUGF*%Vdk*jS^rAEw-2z4d<5yEFaG=i&(xPzpTLWUHN4t^rnyHmnpmK=kv=tSSnu1 zFY6bDnYVYWZ?Jc4bZh3|$KcI*~u=9ZrfrVkpMb0Ev4gYeC#bHaTWp%8cHDH`?L=a;$tnnbWW^F)2 zF9v8Vg*nYq5QKKH*0J@h6F$w2Y!jYt3){-Ju}j!?;tVgDk7ZatJIDsuAUni{*f1Mmqil?gBjs(D<=6yRGY$j5aFiWm z$JyoV3O2>AWFKHx!KQtJUBj+r*RhlAdUgZ5k=?{@X8*u$VYjkVFhAeU?qGMa53&y- zp!IHc5Bo5?mz`#3*nR9H?0z789%K)(kFt-kkF$r_BkWQ333iq}#y-hD#Xij*XHT#v z*;DLk_6&O#6my?ppJkt8pJ(UTH2VVkNA^YbJbQut6MK<;iG7)Ug?*L11OU?4*w@)N z*emQ+_8R*p`xe-NzQexDzQ?}LUT6Qze!$*f=h>U=hwNY2kJ!JmA0znoC+y$ZPub7d z&)F~7FWG;vx7e@Pui4w|H|)3UckDme@7W*Nf3bJiAK9PSyKIL2nO$JBOk#f#79nMk zK#7zD(AElSK_h4douC&Cf)R6bvtSY6>=f)mk>C)Vf=ehC+(L=q5lV$J$YP)17Xm_1 zC>JV(kPsFkLZwh8R0~ldCd4r-sTJykdZ9r`2#rFM&@3c{7NJ#W6WWEv!V&g;m08VU4g>SSPF(I)x3wMq!h%S=h2j-QC+eHaR*`)ZIHVco=;=-jmIA z4~>rvj!xvn?!G=X#KXYg;f$_3n;kn6?-`pI$S?Md9U09p4rlr&^zs4O!Gi-67I`^0 z(hZ7!I_{zkbhLHh5&Rs}!Yz~I8hLecT-Af;$z(M>kTbZ}gn||nJ!8Xt_!t|~(8ox3 zc1YWk9nAFicIPr!8td-E(u5jIM{=30*fV)h)7w3q8SU%N8nG}O9~^~f8XP?+uZ>Mk z9K@*DH3hWu)7xH~t%FF83lfhz6J_GxkT?kv5js&{yBeEb+T z;4$S_rzI2CC;Ry84x@Ap^6KO`ttk150;5I7&^tCf+&wOzsl&=xHa>#wYLs>lp2&vp zk<92syl*hqJDH<_hIY{=eQ!3?hv(_V<0$&@gj)LGPp9eYp6KpD)tLJ-s7gH5M4UG+ z?c91qUYc*cag1-c9B$A(9G@ILoXHOM4`%vG|6j-X|7s`Qc){6@_dTHEueSD2j-o%I zdCcF~{ofws`>Q>}V+R+US@eGU|N1>9M{|?o<6~Kj(?K`9_+=VNvrALtpw-N*0-8VIz(@!Vj} zkQo`DI2J!LI0~tv%s}8~)tRHc!;^g(UFPU`_h=vQpjbpLW6K1|Db%qpb1W}b`a~>h z`ZJk6DmgvG1qAxwXm|FQmM>Em)$t`f*I>7XFOK*1oA^R*vIlQ7Ih=9ItH(wlM265+ zvuGt_*<;p=Hq(lHf#ZYY3R+XrM^1&$iA+}6Ka7{x_Crwfl2`MkNgRnSM*7G=-q5I% zDXfi+L(%M0$@>%sA&?XY2Qji7gusPRhJ2XN9V7_>fiXy%`QmtYHlw9w)aJpAg_g!A zA>p%`%O=r`jo2_S*~4!&HcIF7wc!bKesPdw13HaLURNF*9_z{I4vxhq#z@{~)CaTO zJw0ex_#PjKlZ;pLMeKm2%w(+xvtyHJtH*H5{`kbP@r-f+&px3Zz;mP66ax_Z=7F*7 z;Bj;oNTV!@Sc#_?n@|pp_KY1>4374X83uE?$wD=n$BbkFJ?y=E~ zng$0t3*VDUUdh@KYG@PKsTvuiZekcgkHGlFM+*gYLCeVG@WkLa+P~bLa*C13iHv46 zbA(r_jxX>=s2c^IFLQ*(OU39I9fJ?9T8yF9_jmVZ3{(s8@hn6{=7?b|d$4E*EjtrfJaLOVfqiQ|K#2K=L$Q@5Hprjl3m z;}8XLd3aXPGCn2`8gWZ#FDOS+OVs%Xu#9J+B2d4H=PsM1^36}alxX(3jE1**l$Y|d zNxXXnYJeAYq4d`D?{{2f9ZOLdIm#f-)1f?ARFEs4Pq5uA*PC zNzCSQitJ?1F?Duwl%7qK>qe>3L&^&|1%2ytkSwU+e%#)eUq&+?=^obS(2siu;%I8) zDtXz)Dmk zB~-(|(TY?#YSYKeIlL`3wcbo0Rf8!vHc16W!)$hJ*peF`hJ2fsB_?@8q5o^pBG4f+ z!#WyD<9s~P@KAM(oSQj}0xPUQ9~NzBpgwWP#IeHTlGx4`E|wc5**{TujNC*PbzQg=)+T!=CbOBsr4Dyz2fKTQGq}`f zZ#=I*C}>5T=su{K=*|t1T-Cyul7U(_p3&erFg@uW#-^hf{4hn(O$?x!LM6)PusAu= zlOs8)kryY&l@qA4oN^*dx;>r-{RF~~4w+x0vCA~Kk55qabE}i%>WL$R6S%Qz664Wu zpM7%luSPcP;=+4!l*FlSUcJ?z335G%7PwZTJv@>h-*s5Z>zcHP)=t8f7SS(9QEtNF z5%rPoEG;UJbWijS=#C5wPRO-~MKr}Y)wxO*K0Y=!LcNH8 { - switch (e.data.type) { - case 'focus': - { - iframe.focus(); - break; - } - case 'didChangeFocusLockIndicatorEnabled': - { - toggleFocusLockIndicatorEnabled(e.data.enabled); - break; - } - } -}); -events_1.onceDocumentLoaded(() => { - setInterval(() => { - var _a; - const iframeFocused = ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === 'IFRAME'; - document.body.classList.toggle('iframe-focused', iframeFocused); - }, 50); - iframe.addEventListener('load', () => { - // Noop - }); - input.addEventListener('change', e => { - const url = e.target.value; - navigateTo(url); - }); - forwardButton.addEventListener('click', () => { - history.forward(); - }); - backButton.addEventListener('click', () => { - history.back(); - }); - openExternalButton.addEventListener('click', () => { - vscode.postMessage({ - type: 'openExternal', - url: input.value - }); - }); - reloadButton.addEventListener('click', () => { - // This does not seem to trigger what we want - // history.go(0); - // This incorrectly adds entries to the history but does reload - iframe.src = input.value; - }); - navigateTo(settings.url); - toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled); - function navigateTo(url) { - iframe.src = url; - } -}); -function toggleFocusLockIndicatorEnabled(enabled) { - document.body.classList.toggle('enable-focus-lock-indicator', enabled); -} - - -/***/ }) - -/******/ }); +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(1),r=acquireVsCodeApi();const c=function(){const e=document.getElementById("simple-browser-settings");if(e){const t=e.getAttribute("data-settings");if(t)return JSON.parse(t)}throw new Error("Could not load settings")}(),a=document.querySelector("iframe"),u=document.querySelector(".header"),d=u.querySelector(".url-input"),i=u.querySelector(".forward-button"),s=u.querySelector(".back-button"),l=u.querySelector(".reload-button"),f=u.querySelector(".open-external-button");function y(e){document.body.classList.toggle("enable-focus-lock-indicator",e)}window.addEventListener("message",e=>{switch(e.data.type){case"focus":a.focus();break;case"didChangeFocusLockIndicatorEnabled":y(e.data.enabled)}}),o.onceDocumentLoaded(()=>{function e(e){try{const t=new URL(e);t.searchParams.append("vscodeBrowserReqId",Date.now().toString()),a.src=t.toString()}catch(t){a.src=e}}setInterval(()=>{var e;const t="IFRAME"===(null===(e=document.activeElement)||void 0===e?void 0:e.tagName);document.body.classList.toggle("iframe-focused",t)},50),a.addEventListener("load",()=>{}),d.addEventListener("change",t=>{e(t.target.value)}),i.addEventListener("click",()=>{history.forward()}),s.addEventListener("click",()=>{history.back()}),f.addEventListener("click",()=>{r.postMessage({type:"openExternal",url:d.value})}),l.addEventListener("click",()=>{a.src=d.value}),e(c.url),d.value=c.url,y(c.focusLockIndicatorEnabled)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.onceDocumentLoaded=void 0,t.onceDocumentLoaded=function(e){"loading"===document.readyState||"uninitialized"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}}]); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/extensions/simple-browser/media/index.js.map b/extensions/simple-browser/media/index.js.map index d6128aae..df62d302 100644 --- a/extensions/simple-browser/media/index.js.map +++ b/extensions/simple-browser/media/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./preview-src/events.ts","webpack:///./preview-src/index.ts"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFa;AACb;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACfa;AACb;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,iBAAiB,mBAAO,CAAC,yCAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./preview-src/index.ts\");\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.onceDocumentLoaded = void 0;\nfunction onceDocumentLoaded(f) {\n if (document.readyState === 'loading' || document.readyState === 'uninitialized') {\n document.addEventListener('DOMContentLoaded', f);\n }\n else {\n f();\n }\n}\nexports.onceDocumentLoaded = onceDocumentLoaded;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"./events\");\nconst vscode = acquireVsCodeApi();\nfunction getSettings() {\n const element = document.getElementById('simple-browser-settings');\n if (element) {\n const data = element.getAttribute('data-settings');\n if (data) {\n return JSON.parse(data);\n }\n }\n throw new Error(`Could not load settings`);\n}\nconst settings = getSettings();\nconst iframe = document.querySelector('iframe');\nconst header = document.querySelector('.header');\nconst input = header.querySelector('.url-input');\nconst forwardButton = header.querySelector('.forward-button');\nconst backButton = header.querySelector('.back-button');\nconst reloadButton = header.querySelector('.reload-button');\nconst openExternalButton = header.querySelector('.open-external-button');\nwindow.addEventListener('message', e => {\n switch (e.data.type) {\n case 'focus':\n {\n iframe.focus();\n break;\n }\n case 'didChangeFocusLockIndicatorEnabled':\n {\n toggleFocusLockIndicatorEnabled(e.data.enabled);\n break;\n }\n }\n});\nevents_1.onceDocumentLoaded(() => {\n setInterval(() => {\n var _a;\n const iframeFocused = ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === 'IFRAME';\n document.body.classList.toggle('iframe-focused', iframeFocused);\n }, 50);\n iframe.addEventListener('load', () => {\n // Noop\n });\n input.addEventListener('change', e => {\n const url = e.target.value;\n navigateTo(url);\n });\n forwardButton.addEventListener('click', () => {\n history.forward();\n });\n backButton.addEventListener('click', () => {\n history.back();\n });\n openExternalButton.addEventListener('click', () => {\n vscode.postMessage({\n type: 'openExternal',\n url: input.value\n });\n });\n reloadButton.addEventListener('click', () => {\n // This does not seem to trigger what we want\n // history.go(0);\n // This incorrectly adds entries to the history but does reload\n iframe.src = input.value;\n });\n navigateTo(settings.url);\n toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled);\n function navigateTo(url) {\n iframe.src = url;\n }\n});\nfunction toggleFocusLockIndicatorEnabled(enabled) {\n document.body.classList.toggle('enable-focus-lock-indicator', enabled);\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./preview-src/index.ts","webpack:///./preview-src/events.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","events_1","vscode","acquireVsCodeApi","settings","element","document","getElementById","data","getAttribute","JSON","parse","Error","getSettings","iframe","querySelector","header","input","forwardButton","backButton","reloadButton","openExternalButton","toggleFocusLockIndicatorEnabled","enabled","body","classList","toggle","window","addEventListener","e","type","focus","onceDocumentLoaded","navigateTo","rawUrl","url","URL","searchParams","append","Date","now","toString","src","_a","setInterval","iframeFocused","activeElement","tagName","target","history","forward","back","postMessage","focusLockIndicatorEnabled","f","readyState"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,+BC7ErDrB,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,IACtD,MAAMe,EAAW,EAAQ,GACnBC,EAASC,mBAWf,MAAMC,EAVN,WACI,MAAMC,EAAUC,SAASC,eAAe,2BACxC,GAAIF,EAAS,CACT,MAAMG,EAAOH,EAAQI,aAAa,iBAClC,GAAID,EACA,OAAOE,KAAKC,MAAMH,GAG1B,MAAM,IAAII,MAAM,2BAEHC,GACXC,EAASR,SAASS,cAAc,UAChCC,EAASV,SAASS,cAAc,WAChCE,EAAQD,EAAOD,cAAc,cAC7BG,EAAgBF,EAAOD,cAAc,mBACrCI,EAAaH,EAAOD,cAAc,gBAClCK,EAAeJ,EAAOD,cAAc,kBACpCM,EAAqBL,EAAOD,cAAc,yBA8DhD,SAASO,EAAgCC,GACrCjB,SAASkB,KAAKC,UAAUC,OAAO,8BAA+BH,GA9DlEI,OAAOC,iBAAiB,UAAWC,IAC/B,OAAQA,EAAErB,KAAKsB,MACX,IAAK,QAEGhB,EAAOiB,QACP,MAER,IAAK,qCAEGT,EAAgCO,EAAErB,KAAKe,YAKvDtB,EAAS+B,mBAAmB,KAkCxB,SAASC,EAAWC,GAChB,IACI,MAAMC,EAAM,IAAIC,IAAIF,GAGpBC,EAAIE,aAAaC,OAAO,qBAAsBC,KAAKC,MAAMC,YACzD3B,EAAO4B,IAAMP,EAAIM,WAErB,MAAOE,GACH7B,EAAO4B,IAAMR,GA1CrBU,YAAY,KACR,IAAID,EACJ,MAAME,EAAoG,YAAjD,QAAjCF,EAAKrC,SAASwC,qBAAkC,IAAPH,OAAgB,EAASA,EAAGI,SAC7FzC,SAASkB,KAAKC,UAAUC,OAAO,iBAAkBmB,IAClD,IACH/B,EAAOc,iBAAiB,OAAQ,QAGhCX,EAAMW,iBAAiB,SAAUC,IAE7BI,EADYJ,EAAEmB,OAAO9D,SAGzBgC,EAAcU,iBAAiB,QAAS,KACpCqB,QAAQC,YAEZ/B,EAAWS,iBAAiB,QAAS,KACjCqB,QAAQE,SAEZ9B,EAAmBO,iBAAiB,QAAS,KACzC1B,EAAOkD,YAAY,CACftB,KAAM,eACNK,IAAKlB,EAAM/B,UAGnBkC,EAAaQ,iBAAiB,QAAS,KAInCd,EAAO4B,IAAMzB,EAAM/B,QAEvB+C,EAAW7B,EAAS+B,KACpBlB,EAAM/B,MAAQkB,EAAS+B,IACvBb,EAAgClB,EAASiD,8B,6BCpE7C1E,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,IACtDnB,EAAQiE,wBAAqB,EAS7BjE,EAAQiE,mBARR,SAA4BsB,GACI,YAAxBhD,SAASiD,YAAoD,kBAAxBjD,SAASiD,WAC9CjD,SAASsB,iBAAiB,mBAAoB0B,GAG9CA","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"./events\");\nconst vscode = acquireVsCodeApi();\nfunction getSettings() {\n const element = document.getElementById('simple-browser-settings');\n if (element) {\n const data = element.getAttribute('data-settings');\n if (data) {\n return JSON.parse(data);\n }\n }\n throw new Error(`Could not load settings`);\n}\nconst settings = getSettings();\nconst iframe = document.querySelector('iframe');\nconst header = document.querySelector('.header');\nconst input = header.querySelector('.url-input');\nconst forwardButton = header.querySelector('.forward-button');\nconst backButton = header.querySelector('.back-button');\nconst reloadButton = header.querySelector('.reload-button');\nconst openExternalButton = header.querySelector('.open-external-button');\nwindow.addEventListener('message', e => {\n switch (e.data.type) {\n case 'focus':\n {\n iframe.focus();\n break;\n }\n case 'didChangeFocusLockIndicatorEnabled':\n {\n toggleFocusLockIndicatorEnabled(e.data.enabled);\n break;\n }\n }\n});\nevents_1.onceDocumentLoaded(() => {\n setInterval(() => {\n var _a;\n const iframeFocused = ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === 'IFRAME';\n document.body.classList.toggle('iframe-focused', iframeFocused);\n }, 50);\n iframe.addEventListener('load', () => {\n // Noop\n });\n input.addEventListener('change', e => {\n const url = e.target.value;\n navigateTo(url);\n });\n forwardButton.addEventListener('click', () => {\n history.forward();\n });\n backButton.addEventListener('click', () => {\n history.back();\n });\n openExternalButton.addEventListener('click', () => {\n vscode.postMessage({\n type: 'openExternal',\n url: input.value\n });\n });\n reloadButton.addEventListener('click', () => {\n // This does not seem to trigger what we want\n // history.go(0);\n // This incorrectly adds entries to the history but does reload\n iframe.src = input.value;\n });\n navigateTo(settings.url);\n input.value = settings.url;\n toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled);\n function navigateTo(rawUrl) {\n try {\n const url = new URL(rawUrl);\n // Try to bust the cache for the iframe\n // There does not appear to be any way to reliably do this except modifying the url\n url.searchParams.append('vscodeBrowserReqId', Date.now().toString());\n iframe.src = url.toString();\n }\n catch (_a) {\n iframe.src = rawUrl;\n }\n }\n});\nfunction toggleFocusLockIndicatorEnabled(enabled) {\n document.body.classList.toggle('enable-focus-lock-indicator', enabled);\n}\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.onceDocumentLoaded = void 0;\nfunction onceDocumentLoaded(f) {\n if (document.readyState === 'loading' || document.readyState === 'uninitialized') {\n document.addEventListener('DOMContentLoaded', f);\n }\n else {\n f();\n }\n}\nexports.onceDocumentLoaded = onceDocumentLoaded;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/simple-browser/media/main.css b/extensions/simple-browser/media/main.css index 9192d4b6..6c821f55 100644 --- a/extensions/simple-browser/media/main.css +++ b/extensions/simple-browser/media/main.css @@ -52,6 +52,7 @@ button { button:hover:not(:disabled) { cursor: pointer; + color: var(--vscode-button-foreground); background: var(--vscode-button-hoverBackground); } @@ -93,6 +94,7 @@ iframe { width: 100%; height: 100%; border: none; + background: white; /* Browsers default to a white background */ } .iframe-focused-alert { diff --git a/extensions/simple-browser/package.json b/extensions/simple-browser/package.json index d93645f1..5ba906d1 100644 --- a/extensions/simple-browser/package.json +++ b/extensions/simple-browser/package.json @@ -16,11 +16,16 @@ "categories": [ "Other" ], + "extensionKind": [ + "ui", + "workspace", + "web" + ], "activationEvents": [ "onCommand:simpleBrowser.show", "onCommand:simpleBrowser.api.open", - "onUriOpen:http", - "onUriOpen:https" + "onOpenExternalUri:http", + "onOpenExternalUri:https" ], "contributes": { "commands": [ @@ -49,21 +54,22 @@ "watch": "npm run build-preview && gulp watch-extension:markdown-language-features", "vscode:prepublish": "npm run build-ext && npm run build-preview", "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", - "build-preview": "webpack --mode development", - "build-preview-production": "webpack --mode production", + "build-preview": "npx webpack-cli --mode development", + "build-preview-production": "npx webpack-cli --mode production", "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", - "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose", + "postinstall": "node ./build/copy" }, "dependencies": { - "vscode-codicons": "^0.0.12", "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^12.11.7", - "ts-loader": "^6.2.1", - "typescript": "^3.7.3", - "webpack": "^4.41.2", - "webpack-cli": "^3.3.0" + "vscode-codicons": "^0.0.14", + "@types/node": "^12.11.7" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" } } diff --git a/extensions/simple-browser/preview-src/index.ts b/extensions/simple-browser/preview-src/index.ts index 564224fd..83cb3ded 100644 --- a/extensions/simple-browser/preview-src/index.ts +++ b/extensions/simple-browser/preview-src/index.ts @@ -84,10 +84,22 @@ onceDocumentLoaded(() => { }); navigateTo(settings.url); + input.value = settings.url; + toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled); - function navigateTo(url: string): void { - iframe.src = url; + function navigateTo(rawUrl: string): void { + try { + const url = new URL(rawUrl); + + // Try to bust the cache for the iframe + // There does not appear to be any way to reliably do this except modifying the url + url.searchParams.append('vscodeBrowserReqId', Date.now().toString()); + + iframe.src = url.toString(); + } catch { + iframe.src = rawUrl; + } } }); diff --git a/extensions/simple-browser/src/simpleBrowserView.ts b/extensions/simple-browser/src/simpleBrowserView.ts index 104acfe9..ef491d60 100644 --- a/extensions/simple-browser/src/simpleBrowserView.ts +++ b/extensions/simple-browser/src/simpleBrowserView.ts @@ -37,6 +37,9 @@ export class SimpleBrowserView extends Disposable { }, { enableScripts: true, retainContextWhenHidden: true, + localResourceRoots: [ + vscode.Uri.joinPath(extensionUri, 'media') + ] })); this._register(this._webviewPanel.webview.onDidReceiveMessage(e => { @@ -86,8 +89,8 @@ export class SimpleBrowserView extends Disposable { const mainJs = this.extensionResourceUrl('media', 'index.js'); const mainCss = this.extensionResourceUrl('media', 'main.css'); - const codiconsUri = this.extensionResourceUrl('node_modules', 'vscode-codicons', 'dist', 'codicon.css'); - const codiconsFontUri = this.extensionResourceUrl('node_modules', 'vscode-codicons', 'dist', 'codicon.ttf'); + const codiconsUri = this.extensionResourceUrl('media', 'codicon.css'); + const codiconsFontUri = this.extensionResourceUrl('media', 'codicon.ttf'); return /* html */ ` @@ -126,7 +129,7 @@ export class SimpleBrowserView extends Disposable { class="reload-button icon"> - +