From 0ccac1d0c991ec605db93326f1396bd0bdff71db Mon Sep 17 00:00:00 2001 From: HelloThisWorld Date: Thu, 6 Aug 2026 22:35:09 +0800 Subject: [PATCH 1/2] docs: add Japanese README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds README.ja.md as a maintained Japanese counterpart to the English README, and a language selector to the top of both files. The translation mirrors the English original section for section: download channels, distribution formats, core features, portable mode, build and test commands, privacy and security, code signing policy, and license and upstream notices. It links to the Japanese website at https://winterm.dev/ja/. Facts are taken from the current README rather than restated: the source version 1.3.0-beta3, the latest stable release 1.2.0, the beta prerelease tag, the asset filename patterns, SHA256SUMS.txt, and the pinned upstream baseline. Commands, filenames, executable names, JSON setting names, version strings, hashes, release URLs, and relative documentation links are preserved verbatim, and the single code block is byte-identical to the English one. Every disclosure is carried over rather than softened: the unsigned installer and SmartScreen warning, the checksum verification step, the current "not Authenticode-signed" status, the exact SignPath attribution sentence, and the Microsoft non-affiliation disclaimer. Links to English-only documentation are labelled (英語), and the README states that winTerm-specific new features still display some English text, which matches the actual ja-JP resource coverage. Validation: - scripts/winterm/verify-version.ps1 gains eleven checks covering the two language links, the website link, both version references, the checksum filename, the signing disclosures, the SignPath attribution, the non-affiliation disclaimer, and the upstream baseline. The script passes. - README.ja.md added to the documentation allowlist in ChangeClassification.psm1, so a translation-only change classifies as docs-only. scripts/winterm/test-ci-classification.ps1 passes. - All 21 relative links in README.ja.md resolve, and the file is UTF-8 with LF endings and no BOM. No application code, resource, or version file changed, and no release was produced. The changelog records this under Unreleased rather than fabricating a version. --- CHANGELOG.md | 31 ++++ README.ja.md | 183 +++++++++++++++++++ README.md | 2 + scripts/winterm/ci/ChangeClassification.psm1 | 1 + scripts/winterm/verify-version.ps1 | 17 ++ 5 files changed, 234 insertions(+) create mode 100644 README.ja.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f972fdd2..aee5c1000 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## Unreleased + +Documentation-only work. No application code, resource, or version file +changed, and no release was produced. + +### Documentation + +- Added `README.ja.md`, a Japanese counterpart to the English README that + mirrors the same download channels, distribution formats, core features, + portable-mode behavior, build and test commands, privacy statement, code + signing policy, and license and upstream notices. Commands, filenames, + executable names, JSON setting names, version strings, the pinned upstream + baseline, and release URLs are preserved verbatim, and the unsigned + installer, SmartScreen, checksum, current signing status, and Microsoft + non-affiliation disclosures are carried over in full. Links to + English-only documentation are labelled as such, and the translation states + that winTerm-specific new features still display some English text. +- Added a language selector to the top of both README files: `README.md` + links to `README.ja.md` and `README.ja.md` links back to `README.md` and + to the Japanese website at . +- Extended `scripts/winterm/verify-version.ps1` so documentation validation + covers the Japanese README: the two language links, the website link, the + source and stable version references, the checksum filename, the + unsigned-installer and current signing-status disclosures, the exact + SignPath attribution, the Microsoft non-affiliation disclaimer, and the + pinned upstream baseline. +- Added `README.ja.md` to the conservative documentation allowlist in + `scripts/winterm/ci/ChangeClassification.psm1`, so translation-only + changes classify as `docs-only` and never request a native build. + + ## 1.3.0-beta3 - 2026-08-05 Third beta of the Command Timeline release, fixing the beta2 field report diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 000000000..4fb09cbb6 --- /dev/null +++ b/README.ja.md @@ -0,0 +1,183 @@ +[English](README.md) | 日本語 + +# winTerm + +[![Validation](https://github.com/HelloThisWorld/winTerm/actions/workflows/winterm-validation.yml/badge.svg)](https://github.com/HelloThisWorld/winTerm/actions/workflows/winterm-validation.yml) +[![Windows CI](https://img.shields.io/github/actions/workflow/status/HelloThisWorld/winTerm/winterm-validation.yml?branch=main&label=Windows%20CI)](https://github.com/HelloThisWorld/winTerm/actions/workflows/winterm-validation.yml) +[![Latest release](https://img.shields.io/github/v/release/HelloThisWorld/winTerm?display_name=tag&label=release)](https://github.com/HelloThisWorld/winTerm/releases/latest) + +日本語の製品ページ: + +## winTermをダウンロード + +[**最新の安定版リリースページを開いて、x64版のwinTermをダウンロードする**](https://github.com/HelloThisWorld/winTerm/releases/latest) + +最新の安定版リリースページには、インストーラー(Setup EXE)、ポータブルZIP、 +リリースノート、チェックサムがまとめて掲載されています。 + +Command Timelineを先行して試せる**ベータ版**のチャンネルもあります。 +[v1.3.0-beta3](https://github.com/HelloThisWorld/winTerm/releases/tag/v1.3.0-beta3) +はGitHubのプレリリースとして公開されており、資産の構成は安定版と同じです。 +ベータ版は動作確認を目的とした配布のため、通常の利用には上記の安定版を推奨します。 + +インストーラーは署名されていないため、Windowsに「不明な発行元」または +SmartScreenの警告が表示される場合があります。必ず上記の公式リリースから +ダウンロードし、同梱の `SHA256SUMS.txt` を確認してから実行してください。 + +winTermは、`helloThisWorld` が公開している独立したオープンソースの +Windows 11向けターミナルです。Microsoft Terminalのソースコードを基にしていますが、 +Microsoftの製品ではなく、Microsoftによる提供・承認・支援を受けたものでもありません。 +Microsoft、Windows、Windows Terminalのロゴも使用していません。 + +## 配布形式 + +主な配布形式は、アンパッケージ形式で自己完結したInno Setup製のEXEです。 +ポータブルZIPも提供しています。バージョンを `` とすると、 +推奨されるアプリケーションのダウンロードは次の2つだけです。 + +- `winTerm--setup-x64.exe` — 現在のユーザー、または全ユーザーへのインストール用; +- `winTerm--portable-x64.zip` — 展開してそのまま実行する用。 + +現在のソースバージョンは `1.3.0-beta3` で、 +最新の安定版リリースは `1.2.0` です。公開されている資産の一覧とチェックサムの全体は、 +[最新の公式リリース](https://github.com/HelloThisWorld/winTerm/releases/latest) +を参照してください。 + +リリースが署名されていない場合は、そのリリースノートに明記されています。 +Windowsに「不明な発行元」またはSmartScreenの警告が表示される場合があるため、 +同じリリースに含まれる `SHA256SUMS.txt` で検証してください。 +リリースEXEのインストールに、証明書のインポート、開発者モード、Visual Studio、 +Windows SDK、`Add-AppxPackage` は一切必要ありません。 + +[インストール手順(英語)](docs/user/installation.md)と +[1.2.0のリリースノート(英語)](docs/releases/1.2.0.md)もあわせて参照してください。 + +## 主な機能 + +- ペインごとの**Command Timeline**(`Ctrl+Tab`、またはターミナル左端の細い + ハンドル): そのペインで実行したコマンドをメモリ上に保持する一覧です。 + OSC 133のシェル統合の情報だけから構築され、実行せずに入力欄へ読み込む操作、 + 大文字と小文字を区別しない文字列での絞り込み、コマンドや出力のコピー、 + 出力位置への移動に対応し、推測を行わない ✓/✕/Running の状態表示を備えます; +- PowerShellの自動的なシェル統合: 素の `powershell.exe` または `pwsh.exe` + プロファイルは、起動時に同梱の `winTerm.Shell` モジュールを読み込みます + (プロファイルごとの設定 `"shellIntegration.autoInject"`、既定は有効)。 + そのためコマンドの区切りが最初から機能します。独自に指定された + コマンドラインが書き換えられることはなく、`cmd.exe` を推測することもありません; +- フォーカス中のペインを基準にした上・下・左・右への分割。プロファイルの選択を + 引き継ぎ、失敗時はトランザクションとしてロールバックします; +- 境界のドラッグによるペインのサイズ変更。連続的な更新、最小サイズの制約、 + 4分の1・3分の1・50%のスナップ位置に対応します; +- Altキーを併用した自由なサイズ変更、安定したスナップのヒステリシス、 + 正確なサイズ変更の取り消しとやり直し、そして1コマンドで実行できる + **Balance Panes**(ペインのバランス調整); +- ペインのアイコン、タイトル、実際の状態テキスト、統一されたオーバーフロー + メニューを備えたコンパクトなペインヘッダー。ペインの位置を入れ替えるための + 操作要素は持ちません; +- ウェブサイトと調和したダークなネイティブウィンドウ、タブストリップ、 + ペイン表面、細い青灰色の分割線、ミントカラーのフォーカスとサイズ変更の表示; +- ペインのサイズ変更とアプリケーションUIの設定、キーボードによるサイズ変更 + コマンド、ハイコントラストに対応した分割線の表示、スクリーンリーダー向けラベル; +- ペインごとのVisual Progress。標準のOSC進捗、シェルのライフサイクル状態、 + 一般的なCLIの進捗表示の範囲を限定したローカルな認識に対して、 + Rainbow Arc Weldのオーバーレイを表示します。描画は環境に応じて調整され、 + 状態はアクセシビリティに配慮して読み上げられます; +- `%LOCALAPPDATA%\winTerm` を使う独立したデータ領域と `winterm.exe` の + コマンド登録。Windows Terminalや `wt.exe` を置き換えることはありません; +- PowerShell、CMD、WSLプロファイルの動的な検出、テーマ、アプリ内蔵フォント、 + ワークスペース、スナップショット、診断、複数行の貼り付け保護。 + +Windowsのファイル名は大文字と小文字を区別しないため、製品名の表記に合わせた +実行ファイル `winTerm.exe` は `winterm.exe` としてもそのまま起動できます。 +インストーラーは `PATH` を全体的に書き換えるのではなく、App Pathsのエントリを使用します。 + +## ポータブルモード + +ポータブルZIPの中身をすべて書き込み可能なディレクトリへ展開し、 +`winTerm.exe` を実行してください。同梱の `portable.marker` があると、winTermは設定、 +テーマ、ワークスペース、スナップショット、ログ、更新データを、隣接する `data` +ディレクトリ以下に保存します。このマーカーを削除すると、データの保存先は +`%LOCALAPPDATA%\winTerm` に切り替わります。 + +ポータブルモードは、レジストリを変更せず、ショートカットを作成せず、 +アンインストーラーを登録せず、管理者権限も必要としません。 + +## ビルドとテスト + +PowerShell 7と、[ビルド手順(英語)](docs/build.md)に記載されたMicrosoft Terminalの +ツールチェーンを使用します。 + +```powershell +.\scripts\winterm\build.ps1 -Configuration Release -Platform x64 -IncludeTests +.\scripts\winterm\test.ps1 -Suite Relevant -Configuration Release -Platform x64 +.\scripts\winterm\build-unpackaged.ps1 -Configuration Release -Platform x64 +.\scripts\winterm\build-installer.ps1 -Version 1.3.0-beta3 -Platform x64 +.\scripts\winterm\build-portable.ps1 -Version 1.3.0-beta3 -Platform x64 +``` + +アンパッケージ形式の生成処理では、統合されたリソースインデックスを作るための +アップストリーム由来のビルド中間物として、署名なしのMSIXのみを使用します。 +MSIXは、ステージ、リリースの許可リスト、利用者向けの主要なインストール経路には +一切含まれません。 + +## プライバシーとセキュリティ + +winTermは、コマンド内容、ターミナル出力、クリップボード内容、ワークスペース内容、 +作業ディレクトリ、利用状況を収集しません。クラッシュレポートの送信は既定で無効の +オプトインです。Visual Progressの認識処理はローカルで完結し、範囲を限定した +メモリ上の処理として行われます。ターミナルの内容を送信したり保存したりすることは +ありません。詳細は [PRIVACY.md(英語)](PRIVACY.md)、 +[SECURITY.md(英語)](SECURITY.md)、[SUPPORT.md(英語)](SUPPORT.md)を参照してください。 + +## コード署名ポリシー + +Free code signing provided by SignPath.io, certificate by SignPath Foundation. + +正式なポリシーは [CODE_SIGNING_POLICY.md(英語)](CODE_SIGNING_POLICY.md)です。 + +### 役割 + +- 作成者、コミッター、レビュアー: + [HelloThisWorld](https://github.com/HelloThisWorld) +- 承認者: + [HelloThisWorld](https://github.com/HelloThisWorld) + +公式のリリース資産は、この公開リポジトリから、変更されないリリースタグを起点として、 +GitHub Actionsのマネージドランナー上でビルドされます。 + +リリースの署名要求には、毎回手動での承認が必要です。 + +**現在の状態:** 最新の公開リリースはAuthenticode署名されていません。SignPathの証明書は +まだ発行されていません。正式な状態は +[CODE_SIGNING_POLICY.md(英語)](CODE_SIGNING_POLICY.md)を参照してください。 + +winTermのプライバシーポリシーは [PRIVACY.md(英語)](PRIVACY.md)を参照してください。 + +## ライセンスとアップストリーム + +winTermは、Microsoft TerminalのMITライセンス、著作権表示、サードパーティ通知を +そのまま維持しています。固定しているアップストリームの基準は +`release-1.25@1cea42d433253d95c4487a3037db48197b5e72f4` です。 + +[LICENSE](LICENSE)、[NOTICE.md(英語)](NOTICE.md)、 +[THIRD_PARTY_NOTICES.md(英語)](THIRD_PARTY_NOTICES.md)、 +[アップストリームの同期(英語)](docs/upstream-sync.md)を参照してください。 + +## サポートと関連ドキュメント + +不具合の報告や機能の要望は +[GitHubのIssue](https://github.com/HelloThisWorld/winTerm/issues)へお寄せください。 +サポート方針は [SUPPORT.md(英語)](SUPPORT.md)、 +セキュリティ上の問題の報告手順は [SECURITY.md(英語)](SECURITY.md)に記載しています。 + +利用者向けのドキュメントは `docs/user/` にあります。 +[はじめに(英語)](docs/user/getting-started.md)、 +[Command Timeline(英語)](docs/user/command-timeline.md)、 +[キーボードショートカット(英語)](docs/user/keyboard-shortcuts.md)、 +[設定(英語)](docs/user/settings.md)、 +[アンインストール(英語)](docs/user/uninstall.md)などが含まれます。 + +リポジトリのドキュメントとアプリケーションのUIは、現時点ではすべてが日本語で +提供されているわけではありません。アプリケーションの表示言語はWindowsの言語設定に +従い、日本語も選択できますが、winTerm固有の新機能では一部の表示が英語のままです。 +このREADMEの日本語訳は、英語版 [README.md](README.md) を正本として同期しています。 diff --git a/README.md b/README.md index a640cff0c..2d52cc784 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +English | [日本語](README.ja.md) + # winTerm [![Validation](https://github.com/HelloThisWorld/winTerm/actions/workflows/winterm-validation.yml/badge.svg)](https://github.com/HelloThisWorld/winTerm/actions/workflows/winterm-validation.yml) diff --git a/scripts/winterm/ci/ChangeClassification.psm1 b/scripts/winterm/ci/ChangeClassification.psm1 index 22a10249c..51d88a6e1 100644 --- a/scripts/winterm/ci/ChangeClassification.psm1 +++ b/scripts/winterm/ci/ChangeClassification.psm1 @@ -28,6 +28,7 @@ function Test-WinTermDocumentationPath 'CONTRIBUTING.md', 'PRIVACY.md', 'README.md', + 'README.ja.md', 'SECURITY.md', 'SUPPORT.md' ) diff --git a/scripts/winterm/verify-version.ps1 b/scripts/winterm/verify-version.ps1 index 179c92e95..348df113d 100644 --- a/scripts/winterm/verify-version.ps1 +++ b/scripts/winterm/verify-version.ps1 @@ -145,6 +145,23 @@ try Assert-Condition ((Get-Text 'README.md').Contains("current source version is ``$($version.applicationVersion)``")) 'README source version matches release metadata' Assert-Condition ((Get-Text 'README.md').Contains('latest stable release is `1.2.0`')) 'README retains public Latest 1.2.0' + # The Japanese README is a maintained counterpart, not a marketing summary: + # both files must link to each other, the translation must point at the + # Japanese website, and it must mirror the same release facts and the same + # signing and non-affiliation disclosures as the English original. + $readmeJa = Get-Text 'README.ja.md' + Assert-Condition ((Get-Text 'README.md').Contains('[日本語](README.ja.md)')) 'README links to the Japanese README' + Assert-Condition ($readmeJa.Contains('[English](README.md)')) 'Japanese README links back to the English README' + Assert-Condition ($readmeJa.Contains('https://winterm.dev/ja/')) 'Japanese README links to the Japanese website' + Assert-Condition ($readmeJa.Contains("現在のソースバージョンは ``$($version.applicationVersion)``")) 'Japanese README source version matches release metadata' + Assert-Condition ($readmeJa.Contains('最新の安定版リリースは `1.2.0`')) 'Japanese README retains public Latest 1.2.0' + Assert-Condition ($readmeJa.Contains('SHA256SUMS.txt')) 'Japanese README retains the checksum filename' + Assert-Condition ($readmeJa.Contains('SmartScreen')) 'Japanese README retains the unsigned-installer disclosure' + Assert-Condition ($readmeJa.Contains('Authenticode署名されていません')) 'Japanese README retains the current signing status' + Assert-Condition ($readmeJa.Contains('Free code signing provided by SignPath.io, certificate by SignPath Foundation.')) 'Japanese README retains the exact SignPath attribution' + Assert-Condition ($readmeJa.Contains('Microsoftによる提供・承認・支援を受けたものでもありません')) 'Japanese README retains the Microsoft non-affiliation disclaimer' + Assert-Condition ($readmeJa.Contains('release-1.25@1cea42d433253d95c4487a3037db48197b5e72f4')) 'Japanese README retains the pinned upstream baseline' + if ($RequireTag) { $tag = (& git describe --tags --exact-match 2>$null).Trim() From 776edb6333515de02b6d8ca12d2b88d390f885e6 Mon Sep 17 00:00:00 2001 From: HelloThisWorld Date: Thu, 6 Aug 2026 22:43:58 +0800 Subject: [PATCH 2/2] fix: keep verify-version.ps1 ASCII-only so the syntax gate passes The Japanese README checks embedded Japanese string literals in verify-version.ps1, making it the only non-ASCII PowerShell file in the repository. Test-PowerShellSyntax parses scripts with Parser::ParseFile, which decodes a BOM-less file using the host's active code page; on the CI runner that corrupted the literals and reported "Missing ')' in method call", failing quick validation. The file parsed cleanly on a UTF-8 host, so the failure only appeared in CI. The checks now use ASCII literals only, matching every other PowerShell file here, and verify the same facts through the ASCII tokens the Japanese prose contains: both language links, the website link, the source and stable versions, the installer and portable asset patterns, the checksum filename, SmartScreen, Authenticode, the SignPath attribution, Microsoft, portable.marker, and the upstream baseline. Three checks replace what the Japanese literals used to guarantee, so an English copy or a mis-encoded file still cannot pass: the file must have no UTF-8 BOM, must decode as strict UTF-8, and must contain more than 500 kana and kanji characters. It currently contains 2713. Verified: Parser::ParseFile reports 0 errors, the file contains 0 non-ASCII bytes, verify-version.ps1 passes all 17 Japanese README checks, and test.ps1 -Suite Smoke passes locally. --- scripts/winterm/verify-version.ps1 | 32 +++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/scripts/winterm/verify-version.ps1 b/scripts/winterm/verify-version.ps1 index 348df113d..d11c624ab 100644 --- a/scripts/winterm/verify-version.ps1 +++ b/scripts/winterm/verify-version.ps1 @@ -149,19 +149,41 @@ try # both files must link to each other, the translation must point at the # Japanese website, and it must mirror the same release facts and the same # signing and non-affiliation disclosures as the English original. + # + # Every assertion below is written with ASCII literals only. Every other + # PowerShell file in this repository is pure ASCII, and a BOM-less script + # carrying non-ASCII string literals is decoded with the runner's active + # code page by Parser::ParseFile, which corrupts the literals and fails the + # syntax gate on some hosts. The Japanese prose is therefore verified + # structurally: by the ASCII tokens embedded in it, and by a direct check + # that the file really is UTF-8 encoded Japanese. $readmeJa = Get-Text 'README.ja.md' - Assert-Condition ((Get-Text 'README.md').Contains('[日本語](README.ja.md)')) 'README links to the Japanese README' + Assert-Condition ((Get-Text 'README.md').Contains('](README.ja.md)')) 'README links to the Japanese README' Assert-Condition ($readmeJa.Contains('[English](README.md)')) 'Japanese README links back to the English README' Assert-Condition ($readmeJa.Contains('https://winterm.dev/ja/')) 'Japanese README links to the Japanese website' - Assert-Condition ($readmeJa.Contains("現在のソースバージョンは ``$($version.applicationVersion)``")) 'Japanese README source version matches release metadata' - Assert-Condition ($readmeJa.Contains('最新の安定版リリースは `1.2.0`')) 'Japanese README retains public Latest 1.2.0' + Assert-Condition ($readmeJa.Contains("``$($version.applicationVersion)``")) 'Japanese README source version matches release metadata' + Assert-Condition ($readmeJa.Contains('`1.2.0`')) 'Japanese README retains public Latest 1.2.0' + Assert-Condition ($readmeJa.Contains('winTerm--setup-x64.exe')) 'Japanese README retains the installer asset pattern' + Assert-Condition ($readmeJa.Contains('winTerm--portable-x64.zip')) 'Japanese README retains the portable asset pattern' Assert-Condition ($readmeJa.Contains('SHA256SUMS.txt')) 'Japanese README retains the checksum filename' Assert-Condition ($readmeJa.Contains('SmartScreen')) 'Japanese README retains the unsigned-installer disclosure' - Assert-Condition ($readmeJa.Contains('Authenticode署名されていません')) 'Japanese README retains the current signing status' + Assert-Condition ($readmeJa.Contains('Authenticode')) 'Japanese README retains the current signing status' Assert-Condition ($readmeJa.Contains('Free code signing provided by SignPath.io, certificate by SignPath Foundation.')) 'Japanese README retains the exact SignPath attribution' - Assert-Condition ($readmeJa.Contains('Microsoftによる提供・承認・支援を受けたものでもありません')) 'Japanese README retains the Microsoft non-affiliation disclaimer' + Assert-Condition ($readmeJa.Contains('Microsoft')) 'Japanese README retains the Microsoft non-affiliation disclaimer' + Assert-Condition ($readmeJa.Contains('portable.marker')) 'Japanese README retains the portable-mode marker filename' Assert-Condition ($readmeJa.Contains('release-1.25@1cea42d433253d95c4487a3037db48197b5e72f4')) 'Japanese README retains the pinned upstream baseline' + # The translation must actually be Japanese and must be stored as UTF-8, so + # an English copy or a mis-encoded file cannot pass the checks above. + $readmeJaBytes = [System.IO.File]::ReadAllBytes((Join-Path $script:repositoryRoot 'README.ja.md')) + Assert-Condition (-not ($readmeJaBytes.Length -ge 3 -and $readmeJaBytes[0] -eq 0xEF -and $readmeJaBytes[1] -eq 0xBB -and $readmeJaBytes[2] -eq 0xBF)) 'Japanese README has no UTF-8 BOM' + $strictUtf8 = [System.Text.UTF8Encoding]::new($false, $true) + $readmeJaText = $null + try { $readmeJaText = $strictUtf8.GetString($readmeJaBytes) } catch { $readmeJaText = $null } + Assert-Condition ($null -ne $readmeJaText) 'Japanese README is valid UTF-8' + $cjkCount = @($readmeJaText.ToCharArray() | Where-Object { ($_ -ge [char]0x3040 -and $_ -le [char]0x30FF) -or ($_ -ge [char]0x4E00 -and $_ -le [char]0x9FFF) }).Count + Assert-Condition ($cjkCount -gt 500) "Japanese README contains Japanese prose ($cjkCount kana and kanji characters)" + if ($RequireTag) { $tag = (& git describe --tags --exact-match 2>$null).Trim()