diff --git a/elFinder.Net.Web/App_Start/RouteConfig.cs b/elFinder.Net.Web/App_Start/RouteConfig.cs index 6b4ae76..bf380be 100644 --- a/elFinder.Net.Web/App_Start/RouteConfig.cs +++ b/elFinder.Net.Web/App_Start/RouteConfig.cs @@ -10,12 +10,12 @@ public static void RegisterRoutes(RouteCollection routes) routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // elFinder's connector route - routes.MapRoute(null, "connector", new { controller = MVC.File.Name, action = MVC.File.ActionNames.Index }); + routes.MapRoute(null, "connector", new { controller = "File", action = "Index" }); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", - defaults: new { controller = MVC.Home.Name, action = MVC.Home.ActionNames.Index, id = UrlParameter.Optional } + defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } diff --git a/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.jp.js b/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.jp.js index 5cabfd9..51974f6 100644 --- a/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.jp.js +++ b/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.jp.js @@ -1,335 +1,335 @@ -/** - * Japanese translation - * @author Tomoaki Yoshida , Naoki Sawada - * @version 2012-08-15 - */ -if (elFinder && elFinder.prototype && typeof(elFinder.prototype.i18) == 'object') { - elFinder.prototype.i18.jp = { - translator : 'Tomoaki Yoshida <info@yoshida-studio.jp>', - language : 'Japanese', - direction : 'ltr', - dateFormat : 'Y/m/d h:i A', // 2012/04/11 05:27 PM - fancyDateFormat : '$1 h:i A', // will produce smth like: 今日 12:25 PM - messages : { - - /********************************** errors **********************************/ - 'error' : 'エラー', - 'errUnknown' : '不明なエラーです', - 'errUnknownCmd' : '不明なコマンドです', - 'errJqui' : '無効なjQuery UI コンフィグレーションです。セレクタブルコンポーネント、ドラッガブルコンポーネント、ドロッパブルコンポーネントがあるかを確認して下さい', - 'errNode' : 'elFinderはDOM Elementが必要です', - 'errURL' : '無効なelFinder コンフィグレーションです! URLを設定してください', - 'errAccess' : 'アクセスが拒否されました', - 'errConnect' : 'バックエンドとの接続ができません', - 'errAbort' : '接続が中断されました', - 'errTimeout' : '接続がタイムアウトしました.', - 'errNotFound' : 'バックエンドが見つかりません', - 'errResponse' : '無効なバックエンドコンフィグレーションです', - 'errConf' : '無効なバックエンドコンフィグレーションです', - 'errJSON' : 'PHP JSON モジュールがインストールされていません', - 'errNoVolumes' : '読み込み可能なボリュームが入手できません', - 'errCmdParams' : 'コマンド "$1"のパラメーターが無効です', - 'errDataNotJSON' : 'JSONデータではありません', - 'errDataEmpty' : '空のデータです', - 'errCmdReq' : 'バックエンドリクエストがコマンド名を要求しています', - 'errOpen' : '"$1"を開くことができません', - 'errNotFolder' : 'オブジェクトがフォルダーではありません', - 'errNotFile' : 'オブジェクトがファイルではありません', - 'errRead' : '"$1"を読むことができません', - 'errWrite' : '"$1"に書きこむことができません', - 'errPerm' : '権限がありません', - 'errLocked' : '"$1" はロックされているので名前の変更、移動、削除ができません', - 'errExists' : '"$1"というファイル名はすでに存在しています', - 'errInvName' : '無効なファイル名です', - 'errFolderNotFound' : 'フォルダーが見つかりません', - 'errFileNotFound' : 'ファイルが見つかりません', - 'errTrgFolderNotFound' : 'ターゲットとするフォルダー "$1" が見つかりません', - 'errPopup' : 'ポップアップウィンドウが開けません。ファイルを開くにはブラウザの設定を変更してください', - 'errMkdir' : '"$1"フォルダーを作成することができません', - 'errMkfile' : '"$1"ファイルを作成することができません', - 'errRename' : '"$1"の名前を変更することができません', - 'errCopyFrom' : '"$1"からのファイルコピーが許可されていません', - 'errCopyTo' : '"$1"へのファイルコピーが許可されていません', - 'errUpload' : 'アップロードエラー', // old name - errUploadCommon - 'errUploadFile' : '"$1"がアップロードできません', // old name - errUpload - 'errUploadNoFiles' : 'アップロードされたファイルがありません', - 'errUploadTotalSize' : 'データが許容サイズを超えています', // old name - errMaxSize - 'errUploadFileSize' : 'ファイルが許容サイズを超えています', // old name - errFileMaxSize - 'errUploadMime' : '許可されていないファイル形式です', - 'errUploadTransfer' : '"$1" 転送エラーです', - 'errNotReplace' : 'アイテム "$1" は、すでにこの場所にありますがアイテムのタイプが違うので置き換えることはできません', // new - 'errReplace' : '"$1"を置き換えることができません', - 'errSave' : '"$1"を保存することができません', - 'errCopy' : '"$1"をコピーすることができません', - 'errMove' : '"$1"を移動することができません', - 'errCopyInItself' : '"$1"をそれ自身の中にコピーすることはできません', - 'errRm' : '"$1"を削除することができません', - 'errRmSrc' : 'Unable remove source file(s).', - 'errExtract' : '"$1"を解凍することができません', - 'errArchive' : 'アーカイブを作成することができません', - 'errArcType' : 'サポート外のアーカイブ形式です', - 'errNoArchive' : 'アーカイブでないかサポートされていないアーカイブ形式です', - 'errCmdNoSupport' : 'サポートされていないコマンドです', - 'errReplByChild' : 'フォルダ "$1" に含まれてるアイテムを置き換えることはできません', - 'errArcSymlinks' : 'シンボリックリンクまたは許容されないファイル名を含むアーカイブはセキュリティ上、解凍できません', // edited 25.06.2012 - 'errArcMaxSize' : 'アーカイブが許容されたサイズを超えています', - 'errResize' : '"$1"をリサイズできません', - 'errUsupportType' : 'このファイルタイプはサポートされません', - 'errNotUTF8Content' : 'ファイル "$1" には UTF-8 以外の文字が含まれているので編集できません', // added 9.11.2011 - 'errNetMount' : '"$1"をマウントできません', // added 17.04.2012 - 'errNetMountNoDriver' : 'サポートされていないプロトコルです', // added 17.04.2012 - 'errNetMountFailed' : 'マウントに失敗しました', // added 17.04.2012 - 'errNetMountHostReq' : 'ホスト名は必須です', // added 18.04.2012 - 'errSessionExpires' : 'アクションがなかったため、セッションが期限切れになりました', - 'errCreatingTempDir' : '一時ディレクトリを作成できません:"$1"', - 'errFtpDownloadFile' : 'FTP からファイルをダウンロードできません:"$1"', - 'errFtpUploadFile' : 'FTP へファイルをアップロードできません:"$1"', - 'errFtpMkdir' : 'FTP にリモートディレクトリを作成できません:"$1"', - 'errArchiveExec' : 'ファイルのアーカイブ中にエラーが発生しました:"$1"', - 'errExtractExec' : 'ファイルの抽出中にエラーが発生しました:"$1"', - - /******************************* commands names ********************************/ - 'cmdarchive' : 'アーカイブ作成', - 'cmdback' : '戻る', - 'cmdcopy' : 'コピー', - 'cmdcut' : 'カット', - 'cmddownload' : 'ダウンロード', - 'cmdduplicate' : '複製', - 'cmdedit' : 'ファイル編集', - 'cmdextract' : 'アーカイブを解凍', - 'cmdforward' : '進む', - 'cmdgetfile' : 'ファイル選択', - 'cmdhelp' : 'このソフトウェアについて', - 'cmdhome' : 'ホーム', - 'cmdinfo' : '情報', - 'cmdmkdir' : '新規フォルダー', - 'cmdmkfile' : '新規テキストファイル', - 'cmdopen' : '開く', - 'cmdpaste' : 'ペースト', - 'cmdquicklook' : 'プレビュー', - 'cmdreload' : 'リロード', - 'cmdrename' : 'リネーム', - 'cmdrm' : '削除', - 'cmdsearch' : 'ファイルを探す', - 'cmdup' : '親ディレクトリーへ移動', - 'cmdupload' : 'ファイルアップロード', - 'cmdview' : 'ビュー', - 'cmdresize' : 'リサイズと回転', - 'cmdsort' : 'ソート', - 'cmdnetmount' : 'ネットワークボリュームをマウント', // added 18.04.2012 - - /*********************************** buttons ***********************************/ - 'btnClose' : '閉じる', - 'btnSave' : '保存', - 'btnRm' : '削除', - 'btnApply' : '適用', - 'btnCancel' : 'キャンセル', - 'btnNo' : 'いいえ', - 'btnYes' : 'はい', - 'btnMount' : 'マウント', // added 18.04.2012 - /******************************** notifications ********************************/ - 'ntfopen' : 'フォルダーを開く', - 'ntffile' : 'ファイルを開く', - 'ntfreload' : 'フォルダーを再読込', - 'ntfmkdir' : 'ディレクトリーを作成', - 'ntfmkfile' : 'ファイルを作成', - 'ntfrm' : 'ファイルを削除', - 'ntfcopy' : 'ファイルをコピー', - 'ntfmove' : 'ファイルを移動', - 'ntfprepare' : 'ファイルコピーを準備', - 'ntfrename' : 'ファイル名を変更', - 'ntfupload' : 'ファイルをアップロード', - 'ntfdownload' : 'ファイルをダウンロード', - 'ntfsave' : 'ファイルを保存', - 'ntfarchive' : 'アーカイブ作成', - 'ntfextract' : 'アーカイブを解凍', - 'ntfsearch' : 'ファイル検索', - 'ntfresize' : 'リサイズしています', - 'ntfsmth' : '何かしています', - 'ntfloadimg' : 'イメージを読み込んでいます', - 'ntfnetmount' : 'ネットワークボリュームをマウントしています', // added 18.04.2012 - - /************************************ dates **********************************/ - 'dateUnknown' : '不明', - 'Today' : '今日', - 'Yesterday' : '昨日', - 'Jan' : '1月', - 'Feb' : '2月', - 'Mar' : '3月', - 'Apr' : '4月', - 'May' : '5月', - 'Jun' : '6月', - 'Jul' : '7月', - 'Aug' : '8月', - 'Sep' : '9月', - 'Oct' : '10月', - 'Nov' : '11月', - 'Dec' : '12月', - - /******************************** sort variants ********************************/ - 'sortname' : '名前順', - 'sortkind' : '種類順', - 'sortsize' : 'サイズ順', - 'sortdate' : '日付順', - 'sortFoldersFirst' : 'フォルダ優先', // added 21.06.2012 - - /********************************** messages **********************************/ - 'confirmReq' : '確認必須です', - 'confirmRm' : '本当にファイルを削除しますか?
この操作は取り消せません!', - 'confirmRepl' : '古いファイルを新しいファイルで上書きしますか?', - 'apllyAll' : '全てに適用します', - 'name' : '名前', - 'size' : 'サイズ', - 'perms' : '権限', - 'modify' : '更新', - 'kind' : '種類', - 'read' : '読み取り', - 'write' : '書き込み', - 'noaccess' : 'アクセス禁止', - 'and' : ',', - 'unknown' : '不明', - 'selectall' : '全てのファイルを選択', - 'selectfiles' : 'ファイル選択', - 'selectffile' : '最初のファイルを選択', - 'selectlfile' : '最後のファイルを選択', - 'viewlist' : 'リスト形式で見る', - 'viewicons' : 'アイコン形式で見る', - 'places' : 'Places', - 'calc' : '計算', - 'path' : 'パス', - 'aliasfor' : 'エイリアス', - 'locked' : 'ロックされています', - 'dim' : 'サイズ', - 'files' : 'ファイル', - 'folders' : 'フォルダー', - 'items' : 'アイテム', - 'yes' : 'はい', - 'no' : 'いいえ', - 'link' : 'リンク', - 'searcresult' : '検索結果', - 'selected' : '選択されたアイテム', - 'about' : 'アバウト', - 'shortcuts' : 'ショートカット', - 'help' : 'ヘルプ', - 'webfm' : 'ウェブファイルマネージャー', - 'ver' : 'バージョン', - 'protocolver' : 'プロトコルバージョン', - 'homepage' : 'プロジェクトホーム', - 'docs' : 'ドキュメンテーション', - 'github' : 'Github でフォーク', - 'twitter' : 'Twitter でフォロー', - 'facebook' : 'Facebookグループ に参加', - 'team' : 'チーム', - 'chiefdev' : 'チーフデベロッパー', - 'developer' : 'デベロッパー', - 'contributor' : 'コントリビュータ', - 'maintainer' : 'メインテナー', - 'translator' : '翻訳者', - 'icons' : 'アイコン', - 'dontforget' : 'タオル忘れちゃだめよー。', - 'shortcutsof' : 'ショートカットは利用できません', - 'dropFiles' : 'ここにファイルをドロップ', - 'dropFilesBrowser': 'ブラウザからファイルをドロップまたは貼り付け', // added 30.05.2012 - 'or' : 'または', - 'selectForUpload' : 'アップロードするファイルを選択', - 'moveFiles' : 'ファイルを移動', - 'copyFiles' : 'ファイルをコピー', - 'rmFromPlaces' : 'ここから削除', - 'aspectRatio' : '縦横比維持', - 'scale' : '表示縮尺', - 'width' : '幅', - 'height' : '高さ', - 'resize' : 'リサイズ', - 'crop' : '切り抜き', - 'rotate' : '回転', - 'rotate-cw' : '90度左回転', - 'rotate-ccw' : '90度右回転', - 'degree' : '度', - 'netMountDialogTitle' : 'ネットワークボリュームのマウント', // added 18.04.2012 - 'protocol' : 'プロトコル', // added 18.04.2012 - 'host' : 'ホスト名', // added 18.04.2012 - 'port' : 'ポート', // added 18.04.2012 - 'user' : 'ユーザー名', // added 18.04.2012 - 'pass' : 'パスワード', // added 18.04.2012 - - /********************************** mimetypes **********************************/ - 'kindUnknown' : '不明', - 'kindFolder' : 'フォルダー', - 'kindAlias' : '別名', - 'kindAliasBroken' : '宛先不明の別名', - // applications - 'kindApp' : 'アプリケーション', - 'kindPostscript' : 'Postscript ドキュメント', - 'kindMsOffice' : 'Microsoft Office ドキュメント', - 'kindMsWord' : 'Microsoft Word ドキュメント', - 'kindMsExcel' : 'Microsoft Excel ドキュメント', - 'kindMsPP' : 'Microsoft Powerpoint プレゼンテーション', - 'kindOO' : 'Open Office ドキュメント', - 'kindAppFlash' : 'Flash アプリケーション', - 'kindPDF' : 'PDF', - 'kindTorrent' : 'Bittorrent ファイル', - 'kind7z' : '7z アーカイブ', - 'kindTAR' : 'TAR アーカイブ', - 'kindGZIP' : 'GZIP アーカイブ', - 'kindBZIP' : 'BZIP アーカイブ', - 'kindZIP' : 'ZIP アーカイブ', - 'kindRAR' : 'RAR アーカイブ', - 'kindJAR' : 'Java JAR ファイル', - 'kindTTF' : 'True Type フォント', - 'kindOTF' : 'Open Type フォント', - 'kindRPM' : 'RPM パッケージ', - // texts - 'kindText' : 'Text ドキュメント', - 'kindTextPlain' : 'プレインテキスト', - 'kindPHP' : 'PHP ソース', - 'kindCSS' : 'Cascading style sheet', - 'kindHTML' : 'HTML ドキュメント', - 'kindJS' : 'Javascript ソース', - 'kindRTF' : 'Rich Text フォーマット', - 'kindC' : 'C ソース', - 'kindCHeader' : 'C ヘッダーソース', - 'kindCPP' : 'C++ ソース', - 'kindCPPHeader' : 'C++ ヘッダーソース', - 'kindShell' : 'Unix shell スクリプト', - 'kindPython' : 'Python ソース', - 'kindJava' : 'Java ソース', - 'kindRuby' : 'Ruby ソース', - 'kindPerl' : 'Perl スクリプト', - 'kindSQL' : 'SQL ソース', - 'kindXML' : 'XML ドキュメント', - 'kindAWK' : 'AWK ソース', - 'kindCSV' : 'CSV', - 'kindDOCBOOK' : 'Docbook XML ドキュメント', - // images - 'kindImage' : 'イメージ', - 'kindBMP' : 'BMP イメージ', - 'kindJPEG' : 'JPEG イメージ', - 'kindGIF' : 'GIF イメージ', - 'kindPNG' : 'PNG イメージ', - 'kindTIFF' : 'TIFF イメージ', - 'kindTGA' : 'TGA イメージ', - 'kindPSD' : 'Adobe Photoshop イメージ', - 'kindXBITMAP' : 'X bitmap イメージ', - 'kindPXM' : 'Pixelmator イメージ', - // media - 'kindAudio' : 'オーディオメディア', - 'kindAudioMPEG' : 'MPEG オーディオ', - 'kindAudioMPEG4' : 'MPEG-4 オーディオ', - 'kindAudioMIDI' : 'MIDI オーディオ', - 'kindAudioOGG' : 'Ogg Vorbis オーディオ', - 'kindAudioWAV' : 'WAV オーディオ', - 'AudioPlaylist' : 'MP3 プレイリスト', - 'kindVideo' : 'ビデオメディア', - 'kindVideoDV' : 'DV ムービー', - 'kindVideoMPEG' : 'MPEG ムービー', - 'kindVideoMPEG4' : 'MPEG-4 ムービー', - 'kindVideoAVI' : 'AVI ムービー', - 'kindVideoMOV' : 'Quick Time ムービー', - 'kindVideoWM' : 'Windows Media ムービー', - 'kindVideoFlash' : 'Flash ムービー', - 'kindVideoMKV' : 'Matroska ムービー', - 'kindVideoOGG' : 'Ogg ムービー' - } - }; -} - +/** + * Japanese translation + * @author Tomoaki Yoshida , Naoki Sawada + * @version 2012-08-15 + */ +if (elFinder && elFinder.prototype && typeof(elFinder.prototype.i18) == 'object') { + elFinder.prototype.i18.jp = { + translator : 'Tomoaki Yoshida <info@yoshida-studio.jp>', + language : 'Japanese', + direction : 'ltr', + dateFormat : 'Y/m/d h:i A', // 2012/04/11 05:27 PM + fancyDateFormat : '$1 h:i A', // will produce smth like: 今日 12:25 PM + messages : { + + /********************************** errors **********************************/ + 'error' : 'エラー', + 'errUnknown' : '不明なエラーです', + 'errUnknownCmd' : '不明なコマンドです', + 'errJqui' : '無効なjQuery UI コンフィグレーションです。セレクタブルコンポーネント、ドラッガブルコンポーネント、ドロッパブルコンポーネントがあるかを確認して下さい', + 'errNode' : 'elFinderはDOM Elementが必要です', + 'errURL' : '無効なelFinder コンフィグレーションです! URLを設定してください', + 'errAccess' : 'アクセスが拒否されました', + 'errConnect' : 'バックエンドとの接続ができません', + 'errAbort' : '接続が中断されました', + 'errTimeout' : '接続がタイムアウトしました.', + 'errNotFound' : 'バックエンドが見つかりません', + 'errResponse' : '無効なバックエンドコンフィグレーションです', + 'errConf' : '無効なバックエンドコンフィグレーションです', + 'errJSON' : 'PHP JSON モジュールがインストールされていません', + 'errNoVolumes' : '読み込み可能なボリュームが入手できません', + 'errCmdParams' : 'コマンド "$1"のパラメーターが無効です', + 'errDataNotJSON' : 'JSONデータではありません', + 'errDataEmpty' : '空のデータです', + 'errCmdReq' : 'バックエンドリクエストがコマンド名を要求しています', + 'errOpen' : '"$1"を開くことができません', + 'errNotFolder' : 'オブジェクトがフォルダーではありません', + 'errNotFile' : 'オブジェクトがファイルではありません', + 'errRead' : '"$1"を読むことができません', + 'errWrite' : '"$1"に書きこむことができません', + 'errPerm' : '権限がありません', + 'errLocked' : '"$1" はロックされているので名前の変更、移動、削除ができません', + 'errExists' : '"$1"というファイル名はすでに存在しています', + 'errInvName' : '無効なファイル名です', + 'errFolderNotFound' : 'フォルダーが見つかりません', + 'errFileNotFound' : 'ファイルが見つかりません', + 'errTrgFolderNotFound' : 'ターゲットとするフォルダー "$1" が見つかりません', + 'errPopup' : 'ポップアップウィンドウが開けません。ファイルを開くにはブラウザの設定を変更してください', + 'errMkdir' : '"$1"フォルダーを作成することができません', + 'errMkfile' : '"$1"ファイルを作成することができません', + 'errRename' : '"$1"の名前を変更することができません', + 'errCopyFrom' : '"$1"からのファイルコピーが許可されていません', + 'errCopyTo' : '"$1"へのファイルコピーが許可されていません', + 'errUpload' : 'アップロードエラー', // old name - errUploadCommon + 'errUploadFile' : '"$1"がアップロードできません', // old name - errUpload + 'errUploadNoFiles' : 'アップロードされたファイルがありません', + 'errUploadTotalSize' : 'データが許容サイズを超えています', // old name - errMaxSize + 'errUploadFileSize' : 'ファイルが許容サイズを超えています', // old name - errFileMaxSize + 'errUploadMime' : '許可されていないファイル形式です', + 'errUploadTransfer' : '"$1" 転送エラーです', + 'errNotReplace' : 'アイテム "$1" は、すでにこの場所にありますがアイテムのタイプが違うので置き換えることはできません', // new + 'errReplace' : '"$1"を置き換えることができません', + 'errSave' : '"$1"を保存することができません', + 'errCopy' : '"$1"をコピーすることができません', + 'errMove' : '"$1"を移動することができません', + 'errCopyInItself' : '"$1"をそれ自身の中にコピーすることはできません', + 'errRm' : '"$1"を削除することができません', + 'errRmSrc' : 'Unable remove source file(s).', + 'errExtract' : '"$1"を解凍することができません', + 'errArchive' : 'アーカイブを作成することができません', + 'errArcType' : 'サポート外のアーカイブ形式です', + 'errNoArchive' : 'アーカイブでないかサポートされていないアーカイブ形式です', + 'errCmdNoSupport' : 'サポートされていないコマンドです', + 'errReplByChild' : 'フォルダ "$1" に含まれてるアイテムを置き換えることはできません', + 'errArcSymlinks' : 'シンボリックリンクまたは許容されないファイル名を含むアーカイブはセキュリティ上、解凍できません', // edited 25.06.2012 + 'errArcMaxSize' : 'アーカイブが許容されたサイズを超えています', + 'errResize' : '"$1"をリサイズできません', + 'errUsupportType' : 'このファイルタイプはサポートされません', + 'errNotUTF8Content' : 'ファイル "$1" には UTF-8 以外の文字が含まれているので編集できません', // added 9.11.2011 + 'errNetMount' : '"$1"をマウントできません', // added 17.04.2012 + 'errNetMountNoDriver' : 'サポートされていないプロトコルです', // added 17.04.2012 + 'errNetMountFailed' : 'マウントに失敗しました', // added 17.04.2012 + 'errNetMountHostReq' : 'ホスト名は必須です', // added 18.04.2012 + 'errSessionExpires' : 'アクションがなかったため、セッションが期限切れになりました', + 'errCreatingTempDir' : '一時ディレクトリを作成できません:"$1"', + 'errFtpDownloadFile' : 'FTP からファイルをダウンロードできません:"$1"', + 'errFtpUploadFile' : 'FTP へファイルをアップロードできません:"$1"', + 'errFtpMkdir' : 'FTP にリモートディレクトリを作成できません:"$1"', + 'errArchiveExec' : 'ファイルのアーカイブ中にエラーが発生しました:"$1"', + 'errExtractExec' : 'ファイルの抽出中にエラーが発生しました:"$1"', + + /******************************* commands names ********************************/ + 'cmdarchive' : 'アーカイブ作成', + 'cmdback' : '戻る', + 'cmdcopy' : 'コピー', + 'cmdcut' : 'カット', + 'cmddownload' : 'ダウンロード', + 'cmdduplicate' : '複製', + 'cmdedit' : 'ファイル編集', + 'cmdextract' : 'アーカイブを解凍', + 'cmdforward' : '進む', + 'cmdgetfile' : 'ファイル選択', + 'cmdhelp' : 'このソフトウェアについて', + 'cmdhome' : 'ホーム', + 'cmdinfo' : '情報', + 'cmdmkdir' : '新規フォルダー', + 'cmdmkfile' : '新規テキストファイル', + 'cmdopen' : '開く', + 'cmdpaste' : 'ペースト', + 'cmdquicklook' : 'プレビュー', + 'cmdreload' : 'リロード', + 'cmdrename' : 'リネーム', + 'cmdrm' : '削除', + 'cmdsearch' : 'ファイルを探す', + 'cmdup' : '親ディレクトリーへ移動', + 'cmdupload' : 'ファイルアップロード', + 'cmdview' : 'ビュー', + 'cmdresize' : 'リサイズと回転', + 'cmdsort' : 'ソート', + 'cmdnetmount' : 'ネットワークボリュームをマウント', // added 18.04.2012 + + /*********************************** buttons ***********************************/ + 'btnClose' : '閉じる', + 'btnSave' : '保存', + 'btnRm' : '削除', + 'btnApply' : '適用', + 'btnCancel' : 'キャンセル', + 'btnNo' : 'いいえ', + 'btnYes' : 'はい', + 'btnMount' : 'マウント', // added 18.04.2012 + /******************************** notifications ********************************/ + 'ntfopen' : 'フォルダーを開く', + 'ntffile' : 'ファイルを開く', + 'ntfreload' : 'フォルダーを再読込', + 'ntfmkdir' : 'ディレクトリーを作成', + 'ntfmkfile' : 'ファイルを作成', + 'ntfrm' : 'ファイルを削除', + 'ntfcopy' : 'ファイルをコピー', + 'ntfmove' : 'ファイルを移動', + 'ntfprepare' : 'ファイルコピーを準備', + 'ntfrename' : 'ファイル名を変更', + 'ntfupload' : 'ファイルをアップロード', + 'ntfdownload' : 'ファイルをダウンロード', + 'ntfsave' : 'ファイルを保存', + 'ntfarchive' : 'アーカイブ作成', + 'ntfextract' : 'アーカイブを解凍', + 'ntfsearch' : 'ファイル検索', + 'ntfresize' : 'リサイズしています', + 'ntfsmth' : '何かしています', + 'ntfloadimg' : 'イメージを読み込んでいます', + 'ntfnetmount' : 'ネットワークボリュームをマウントしています', // added 18.04.2012 + + /************************************ dates **********************************/ + 'dateUnknown' : '不明', + 'Today' : '今日', + 'Yesterday' : '昨日', + 'Jan' : '1月', + 'Feb' : '2月', + 'Mar' : '3月', + 'Apr' : '4月', + 'May' : '5月', + 'Jun' : '6月', + 'Jul' : '7月', + 'Aug' : '8月', + 'Sep' : '9月', + 'Oct' : '10月', + 'Nov' : '11月', + 'Dec' : '12月', + + /******************************** sort variants ********************************/ + 'sortname' : '名前順', + 'sortkind' : '種類順', + 'sortsize' : 'サイズ順', + 'sortdate' : '日付順', + 'sortFoldersFirst' : 'フォルダ優先', // added 21.06.2012 + + /********************************** messages **********************************/ + 'confirmReq' : '確認必須です', + 'confirmRm' : '本当にファイルを削除しますか?
この操作は取り消せません!', + 'confirmRepl' : '古いファイルを新しいファイルで上書きしますか?', + 'apllyAll' : '全てに適用します', + 'name' : '名前', + 'size' : 'サイズ', + 'perms' : '権限', + 'modify' : '更新', + 'kind' : '種類', + 'read' : '読み取り', + 'write' : '書き込み', + 'noaccess' : 'アクセス禁止', + 'and' : ',', + 'unknown' : '不明', + 'selectall' : '全てのファイルを選択', + 'selectfiles' : 'ファイル選択', + 'selectffile' : '最初のファイルを選択', + 'selectlfile' : '最後のファイルを選択', + 'viewlist' : 'リスト形式で見る', + 'viewicons' : 'アイコン形式で見る', + 'places' : 'Places', + 'calc' : '計算', + 'path' : 'パス', + 'aliasfor' : 'エイリアス', + 'locked' : 'ロックされています', + 'dim' : 'サイズ', + 'files' : 'ファイル', + 'folders' : 'フォルダー', + 'items' : 'アイテム', + 'yes' : 'はい', + 'no' : 'いいえ', + 'link' : 'リンク', + 'searcresult' : '検索結果', + 'selected' : '選択されたアイテム', + 'about' : 'アバウト', + 'shortcuts' : 'ショートカット', + 'help' : 'ヘルプ', + 'webfm' : 'ウェブファイルマネージャー', + 'ver' : 'バージョン', + 'protocolver' : 'プロトコルバージョン', + 'homepage' : 'プロジェクトホーム', + 'docs' : 'ドキュメンテーション', + 'github' : 'Github でフォーク', + 'twitter' : 'Twitter でフォロー', + 'facebook' : 'Facebookグループ に参加', + 'team' : 'チーム', + 'chiefdev' : 'チーフデベロッパー', + 'developer' : 'デベロッパー', + 'contributor' : 'コントリビュータ', + 'maintainer' : 'メインテナー', + 'translator' : '翻訳者', + 'icons' : 'アイコン', + 'dontforget' : 'タオル忘れちゃだめよー。', + 'shortcutsof' : 'ショートカットは利用できません', + 'dropFiles' : 'ここにファイルをドロップ', + 'dropFilesBrowser': 'ブラウザからファイルをドロップまたは貼り付け', // added 30.05.2012 + 'or' : 'または', + 'selectForUpload' : 'アップロードするファイルを選択', + 'moveFiles' : 'ファイルを移動', + 'copyFiles' : 'ファイルをコピー', + 'rmFromPlaces' : 'ここから削除', + 'aspectRatio' : '縦横比維持', + 'scale' : '表示縮尺', + 'width' : '幅', + 'height' : '高さ', + 'resize' : 'リサイズ', + 'crop' : '切り抜き', + 'rotate' : '回転', + 'rotate-cw' : '90度左回転', + 'rotate-ccw' : '90度右回転', + 'degree' : '度', + 'netMountDialogTitle' : 'ネットワークボリュームのマウント', // added 18.04.2012 + 'protocol' : 'プロトコル', // added 18.04.2012 + 'host' : 'ホスト名', // added 18.04.2012 + 'port' : 'ポート', // added 18.04.2012 + 'user' : 'ユーザー名', // added 18.04.2012 + 'pass' : 'パスワード', // added 18.04.2012 + + /********************************** mimetypes **********************************/ + 'kindUnknown' : '不明', + 'kindFolder' : 'フォルダー', + 'kindAlias' : '別名', + 'kindAliasBroken' : '宛先不明の別名', + // applications + 'kindApp' : 'アプリケーション', + 'kindPostscript' : 'Postscript ドキュメント', + 'kindMsOffice' : 'Microsoft Office ドキュメント', + 'kindMsWord' : 'Microsoft Word ドキュメント', + 'kindMsExcel' : 'Microsoft Excel ドキュメント', + 'kindMsPP' : 'Microsoft Powerpoint プレゼンテーション', + 'kindOO' : 'Open Office ドキュメント', + 'kindAppFlash' : 'Flash アプリケーション', + 'kindPDF' : 'PDF', + 'kindTorrent' : 'Bittorrent ファイル', + 'kind7z' : '7z アーカイブ', + 'kindTAR' : 'TAR アーカイブ', + 'kindGZIP' : 'GZIP アーカイブ', + 'kindBZIP' : 'BZIP アーカイブ', + 'kindZIP' : 'ZIP アーカイブ', + 'kindRAR' : 'RAR アーカイブ', + 'kindJAR' : 'Java JAR ファイル', + 'kindTTF' : 'True Type フォント', + 'kindOTF' : 'Open Type フォント', + 'kindRPM' : 'RPM パッケージ', + // texts + 'kindText' : 'Text ドキュメント', + 'kindTextPlain' : 'プレインテキスト', + 'kindPHP' : 'PHP ソース', + 'kindCSS' : 'Cascading style sheet', + 'kindHTML' : 'HTML ドキュメント', + 'kindJS' : 'Javascript ソース', + 'kindRTF' : 'Rich Text フォーマット', + 'kindC' : 'C ソース', + 'kindCHeader' : 'C ヘッダーソース', + 'kindCPP' : 'C++ ソース', + 'kindCPPHeader' : 'C++ ヘッダーソース', + 'kindShell' : 'Unix shell スクリプト', + 'kindPython' : 'Python ソース', + 'kindJava' : 'Java ソース', + 'kindRuby' : 'Ruby ソース', + 'kindPerl' : 'Perl スクリプト', + 'kindSQL' : 'SQL ソース', + 'kindXML' : 'XML ドキュメント', + 'kindAWK' : 'AWK ソース', + 'kindCSV' : 'CSV', + 'kindDOCBOOK' : 'Docbook XML ドキュメント', + // images + 'kindImage' : 'イメージ', + 'kindBMP' : 'BMP イメージ', + 'kindJPEG' : 'JPEG イメージ', + 'kindGIF' : 'GIF イメージ', + 'kindPNG' : 'PNG イメージ', + 'kindTIFF' : 'TIFF イメージ', + 'kindTGA' : 'TGA イメージ', + 'kindPSD' : 'Adobe Photoshop イメージ', + 'kindXBITMAP' : 'X bitmap イメージ', + 'kindPXM' : 'Pixelmator イメージ', + // media + 'kindAudio' : 'オーディオメディア', + 'kindAudioMPEG' : 'MPEG オーディオ', + 'kindAudioMPEG4' : 'MPEG-4 オーディオ', + 'kindAudioMIDI' : 'MIDI オーディオ', + 'kindAudioOGG' : 'Ogg Vorbis オーディオ', + 'kindAudioWAV' : 'WAV オーディオ', + 'AudioPlaylist' : 'MP3 プレイリスト', + 'kindVideo' : 'ビデオメディア', + 'kindVideoDV' : 'DV ムービー', + 'kindVideoMPEG' : 'MPEG ムービー', + 'kindVideoMPEG4' : 'MPEG-4 ムービー', + 'kindVideoAVI' : 'AVI ムービー', + 'kindVideoMOV' : 'Quick Time ムービー', + 'kindVideoWM' : 'Windows Media ムービー', + 'kindVideoFlash' : 'Flash ムービー', + 'kindVideoMKV' : 'Matroska ムービー', + 'kindVideoOGG' : 'Ogg ムービー' + } + }; +} + diff --git a/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.ru.js b/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.ru.js index a03915b..c0def8c 100644 --- a/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.ru.js +++ b/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.ru.js @@ -1,362 +1,362 @@ -/** - * Russian translation - * @author Dmitry "dio" Levashov - * @version 2011-07-15 - */ -if (elFinder && elFinder.prototype && typeof(elFinder.prototype.i18) == 'object') { - elFinder.prototype.i18.ru = { - translator : 'Dmitry "dio" Levashov <dio@std42.ru>', - language : 'Русский язык', - direction : 'ltr', - dateFormat : 'd M Y H:i', - fancyDateFormat : '$1 H:i', - messages : { - - /********************************** errors **********************************/ - 'error' : 'Ошибка', - 'errUnknown' : 'Неизвестная ошибка.', - 'errUnknownCmd' : 'Неизвестная комманда.', - 'errJqui' : 'Отсутствуют необходимые компоненты jQuery UI - selectable, draggable и droppable.', - 'errNode' : 'Отсутствует DOM элемент для инициализации elFinder.', - 'errURL' : 'Некорректная настройка. Необходимо указать URL сервера.', - 'errAccess' : 'Доступ запрещен.', - 'errConnect' : 'Не удалось соединиться с сервером.', - 'errAbort' : 'Соединение прервано.', - 'errTimeout' : 'Таймаут соединения.', - 'errNotFound' : 'Сервер не найден.', - 'errResponse' : 'Некорректный ответ сервера.', - 'errConf' : 'Некорректная настройка сервера.', - 'errJSON' : 'Модуль PHP JSON не установлен.', - 'errNoVolumes' : 'Отсутствуют корневые директории достуные для чтения.', - 'errCmdParams' : 'Некорректные параметры комманды "$1".', - 'errDataNotJSON' : 'Данные не формате JSON.', - 'errDataEmpty' : 'Данные отсутствуют.', - 'errCmdReq' : 'Для запроса к серверу необходимо указать имя комманды.', - 'errOpen' : 'Не удалось открыть "$1".', - 'errNotFolder' : 'Объект не является папкой.', - 'errNotFile' : 'Объект не является файлом.', - 'errRead' : 'Ошибка чтения "$1".', - 'errWrite' : 'Ошибка записи "$1".', - 'errPerm' : 'Доступ запрещен.', - 'errLocked' : '"$1" защищен и не может быть переименован, перемещен или удален.', - 'errExists' : 'В папке уже существует объект с именем "$1".', - 'errInvName' : 'Недопустимое имя файла.', - 'errFolderNotFound' : 'Папка не найдена.', - 'errFileNotFound' : 'Файл не найден.', - 'errTrgFolderNotFound' : 'Целевая папка "$1" не найдена.', - 'errPopup' : 'Браузер заблокировал открытие нового окна. Чтобы окрыть файл, измените настройки браузера.', - 'errMkdir' : 'Ошибка создания папки "$1".', - 'errMkfile' : 'Ошибка создания файла "$1".', - 'errRename' : 'Ошибка переименования "$1".', - 'errCopyFrom' : 'Копирование из корневой директории "$1" запрещено.', - 'errCopyTo' : 'Копирование в корневую директорию "$1" запрещено.', - 'errUploadCommon' : 'Ошибка загрузки файлов.', - 'errUpload' : 'Ошибка загрузки "$1".', - 'errUploadNoFiles' : 'Отсутствуют загруженые файлы.', - 'errMaxSize' : 'Превышен допустимый размер загружаемых файлов.', - 'errFileMaxSize' : 'Размер файла превышает допустимый.', - 'errUploadMime' : 'Недопустимый тип файла.', - 'errUploadTransfer' : 'Ошибка передачи файла "$1".', - 'errSave' : 'Ошибка сохранения "$1".', - 'errCopy' : 'Ошибка копирования "$1".', - 'errMove' : 'Ошибка перемещения "$1".', - 'errCopyInItself' : 'Невозможно скопировать "$1" в самого себя.', - 'errRm' : 'Ошибка удаления "$1".', - 'errExtract' : 'Ошибка извлечения файлов из архива "$1".', - 'errArchive' : 'Ошибка создания архива.', - 'errArcType' : 'Неподдерживаемый тип архива.', - 'errNoArchive' : 'Файл не является архивом допустимого типа.', - 'errCmdNoSupport' : 'Сервер не поддерживает эту комманду.', - 'errReplByChild' : 'Невозможно заменить папку "$1" содержащимся в ней объектом.', - 'errArcSymlinks' : 'По соображениям безопасности запрещена распаковка архивов, содержащих ссылки (symlinks) или файлы с недопустимыми именами.', // edited 24.06.2012 - 'errArcMaxSize' : 'Размер файлов в архиве превышает максимально разрешенный.', - 'errResize' : 'Не удалось изменить размер "$1".', - 'errUsupportType' : 'Неподдерживаемый тип файла.', - 'errNotUTF8Content' : 'Файл "$1" содержит текст в кодировке отличной от UTF-8 и не может быть отредактирован.', // added 9.11.2011 - 'errNetMount' : 'Не удалось подключить "$1".', // added 17.04.2012 - 'errNetMountNoDriver' : 'Неподдерживаемый протокол.', // added 17.04.2012 - 'errNetMountFailed' : 'Ошибка монтирования.', // added 17.04.2012 - 'errNetMountHostReq' : 'Host required.', // added 18.04.2012 - 'errSessionExpires' : 'Сессия была завершена так как превышено время отсутствия активности', - 'errCreatingTempDir' : 'Ошибка при создании временной директории: "$1"', - 'errFtpDownloadFile' : 'Ошибка при скачивании файла с FTP: "$1"', - 'errFtpUploadFile' : 'Ошибка при загрузке файла на FTP: "$1"', - 'errFtpMkdir' : 'Ошибка при создании директории на FTP: "$1"', - 'errArchiveExec' : 'Ошибка при выполнении архивации: "$1"', - 'errExtractExec' : 'Ошибка при выполнении распаковки: "$1"', - - 'errUploadFile' : 'Невозможно загрузить файл "$1"', - - - /******************************* commands names ********************************/ - 'cmdarchive' : 'Создать архив', - 'cmdback' : 'Назад', - 'cmdcopy' : 'Копировать', - 'cmdcut' : 'Вырезать', - 'cmddownload' : 'Скачать', - 'cmdduplicate' : 'Сделать копию', - 'cmdedit' : 'Редактировать', - 'cmdextract' : 'Распаковать архив', - 'cmdforward' : 'Вперед', - 'cmdgetfile' : 'Выбрать', - 'cmdhelp' : 'О программе', - 'cmdhome' : 'Домой', - 'cmdinfo' : 'Свойства', - 'cmdmkdir' : 'Новая папка', - 'cmdmkfile' : 'Новый файл', - 'cmdopen' : 'Открыть', - 'cmdpaste' : 'Вставить', - 'cmdquicklook' : 'Быстрый просмотр', - 'cmdreload' : 'Обновить', - 'cmdrename' : 'Переименовать', - 'cmdrm' : 'Удалить', - 'cmdsearch' : 'Поиск', - 'cmdup' : 'Наверх', - 'cmdupload' : 'Загрузить файлы', - 'cmdview' : 'Вид', - 'cmdresize' : 'Размер изображения', - 'cmdsort' : 'Сортировать', - - /*********************************** buttons ***********************************/ - 'btnClose' : 'Закрыть', - 'btnSave' : 'Сохранить', - 'btnRm' : 'Удалить', - 'btnCancel' : 'Отмена', - 'btnApply' : 'Применить', - 'btnNo' : 'Нет', - 'btnYes' : 'Да', - 'btnMount' : 'Подключить', // added 18.04.2012 - /******************************** notifications ********************************/ - 'ntfopen' : 'Открытие папки', - 'ntffile' : 'Открытие файла', - 'ntfreload' : 'Обновление текущей папки', - 'ntfmkdir' : 'Создание папки', - 'ntfmkfile' : 'Создание файла', - 'ntfrm' : 'Удаление файлов', - 'ntfcopy' : 'Копирование файлов', - 'ntfmove' : 'Перемещение файлов', - 'ntfprepare' : 'Подготовка к копированию', - 'ntfrename' : 'Переименование файлов', - 'ntfupload' : 'Загрузка файлов', - 'ntfdownload' : 'Скачивание файлов', - 'ntfsave' : 'Сохранение файлов', - 'ntfarchive' : 'Создание архива', - 'ntfextract' : 'Распаковка архива', - 'ntfsearch' : 'Поиск файлов', - 'ntfsmth' : 'Занят важным делом', - 'ntfnetmount' : 'Монтирую сетевой диск', // added 18.04.2012 - - /************************************ dates **********************************/ - 'dateUnknown' : 'Незвестно', - 'Today' : 'Сегодня', - 'Yesterday' : 'Вчера', - 'Jan' : 'Янв', - 'Feb' : 'Фев', - 'Mar' : 'Мар', - 'Apr' : 'Апр', - 'May' : 'Май', - 'Jun' : 'Июнь', - 'Jul' : 'Июль', - 'Aug' : 'Авг', - 'Sep' : 'Сен', - 'Oct' : 'Окт', - 'Nov' : 'Ноя', - 'Dec' : 'Дек', - 'January' : 'Январь', - 'February' : 'Февраль', - 'March' : 'Март', - 'April' : 'Апрель', - 'May' : 'Май', - 'June' : 'Июнь', - 'July' : 'Июль', - 'August' : 'Август', - 'September' : 'Сентябрь', - 'October' : 'Октябрь', - 'November' : 'Ноябрь', - 'December' : 'Декабрь', - 'Sunday' : 'Воскресенье', - 'Monday' : 'Понедельник', - 'Tuesday' : 'Вторник', - 'Wednesday' : 'Среда', - 'Thursday' : 'Четверг', - 'Friday' : 'Пятница', - 'Saturday' : 'Суббота', - 'Sun' : 'Вск', - 'Mon' : 'Пнд', - 'Tue' : 'Втр', - 'Wed' : 'Срд', - 'Thu' : 'Чтв', - 'Fri' : 'Птн', - 'Sat' : 'Сбт', - - /******************************** sort variants ********************************/ - 'sortname' : 'по имени', - 'sortkind' : 'по типу', - 'sortsize' : 'по размеру', - 'sortdate' : 'по дате', - 'sortFoldersFirst' : 'Папки в начале', - - /********************************** messages **********************************/ - 'confirmReq' : 'Необходимо подтверждение.', - 'confirmRm' : 'Хотите удалить файлы?
Действие необратимо.', - 'confirmRepl' : 'Заменить старый файл новым?', - 'apllyAll' : 'для всех', - 'name' : 'Имя файла', - 'size' : 'Размер', - 'perms' : 'Доступ', - 'modify' : 'Изменен', - 'kind' : 'Тип', - 'read' : 'чтение', - 'write' : 'запись', - 'noaccess' : 'нет доступа', - 'and' : 'и', - 'unknown' : 'неизвестно', - 'selectall' : 'Выбрать все файлы', - 'selectfiles' : 'Выбрать файл(ы)', - 'selectffile' : 'Выбрать первый файл', - 'selectlfile' : 'Выбрать последний файл', - 'viewlist' : 'В виде списка', - 'viewicons' : 'В виде иконок', - 'places' : 'Избранное', - 'calc' : 'вычисляю', - 'path' : 'Путь', - 'aliasfor' : 'Указывает на', - 'locked' : 'Защита', - 'dim' : 'Разрешение', - 'files' : 'Файлы', - 'folders' : 'Папки', - 'items' : 'Объекты', - 'yes' : 'да', - 'no' : 'нет', - 'link' : 'Ссылка', - 'searcresult' : 'Результаты поиска', - 'selected' : 'выбрано', - 'about' : 'О программе', - 'shortcuts' : 'Горячие клавиши', - 'help' : 'Помощь', - 'webfm' : 'Файловый менеджер для web', - 'ver' : 'Версия', - 'protocolver' : 'версия протокола', - 'homepage' : 'Сайт проекта', - 'docs' : 'Документация', - 'github' : 'Fork us on Github', - 'twitter' : 'Follow us in twitter', - 'facebook' : 'Join us on facebook', - 'team' : 'Авторы', - 'chiefdev' : 'ведущий разработчик', - 'developer' : 'разработчик', - 'contributor' : 'участник', - 'maintainer' : 'сопровождение проекта', - 'translator' : 'переводчик', - 'icons' : 'Иконки', - 'dontforget' : 'и не забудьте взять своё полотенце', - 'shortcutsof' : 'Горячие клавиши отключены', - 'dropFiles' : 'Бросить файлы', - 'or' : 'или', - 'selectForUpload' : 'Выбрать файлы для загрузки', - 'moveFiles' : 'Перемещение файлов', - 'copyFiles' : 'Копирование файлов', - 'rmFromPlaces' : 'Удалить из избранного', - 'untitled folder' : 'новая папка', - 'untitled file.txt' : 'новый файл.txt', - 'aspectRatio' : 'Сохранять пропорции', - 'scale' : 'Масштаб', - 'width' : 'Ширина', - 'height' : 'Высота', - 'resize' : 'Размер', - 'crop' : 'Кадрировать', - 'rotate' : 'Поворот', - 'rotate-cw' : 'Поворот на 90 градусов по часовой стрелке', - 'rotate-ccw' : 'Поворот на 90 градусов против часовой стрелке', - 'degree' : '°', - 'netMountDialogTitle' : 'Подключить сетевой диск', // added 18.04.2012 - 'protocol' : 'Протокол', // added 18.04.2012 - 'host' : 'Хост', // added 18.04.2012 - 'port' : 'Порт', // added 18.04.2012 - 'user' : 'Пользователь', // added 18.04.2012 - 'pass' : 'Пароль', // added 18.04.2012 - /********************************** mimetypes **********************************/ - 'kindUnknown' : 'Неизвестный', - 'kindFolder' : 'Папка', - 'kindAlias' : 'Ссылка', - 'kindAliasBroken' : 'Битая ссылка', - // applications - 'kindApp' : 'Приложение', - 'kindPostscript' : 'Документ Postscript', - 'kindMsOffice' : 'Документ Microsoft Office', - 'kindMsWord' : 'Документ Microsoft Word', - 'kindMsExcel' : 'Документ Microsoft Excel', - 'kindMsPP' : 'Презентация Microsoft Powerpoint', - 'kindOO' : 'Документ Open Office', - 'kindAppFlash' : 'Приложение Flash', - 'kindPDF' : 'Документ PDF', - 'kindTorrent' : 'Файл Bittorrent', - 'kind7z' : 'Архив 7z', - 'kindTAR' : 'Архив TAR', - 'kindGZIP' : 'Архив GZIP', - 'kindBZIP' : 'Архив BZIP', - 'kindZIP' : 'Архив ZIP', - 'kindRAR' : 'Архив RAR', - 'kindJAR' : 'Файл Java JAR', - 'kindTTF' : 'Шрифт True Type', - 'kindOTF' : 'Шрифт Open Type', - 'kindRPM' : 'Пакет RPM', - // texts - 'kindText' : 'Текстовый документ', - 'kindTextPlain' : 'Простой текст', - 'kindPHP' : 'Исходник PHP', - 'kindCSS' : 'Таблицы стилей CSS', - 'kindHTML' : 'Документ HTML', - 'kindJS' : 'Исходник Javascript', - 'kindRTF' : 'Rich Text Format', - 'kindC' : 'Исходник C', - 'kindCHeader' : 'Заголовочный файл C', - 'kindCPP' : 'Исходник C++', - 'kindCPPHeader' : 'Заголовочный файл C++', - 'kindShell' : 'Unix shell script', - 'kindPython' : 'Исходник Python', - 'kindJava' : 'Исходник Java', - 'kindRuby' : 'Исходник Ruby', - 'kindPerl' : 'Исходник Perl', - 'kindSQL' : 'Исходник SQL', - 'kindXML' : 'XML document', - 'kindAWK' : 'Исходник AWK', - 'kindCSV' : 'Текст с разделителями', - 'kindDOCBOOK' : 'Документ Docbook XML', - // images - 'kindImage' : 'Изображение', - 'kindBMP' : 'Изображение BMP', - 'kindJPEG' : 'Изображение JPEG', - 'kindGIF' : 'Изображение GIF', - 'kindPNG' : 'Изображение PNG', - 'kindTIFF' : 'Изображение TIFF', - 'kindTGA' : 'Изображение TGA', - 'kindPSD' : 'Изображение Adobe Photoshop', - 'kindXBITMAP' : 'Изображение X bitmap', - 'kindPXM' : 'Изображение Pixelmator', - // media - 'kindAudio' : 'Аудио файл', - 'kindAudioMPEG' : 'Аудио MPEG', - 'kindAudioMPEG4' : 'Аудио MPEG-4', - 'kindAudioMIDI' : 'Аудио MIDI', - 'kindAudioOGG' : 'Аудио Ogg Vorbis', - 'kindAudioWAV' : 'Аудио WAV', - 'AudioPlaylist' : 'Плейлист MP3', - 'kindVideo' : 'Видео файл', - 'kindVideoDV' : 'Видео DV', - 'kindVideoMPEG' : 'Видео MPEG', - 'kindVideoMPEG4' : 'Видео MPEG-4', - 'kindVideoAVI' : 'Видео AVI', - 'kindVideoMOV' : 'Видео Quick Time', - 'kindVideoWM' : 'Видео Windows Media', - 'kindVideoFlash' : 'Видео Flash', - 'kindVideoMKV' : 'Видео Matroska', - 'kindVideoOGG' : 'Видео Ogg' - ,'volume_files' : 'Файлы ' - } - } -} - - - - +/** + * Russian translation + * @author Dmitry "dio" Levashov + * @version 2011-07-15 + */ +if (elFinder && elFinder.prototype && typeof(elFinder.prototype.i18) == 'object') { + elFinder.prototype.i18.ru = { + translator : 'Dmitry "dio" Levashov <dio@std42.ru>', + language : 'Русский язык', + direction : 'ltr', + dateFormat : 'd M Y H:i', + fancyDateFormat : '$1 H:i', + messages : { + + /********************************** errors **********************************/ + 'error' : 'Ошибка', + 'errUnknown' : 'Неизвестная ошибка.', + 'errUnknownCmd' : 'Неизвестная комманда.', + 'errJqui' : 'Отсутствуют необходимые компоненты jQuery UI - selectable, draggable и droppable.', + 'errNode' : 'Отсутствует DOM элемент для инициализации elFinder.', + 'errURL' : 'Некорректная настройка. Необходимо указать URL сервера.', + 'errAccess' : 'Доступ запрещен.', + 'errConnect' : 'Не удалось соединиться с сервером.', + 'errAbort' : 'Соединение прервано.', + 'errTimeout' : 'Таймаут соединения.', + 'errNotFound' : 'Сервер не найден.', + 'errResponse' : 'Некорректный ответ сервера.', + 'errConf' : 'Некорректная настройка сервера.', + 'errJSON' : 'Модуль PHP JSON не установлен.', + 'errNoVolumes' : 'Отсутствуют корневые директории достуные для чтения.', + 'errCmdParams' : 'Некорректные параметры комманды "$1".', + 'errDataNotJSON' : 'Данные не формате JSON.', + 'errDataEmpty' : 'Данные отсутствуют.', + 'errCmdReq' : 'Для запроса к серверу необходимо указать имя комманды.', + 'errOpen' : 'Не удалось открыть "$1".', + 'errNotFolder' : 'Объект не является папкой.', + 'errNotFile' : 'Объект не является файлом.', + 'errRead' : 'Ошибка чтения "$1".', + 'errWrite' : 'Ошибка записи "$1".', + 'errPerm' : 'Доступ запрещен.', + 'errLocked' : '"$1" защищен и не может быть переименован, перемещен или удален.', + 'errExists' : 'В папке уже существует объект с именем "$1".', + 'errInvName' : 'Недопустимое имя файла.', + 'errFolderNotFound' : 'Папка не найдена.', + 'errFileNotFound' : 'Файл не найден.', + 'errTrgFolderNotFound' : 'Целевая папка "$1" не найдена.', + 'errPopup' : 'Браузер заблокировал открытие нового окна. Чтобы окрыть файл, измените настройки браузера.', + 'errMkdir' : 'Ошибка создания папки "$1".', + 'errMkfile' : 'Ошибка создания файла "$1".', + 'errRename' : 'Ошибка переименования "$1".', + 'errCopyFrom' : 'Копирование из корневой директории "$1" запрещено.', + 'errCopyTo' : 'Копирование в корневую директорию "$1" запрещено.', + 'errUploadCommon' : 'Ошибка загрузки файлов.', + 'errUpload' : 'Ошибка загрузки "$1".', + 'errUploadNoFiles' : 'Отсутствуют загруженые файлы.', + 'errMaxSize' : 'Превышен допустимый размер загружаемых файлов.', + 'errFileMaxSize' : 'Размер файла превышает допустимый.', + 'errUploadMime' : 'Недопустимый тип файла.', + 'errUploadTransfer' : 'Ошибка передачи файла "$1".', + 'errSave' : 'Ошибка сохранения "$1".', + 'errCopy' : 'Ошибка копирования "$1".', + 'errMove' : 'Ошибка перемещения "$1".', + 'errCopyInItself' : 'Невозможно скопировать "$1" в самого себя.', + 'errRm' : 'Ошибка удаления "$1".', + 'errExtract' : 'Ошибка извлечения файлов из архива "$1".', + 'errArchive' : 'Ошибка создания архива.', + 'errArcType' : 'Неподдерживаемый тип архива.', + 'errNoArchive' : 'Файл не является архивом допустимого типа.', + 'errCmdNoSupport' : 'Сервер не поддерживает эту комманду.', + 'errReplByChild' : 'Невозможно заменить папку "$1" содержащимся в ней объектом.', + 'errArcSymlinks' : 'По соображениям безопасности запрещена распаковка архивов, содержащих ссылки (symlinks) или файлы с недопустимыми именами.', // edited 24.06.2012 + 'errArcMaxSize' : 'Размер файлов в архиве превышает максимально разрешенный.', + 'errResize' : 'Не удалось изменить размер "$1".', + 'errUsupportType' : 'Неподдерживаемый тип файла.', + 'errNotUTF8Content' : 'Файл "$1" содержит текст в кодировке отличной от UTF-8 и не может быть отредактирован.', // added 9.11.2011 + 'errNetMount' : 'Не удалось подключить "$1".', // added 17.04.2012 + 'errNetMountNoDriver' : 'Неподдерживаемый протокол.', // added 17.04.2012 + 'errNetMountFailed' : 'Ошибка монтирования.', // added 17.04.2012 + 'errNetMountHostReq' : 'Host required.', // added 18.04.2012 + 'errSessionExpires' : 'Сессия была завершена так как превышено время отсутствия активности', + 'errCreatingTempDir' : 'Ошибка при создании временной директории: "$1"', + 'errFtpDownloadFile' : 'Ошибка при скачивании файла с FTP: "$1"', + 'errFtpUploadFile' : 'Ошибка при загрузке файла на FTP: "$1"', + 'errFtpMkdir' : 'Ошибка при создании директории на FTP: "$1"', + 'errArchiveExec' : 'Ошибка при выполнении архивации: "$1"', + 'errExtractExec' : 'Ошибка при выполнении распаковки: "$1"', + + 'errUploadFile' : 'Невозможно загрузить файл "$1"', + + + /******************************* commands names ********************************/ + 'cmdarchive' : 'Создать архив', + 'cmdback' : 'Назад', + 'cmdcopy' : 'Копировать', + 'cmdcut' : 'Вырезать', + 'cmddownload' : 'Скачать', + 'cmdduplicate' : 'Сделать копию', + 'cmdedit' : 'Редактировать', + 'cmdextract' : 'Распаковать архив', + 'cmdforward' : 'Вперед', + 'cmdgetfile' : 'Выбрать', + 'cmdhelp' : 'О программе', + 'cmdhome' : 'Домой', + 'cmdinfo' : 'Свойства', + 'cmdmkdir' : 'Новая папка', + 'cmdmkfile' : 'Новый файл', + 'cmdopen' : 'Открыть', + 'cmdpaste' : 'Вставить', + 'cmdquicklook' : 'Быстрый просмотр', + 'cmdreload' : 'Обновить', + 'cmdrename' : 'Переименовать', + 'cmdrm' : 'Удалить', + 'cmdsearch' : 'Поиск', + 'cmdup' : 'Наверх', + 'cmdupload' : 'Загрузить файлы', + 'cmdview' : 'Вид', + 'cmdresize' : 'Размер изображения', + 'cmdsort' : 'Сортировать', + + /*********************************** buttons ***********************************/ + 'btnClose' : 'Закрыть', + 'btnSave' : 'Сохранить', + 'btnRm' : 'Удалить', + 'btnCancel' : 'Отмена', + 'btnApply' : 'Применить', + 'btnNo' : 'Нет', + 'btnYes' : 'Да', + 'btnMount' : 'Подключить', // added 18.04.2012 + /******************************** notifications ********************************/ + 'ntfopen' : 'Открытие папки', + 'ntffile' : 'Открытие файла', + 'ntfreload' : 'Обновление текущей папки', + 'ntfmkdir' : 'Создание папки', + 'ntfmkfile' : 'Создание файла', + 'ntfrm' : 'Удаление файлов', + 'ntfcopy' : 'Копирование файлов', + 'ntfmove' : 'Перемещение файлов', + 'ntfprepare' : 'Подготовка к копированию', + 'ntfrename' : 'Переименование файлов', + 'ntfupload' : 'Загрузка файлов', + 'ntfdownload' : 'Скачивание файлов', + 'ntfsave' : 'Сохранение файлов', + 'ntfarchive' : 'Создание архива', + 'ntfextract' : 'Распаковка архива', + 'ntfsearch' : 'Поиск файлов', + 'ntfsmth' : 'Занят важным делом', + 'ntfnetmount' : 'Монтирую сетевой диск', // added 18.04.2012 + + /************************************ dates **********************************/ + 'dateUnknown' : 'Незвестно', + 'Today' : 'Сегодня', + 'Yesterday' : 'Вчера', + 'Jan' : 'Янв', + 'Feb' : 'Фев', + 'Mar' : 'Мар', + 'Apr' : 'Апр', + 'May' : 'Май', + 'Jun' : 'Июнь', + 'Jul' : 'Июль', + 'Aug' : 'Авг', + 'Sep' : 'Сен', + 'Oct' : 'Окт', + 'Nov' : 'Ноя', + 'Dec' : 'Дек', + 'January' : 'Январь', + 'February' : 'Февраль', + 'March' : 'Март', + 'April' : 'Апрель', + 'May' : 'Май', + 'June' : 'Июнь', + 'July' : 'Июль', + 'August' : 'Август', + 'September' : 'Сентябрь', + 'October' : 'Октябрь', + 'November' : 'Ноябрь', + 'December' : 'Декабрь', + 'Sunday' : 'Воскресенье', + 'Monday' : 'Понедельник', + 'Tuesday' : 'Вторник', + 'Wednesday' : 'Среда', + 'Thursday' : 'Четверг', + 'Friday' : 'Пятница', + 'Saturday' : 'Суббота', + 'Sun' : 'Вск', + 'Mon' : 'Пнд', + 'Tue' : 'Втр', + 'Wed' : 'Срд', + 'Thu' : 'Чтв', + 'Fri' : 'Птн', + 'Sat' : 'Сбт', + + /******************************** sort variants ********************************/ + 'sortname' : 'по имени', + 'sortkind' : 'по типу', + 'sortsize' : 'по размеру', + 'sortdate' : 'по дате', + 'sortFoldersFirst' : 'Папки в начале', + + /********************************** messages **********************************/ + 'confirmReq' : 'Необходимо подтверждение.', + 'confirmRm' : 'Хотите удалить файлы?
Действие необратимо.', + 'confirmRepl' : 'Заменить старый файл новым?', + 'apllyAll' : 'для всех', + 'name' : 'Имя файла', + 'size' : 'Размер', + 'perms' : 'Доступ', + 'modify' : 'Изменен', + 'kind' : 'Тип', + 'read' : 'чтение', + 'write' : 'запись', + 'noaccess' : 'нет доступа', + 'and' : 'и', + 'unknown' : 'неизвестно', + 'selectall' : 'Выбрать все файлы', + 'selectfiles' : 'Выбрать файл(ы)', + 'selectffile' : 'Выбрать первый файл', + 'selectlfile' : 'Выбрать последний файл', + 'viewlist' : 'В виде списка', + 'viewicons' : 'В виде иконок', + 'places' : 'Избранное', + 'calc' : 'вычисляю', + 'path' : 'Путь', + 'aliasfor' : 'Указывает на', + 'locked' : 'Защита', + 'dim' : 'Разрешение', + 'files' : 'Файлы', + 'folders' : 'Папки', + 'items' : 'Объекты', + 'yes' : 'да', + 'no' : 'нет', + 'link' : 'Ссылка', + 'searcresult' : 'Результаты поиска', + 'selected' : 'выбрано', + 'about' : 'О программе', + 'shortcuts' : 'Горячие клавиши', + 'help' : 'Помощь', + 'webfm' : 'Файловый менеджер для web', + 'ver' : 'Версия', + 'protocolver' : 'версия протокола', + 'homepage' : 'Сайт проекта', + 'docs' : 'Документация', + 'github' : 'Fork us on Github', + 'twitter' : 'Follow us in twitter', + 'facebook' : 'Join us on facebook', + 'team' : 'Авторы', + 'chiefdev' : 'ведущий разработчик', + 'developer' : 'разработчик', + 'contributor' : 'участник', + 'maintainer' : 'сопровождение проекта', + 'translator' : 'переводчик', + 'icons' : 'Иконки', + 'dontforget' : 'и не забудьте взять своё полотенце', + 'shortcutsof' : 'Горячие клавиши отключены', + 'dropFiles' : 'Бросить файлы', + 'or' : 'или', + 'selectForUpload' : 'Выбрать файлы для загрузки', + 'moveFiles' : 'Перемещение файлов', + 'copyFiles' : 'Копирование файлов', + 'rmFromPlaces' : 'Удалить из избранного', + 'untitled folder' : 'новая папка', + 'untitled file.txt' : 'новый файл.txt', + 'aspectRatio' : 'Сохранять пропорции', + 'scale' : 'Масштаб', + 'width' : 'Ширина', + 'height' : 'Высота', + 'resize' : 'Размер', + 'crop' : 'Кадрировать', + 'rotate' : 'Поворот', + 'rotate-cw' : 'Поворот на 90 градусов по часовой стрелке', + 'rotate-ccw' : 'Поворот на 90 градусов против часовой стрелке', + 'degree' : '°', + 'netMountDialogTitle' : 'Подключить сетевой диск', // added 18.04.2012 + 'protocol' : 'Протокол', // added 18.04.2012 + 'host' : 'Хост', // added 18.04.2012 + 'port' : 'Порт', // added 18.04.2012 + 'user' : 'Пользователь', // added 18.04.2012 + 'pass' : 'Пароль', // added 18.04.2012 + /********************************** mimetypes **********************************/ + 'kindUnknown' : 'Неизвестный', + 'kindFolder' : 'Папка', + 'kindAlias' : 'Ссылка', + 'kindAliasBroken' : 'Битая ссылка', + // applications + 'kindApp' : 'Приложение', + 'kindPostscript' : 'Документ Postscript', + 'kindMsOffice' : 'Документ Microsoft Office', + 'kindMsWord' : 'Документ Microsoft Word', + 'kindMsExcel' : 'Документ Microsoft Excel', + 'kindMsPP' : 'Презентация Microsoft Powerpoint', + 'kindOO' : 'Документ Open Office', + 'kindAppFlash' : 'Приложение Flash', + 'kindPDF' : 'Документ PDF', + 'kindTorrent' : 'Файл Bittorrent', + 'kind7z' : 'Архив 7z', + 'kindTAR' : 'Архив TAR', + 'kindGZIP' : 'Архив GZIP', + 'kindBZIP' : 'Архив BZIP', + 'kindZIP' : 'Архив ZIP', + 'kindRAR' : 'Архив RAR', + 'kindJAR' : 'Файл Java JAR', + 'kindTTF' : 'Шрифт True Type', + 'kindOTF' : 'Шрифт Open Type', + 'kindRPM' : 'Пакет RPM', + // texts + 'kindText' : 'Текстовый документ', + 'kindTextPlain' : 'Простой текст', + 'kindPHP' : 'Исходник PHP', + 'kindCSS' : 'Таблицы стилей CSS', + 'kindHTML' : 'Документ HTML', + 'kindJS' : 'Исходник Javascript', + 'kindRTF' : 'Rich Text Format', + 'kindC' : 'Исходник C', + 'kindCHeader' : 'Заголовочный файл C', + 'kindCPP' : 'Исходник C++', + 'kindCPPHeader' : 'Заголовочный файл C++', + 'kindShell' : 'Unix shell script', + 'kindPython' : 'Исходник Python', + 'kindJava' : 'Исходник Java', + 'kindRuby' : 'Исходник Ruby', + 'kindPerl' : 'Исходник Perl', + 'kindSQL' : 'Исходник SQL', + 'kindXML' : 'XML document', + 'kindAWK' : 'Исходник AWK', + 'kindCSV' : 'Текст с разделителями', + 'kindDOCBOOK' : 'Документ Docbook XML', + // images + 'kindImage' : 'Изображение', + 'kindBMP' : 'Изображение BMP', + 'kindJPEG' : 'Изображение JPEG', + 'kindGIF' : 'Изображение GIF', + 'kindPNG' : 'Изображение PNG', + 'kindTIFF' : 'Изображение TIFF', + 'kindTGA' : 'Изображение TGA', + 'kindPSD' : 'Изображение Adobe Photoshop', + 'kindXBITMAP' : 'Изображение X bitmap', + 'kindPXM' : 'Изображение Pixelmator', + // media + 'kindAudio' : 'Аудио файл', + 'kindAudioMPEG' : 'Аудио MPEG', + 'kindAudioMPEG4' : 'Аудио MPEG-4', + 'kindAudioMIDI' : 'Аудио MIDI', + 'kindAudioOGG' : 'Аудио Ogg Vorbis', + 'kindAudioWAV' : 'Аудио WAV', + 'AudioPlaylist' : 'Плейлист MP3', + 'kindVideo' : 'Видео файл', + 'kindVideoDV' : 'Видео DV', + 'kindVideoMPEG' : 'Видео MPEG', + 'kindVideoMPEG4' : 'Видео MPEG-4', + 'kindVideoAVI' : 'Видео AVI', + 'kindVideoMOV' : 'Видео Quick Time', + 'kindVideoWM' : 'Видео Windows Media', + 'kindVideoFlash' : 'Видео Flash', + 'kindVideoMKV' : 'Видео Matroska', + 'kindVideoOGG' : 'Видео Ogg' + ,'volume_files' : 'Файлы ' + } + } +} + + + + diff --git a/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.zh_CN.js b/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.zh_CN.js index 4896062..7268015 100644 --- a/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.zh_CN.js +++ b/elFinder.Net.Web/Content/elfinder/js/i18n/elfinder.zh_CN.js @@ -1,354 +1,354 @@ -/** - * Simplified Chinese translation - * @author deerchao - * @author Andy Hu - * @version 2013-01-29 - */ -if (elFinder && elFinder.prototype && typeof(elFinder.prototype.i18) == 'object') { - elFinder.prototype.i18.zh_CN = { - translator : '翻译者 deerchao <deerchao@gmail.com>, Andy Hu <andyhu7@yahoo.com.hk>', - language : '简体中文', - direction : 'ltr', - dateFormat : 'Y-m-d H:i', - fancyDateFormat : '$1 H:i', - messages : { - - /********************************** errors **********************************/ - 'error' : '错误', - 'errUnknown' : '未知的错误.', - 'errUnknownCmd' : '未知的命令.', - 'errJqui' : '无效的 jQuery UI 配置. 必须包含 Selectable, draggable 以及 droppable 组件.', - 'errNode' : 'elFinder 需要能创建 DOM 元素.', - 'errURL' : '无效的 elFinder 配置! URL 选项未配置.', - 'errAccess' : '访问被拒绝.', - 'errConnect' : '不能连接到后端.', - 'errAbort' : '连接中止.', - 'errTimeout' : '连接超时.', - 'errNotFound' : '未找到后端.', - 'errResponse' : '无效的后端响应.', - 'errConf' : '无效的后端配置.', - 'errJSON' : 'PHP JSON 模块未安装.', - 'errNoVolumes' : '无可读的卷.', - 'errCmdParams' : '无效的参数, 命令: "$1".', - 'errDataNotJSON' : '响应不符合 JSON 格式.', - 'errDataEmpty' : '响应为空.', - 'errCmdReq' : '后端请求需要命令名称.', - 'errOpen' : '无法打开 "$1".', - 'errNotFolder' : '对象不是文件夹.', - 'errNotFile' : '对象不是文件.', - 'errRead' : '无法读取 "$1".', - 'errWrite' : '无法写入 "$1".', - 'errPerm' : '无权限.', - 'errLocked' : '"$1" 被锁定,不能重命名, 移动或删除.', - 'errExists' : '文件 "$1" 已经存在了.', - 'errInvName' : '无效的文件名.', - 'errFolderNotFound' : '未找到文件夹.', - 'errFileNotFound' : '未找到文件.', - 'errTrgFolderNotFound' : '未找到目标文件夹 "$1".', - 'errPopup' : '浏览器拦截了弹出窗口. 请在选项中允许弹出窗口.', - 'errMkdir' : '不能创建文件夹 "$1".', - 'errMkfile' : '不能创建文件 "$1".', - 'errRename' : '不能重命名 "$1".', - 'errCopyFrom' : '不允许从卷 "$1" 复制.', - 'errCopyTo' : '不允许向卷 "$1" 复制.', - 'errUpload' : '上传出错.', - 'errUploadFile' : '无法上传 "$1".', - 'errUploadNoFiles' : '未找到要上传的文件.', - 'errUploadTotalSize' : '数据超过了允许的最大大小.', - 'errUploadFileSize' : '文件超过了允许的最大大小.', - 'errUploadMime' : '不允许的文件类型.', - 'errUploadTransfer' : '"$1" 传输错误.', - 'errNotReplace' : '对象 "$1" 已经在此位置存在, 不能被其他对象替换.', // new - 'errReplace' : '无法替换 "$1".', - 'errSave' : '无法保存 "$1".', - 'errCopy' : '无法复制 "$1".', - 'errMove' : '无法移动 "$1".', - 'errCopyInItself' : '不能移动 "$1" 到原有位置.', - 'errRm' : '无法删除 "$1".', - 'errRmSrc' : '不能删除源文件.', - 'errExtract' : '无法从 "$1" 提取文件.', - 'errArchive' : '无法创建压缩包.', - 'errArcType' : '不支持的压缩格式.', - 'errNoArchive' : '文件不是压缩包, 或者不支持该压缩格式.', - 'errCmdNoSupport' : '后端不支持该命令.', - 'errReplByChild' : '文件夹 “$1” 不能被它所包含的项目替换.', - 'errArcSymlinks' : '出于安全上的考虑,不允许解压包含符号链接的压缩包.', - 'errArcMaxSize' : '压缩包文件超过最大允许文件大小范围.', - 'errResize' : '无法重新调整大小 "$1".', - 'errUsupportType' : '不被支持的文件格式.', - 'errNotUTF8Content' : '文件 "$1" 不是 UTF-8 格式, 不能编辑.', // added 9.11.2011 - 'errNetMount' : '无法装载 "$1".', // added 17.04.2012 - 'errNetMountNoDriver' : '不支持该协议.', // added 17.04.2012 - 'errNetMountFailed' : '装载失败.', // added 17.04.2012 - 'errNetMountHostReq' : '需要指定主机.', // added 18.04.2012 - /******************************* commands names ********************************/ - 'cmdarchive' : '创建压缩包', - 'cmdback' : '后退', - 'cmdcopy' : '复制', - 'cmdcut' : '剪切', - 'cmddownload' : '下载', - 'cmdduplicate' : '创建复本', - 'cmdedit' : '编辑文件', - 'cmdextract' : '从压缩包提取文件', - 'cmdforward' : '前进', - 'cmdgetfile' : '选择文件', - 'cmdhelp' : '关于本软件', - 'cmdhome' : '首页', - 'cmdinfo' : '查看信息', - 'cmdmkdir' : '新建文件夹', - 'cmdmkfile' : '新建文本文件', - 'cmdopen' : '打开', - 'cmdpaste' : '粘贴', - 'cmdquicklook' : '预览', - 'cmdreload' : '刷新', - 'cmdrename' : '重命名', - 'cmdrm' : '删除', - 'cmdsearch' : '查找文件', - 'cmdup' : '转到上一级文件夹', - 'cmdupload' : '上传文件', - 'cmdview' : '查看', - 'cmdresize' : '重新调整大小', - 'cmdsort' : '排序', - 'cmdnetmount' : '装载网络卷', // added 18.04.2012 - - /*********************************** buttons ***********************************/ - 'btnClose' : '关闭', - 'btnSave' : '保存', - 'btnRm' : '删除', - 'btnApply' : '应用', - 'btnCancel' : '取消', - 'btnNo' : '否', - 'btnYes' : '是', - 'btnMount' : '装载', // added 18.04.2012 - /******************************** notifications ********************************/ - 'ntfopen' : '打开文件夹', - 'ntffile' : '打开文件', - 'ntfreload' : '刷新文件夹内容', - 'ntfmkdir' : '创建文件夹', - 'ntfmkfile' : '创建文件', - 'ntfrm' : '删除文件', - 'ntfcopy' : '复制文件', - 'ntfmove' : '移动文件', - 'ntfprepare' : '准备复制文件', - 'ntfrename' : '重命名文件', - 'ntfupload' : '上传文件', - 'ntfdownload' : '下载文件', - 'ntfsave' : '保存文件', - 'ntfarchive' : '创建压缩包', - 'ntfextract' : '从压缩包提取文件', - 'ntfsearch' : '搜索文件', - 'ntfresize' : '正在更改尺寸', - 'ntfsmth' : '正在忙 >_<', - 'ntfloadimg' : '正在加载图片', - 'ntfnetmount' : '正在装载网络卷', // added 18.04.2012 - - /************************************ dates **********************************/ - 'dateUnknown' : '未知', - 'Today' : '今天', - 'Yesterday' : '昨天', - 'Jan' : '一月', - 'Feb' : '二月', - 'Mar' : '三月', - 'Apr' : '四月', - 'May' : '五月', - 'Jun' : '六月', - 'Jul' : '七月', - 'Aug' : '八月', - 'Sep' : '九月', - 'Oct' : '十月', - 'Nov' : '十一月', - 'Dec' : '十二月', - 'January' : '一月', - 'February' : '二月', - 'March' : '三月', - 'April' : '四月', - 'May' : '五月', - 'June' : '六月', - 'July' : '七月', - 'August' : '八月', - 'September' : '九月', - 'October' : '十月', - 'November' : '十一月', - 'December' : '十二月', - 'Sunday' : '星期日', - 'Monday' : '星期一', - 'Tuesday' : '星期二', - 'Wednesday' : '星期三', - 'Thursday' : '星期四', - 'Friday' : '星期五', - 'Saturday' : '星期六', - 'Sun' : '周日', - 'Mon' : '周一', - 'Tue' : '周二', - 'Wed' : '周三', - 'Thu' : '周四', - 'Fri' : '周五', - 'Sat' : '周六', - /******************************** sort variants ********************************/ - 'sortnameDirsFirst' : '按名称 (文件夹在最前)', - 'sortkindDirsFirst' : '按类型 (文件夹在最前)', - 'sortsizeDirsFirst' : '按大小 (文件夹在最前)', - 'sortdateDirsFirst' : '按日期 (文件夹在最前)', - 'sortname' : '按名称', - 'sortkind' : '按类型', - 'sortsize' : '按大小', - 'sortdate' : '按日期', - - /********************************** messages **********************************/ - 'confirmReq' : '请确认', - 'confirmRm' : '确定要删除文件吗?
该操作不可撤销!', - 'confirmRepl' : '用新的文件替换原有文件?', - 'apllyAll' : '全部应用', - 'name' : '名称', - 'size' : '大小', - 'perms' : '权限', - 'modify' : '修改于', - 'kind' : '类别', - 'read' : '读取', - 'write' : '写入', - 'noaccess' : '无权限', - 'and' : '和', - 'unknown' : '未知', - 'selectall' : '选择所有文件', - 'selectfiles' : '选择文件', - 'selectffile' : '选择第一个文件', - 'selectlfile' : '选择最后一个文件', - 'viewlist' : '列表视图', - 'viewicons' : '图标视图', - 'places' : '位置', - 'calc' : '计算', - 'path' : '路径', - 'aliasfor' : '别名', - 'locked' : '锁定', - 'dim' : '尺寸', - 'files' : '文件', - 'folders' : '文件夹', - 'items' : '项目', - 'yes' : '是', - 'no' : '否', - 'link' : '链接', - 'searcresult' : '搜索结果', - 'selected' : '选中的项目', - 'about' : '关于', - 'shortcuts' : '快捷键', - 'help' : '帮助', - 'webfm' : '网络文件管理器', - 'ver' : '版本', - 'protocolver' : '协议版本', - 'homepage' : '项目主页', - 'docs' : '文档', - 'github' : 'Fork us on Github', - 'twitter' : 'Follow us on twitter', - 'facebook' : 'Join us on facebook', - 'team' : '团队', - 'chiefdev' : '首席开发', - 'developer' : '开发', - 'contributor' : '贡献', - 'maintainer' : '维护', - 'translator' : '翻译', - 'icons' : '图标', - 'dontforget' : '别忘了带上你擦汗的毛巾', - 'shortcutsof' : '快捷键已禁用', - 'dropFiles' : '把文件拖到这里', - 'or' : '或者', - 'selectForUpload' : '选择要上传的文件', - 'moveFiles' : '移动文件', - 'copyFiles' : '复制文件', - 'rmFromPlaces' : '从位置中删除', - 'untitled folder' : '未命名文件夹', - 'untitled file.txt' : '未命名文件.txt', - 'aspectRatio' : '保持比例', - 'scale' : '高宽比', - 'width' : '宽', - 'height' : '高', - 'mode' : '模式', - 'resize' : '重新调整大小', - 'crop' : '裁切', - 'rotate' : '旋转', - 'rotate-cw' : '顺时针旋转90度', - 'rotate-ccw' : '逆时针旋转90度', - 'degree' : '度', - 'port' : '端口', // added 18.04.2012 - 'user' : '用户', // added 18.04.2012 - 'pass' : '密码', // added 18.04.2012 - - /********************************** mimetypes **********************************/ - 'kindUnknown' : '未知', - 'kindFolder' : '文件夹', - 'kindAlias' : '别名', - 'kindAliasBroken' : '错误的别名', - // applications - 'kindApp' : '程序', - 'kindPostscript' : 'Postscript 文档', - 'kindMsOffice' : 'Microsoft Office 文档', - 'kindMsWord' : 'Microsoft Word 文档', - 'kindMsExcel' : 'Microsoft Excel 文档', - 'kindMsPP' : 'Microsoft Powerpoint 演示', - 'kindOO' : 'Open Office 文档', - 'kindAppFlash' : 'Flash 程序', - 'kindPDF' : 'Portable Document Format (PDF)', - 'kindTorrent' : 'Bittorrent 文件', - 'kind7z' : '7z 压缩包', - 'kindTAR' : 'TAR 压缩包', - 'kindGZIP' : 'GZIP 压缩包', - 'kindBZIP' : 'BZIP 压缩包', - 'kindZIP' : 'ZIP 压缩包', - 'kindRAR' : 'RAR 压缩包', - 'kindJAR' : 'Java JAR 文件', - 'kindTTF' : 'True Type 字体', - 'kindOTF' : 'Open Type 字体', - 'kindRPM' : 'RPM 包', - // texts - 'kindText' : '文本文件', - 'kindTextPlain' : '纯文本', - 'kindPHP' : 'PHP 源代码', - 'kindCSS' : '层叠样式表(CSS)', - 'kindHTML' : 'HTML 文档', - 'kindJS' : 'Javascript 源代码', - 'kindRTF' : '富文本格式(RTF)', - 'kindC' : 'C 源代码', - 'kindCHeader' : 'C 头文件', - 'kindCPP' : 'C++ 源代码', - 'kindCPPHeader' : 'C++ 头文件', - 'kindShell' : 'Unix 外壳脚本', - 'kindPython' : 'Python 源代码', - 'kindJava' : 'Java 源代码', - 'kindRuby' : 'Ruby 源代码', - 'kindPerl' : 'Perl 源代码', - 'kindSQL' : 'SQL 脚本', - 'kindXML' : 'XML 文档', - 'kindAWK' : 'AWK 源代码', - 'kindCSV' : '逗号分隔值文件(CSV)', - 'kindDOCBOOK' : 'Docbook XML 文档', - // images - 'kindImage' : '图片', - 'kindBMP' : 'BMP 图片', - 'kindJPEG' : 'JPEG 图片', - 'kindGIF' : 'GIF 图片', - 'kindPNG' : 'PNG 图片', - 'kindTIFF' : 'TIFF 图片', - 'kindTGA' : 'TGA 图片', - 'kindPSD' : 'Adobe Photoshop 图片', - 'kindXBITMAP' : 'X bitmap 图片', - 'kindPXM' : 'Pixelmator 图片', - // media - 'kindAudio' : '音频', - 'kindAudioMPEG' : 'MPEG 音频', - 'kindAudioMPEG4' : 'MPEG-4 音频', - 'kindAudioMIDI' : 'MIDI 音频', - 'kindAudioOGG' : 'Ogg Vorbis 音频', - 'kindAudioWAV' : 'WAV 音频', - 'AudioPlaylist' : 'MP3 播放列表', - 'kindVideo' : '视频', - 'kindVideoDV' : 'DV 视频', - 'kindVideoMPEG' : 'MPEG 视频', - 'kindVideoMPEG4' : 'MPEG-4 视频', - 'kindVideoAVI' : 'AVI 视频', - 'kindVideoMOV' : 'Quick Time 视频', - 'kindVideoWM' : 'Windows Media 视频', - 'kindVideoFlash' : 'Flash 视频', - 'kindVideoMKV' : 'Matroska 视频', - 'kindVideoOGG' : 'Ogg 视频' - } - } -} +/** + * Simplified Chinese translation + * @author deerchao + * @author Andy Hu + * @version 2013-01-29 + */ +if (elFinder && elFinder.prototype && typeof(elFinder.prototype.i18) == 'object') { + elFinder.prototype.i18.zh_CN = { + translator : '翻译者 deerchao <deerchao@gmail.com>, Andy Hu <andyhu7@yahoo.com.hk>', + language : '简体中文', + direction : 'ltr', + dateFormat : 'Y-m-d H:i', + fancyDateFormat : '$1 H:i', + messages : { + + /********************************** errors **********************************/ + 'error' : '错误', + 'errUnknown' : '未知的错误.', + 'errUnknownCmd' : '未知的命令.', + 'errJqui' : '无效的 jQuery UI 配置. 必须包含 Selectable, draggable 以及 droppable 组件.', + 'errNode' : 'elFinder 需要能创建 DOM 元素.', + 'errURL' : '无效的 elFinder 配置! URL 选项未配置.', + 'errAccess' : '访问被拒绝.', + 'errConnect' : '不能连接到后端.', + 'errAbort' : '连接中止.', + 'errTimeout' : '连接超时.', + 'errNotFound' : '未找到后端.', + 'errResponse' : '无效的后端响应.', + 'errConf' : '无效的后端配置.', + 'errJSON' : 'PHP JSON 模块未安装.', + 'errNoVolumes' : '无可读的卷.', + 'errCmdParams' : '无效的参数, 命令: "$1".', + 'errDataNotJSON' : '响应不符合 JSON 格式.', + 'errDataEmpty' : '响应为空.', + 'errCmdReq' : '后端请求需要命令名称.', + 'errOpen' : '无法打开 "$1".', + 'errNotFolder' : '对象不是文件夹.', + 'errNotFile' : '对象不是文件.', + 'errRead' : '无法读取 "$1".', + 'errWrite' : '无法写入 "$1".', + 'errPerm' : '无权限.', + 'errLocked' : '"$1" 被锁定,不能重命名, 移动或删除.', + 'errExists' : '文件 "$1" 已经存在了.', + 'errInvName' : '无效的文件名.', + 'errFolderNotFound' : '未找到文件夹.', + 'errFileNotFound' : '未找到文件.', + 'errTrgFolderNotFound' : '未找到目标文件夹 "$1".', + 'errPopup' : '浏览器拦截了弹出窗口. 请在选项中允许弹出窗口.', + 'errMkdir' : '不能创建文件夹 "$1".', + 'errMkfile' : '不能创建文件 "$1".', + 'errRename' : '不能重命名 "$1".', + 'errCopyFrom' : '不允许从卷 "$1" 复制.', + 'errCopyTo' : '不允许向卷 "$1" 复制.', + 'errUpload' : '上传出错.', + 'errUploadFile' : '无法上传 "$1".', + 'errUploadNoFiles' : '未找到要上传的文件.', + 'errUploadTotalSize' : '数据超过了允许的最大大小.', + 'errUploadFileSize' : '文件超过了允许的最大大小.', + 'errUploadMime' : '不允许的文件类型.', + 'errUploadTransfer' : '"$1" 传输错误.', + 'errNotReplace' : '对象 "$1" 已经在此位置存在, 不能被其他对象替换.', // new + 'errReplace' : '无法替换 "$1".', + 'errSave' : '无法保存 "$1".', + 'errCopy' : '无法复制 "$1".', + 'errMove' : '无法移动 "$1".', + 'errCopyInItself' : '不能移动 "$1" 到原有位置.', + 'errRm' : '无法删除 "$1".', + 'errRmSrc' : '不能删除源文件.', + 'errExtract' : '无法从 "$1" 提取文件.', + 'errArchive' : '无法创建压缩包.', + 'errArcType' : '不支持的压缩格式.', + 'errNoArchive' : '文件不是压缩包, 或者不支持该压缩格式.', + 'errCmdNoSupport' : '后端不支持该命令.', + 'errReplByChild' : '文件夹 “$1” 不能被它所包含的项目替换.', + 'errArcSymlinks' : '出于安全上的考虑,不允许解压包含符号链接的压缩包.', + 'errArcMaxSize' : '压缩包文件超过最大允许文件大小范围.', + 'errResize' : '无法重新调整大小 "$1".', + 'errUsupportType' : '不被支持的文件格式.', + 'errNotUTF8Content' : '文件 "$1" 不是 UTF-8 格式, 不能编辑.', // added 9.11.2011 + 'errNetMount' : '无法装载 "$1".', // added 17.04.2012 + 'errNetMountNoDriver' : '不支持该协议.', // added 17.04.2012 + 'errNetMountFailed' : '装载失败.', // added 17.04.2012 + 'errNetMountHostReq' : '需要指定主机.', // added 18.04.2012 + /******************************* commands names ********************************/ + 'cmdarchive' : '创建压缩包', + 'cmdback' : '后退', + 'cmdcopy' : '复制', + 'cmdcut' : '剪切', + 'cmddownload' : '下载', + 'cmdduplicate' : '创建复本', + 'cmdedit' : '编辑文件', + 'cmdextract' : '从压缩包提取文件', + 'cmdforward' : '前进', + 'cmdgetfile' : '选择文件', + 'cmdhelp' : '关于本软件', + 'cmdhome' : '首页', + 'cmdinfo' : '查看信息', + 'cmdmkdir' : '新建文件夹', + 'cmdmkfile' : '新建文本文件', + 'cmdopen' : '打开', + 'cmdpaste' : '粘贴', + 'cmdquicklook' : '预览', + 'cmdreload' : '刷新', + 'cmdrename' : '重命名', + 'cmdrm' : '删除', + 'cmdsearch' : '查找文件', + 'cmdup' : '转到上一级文件夹', + 'cmdupload' : '上传文件', + 'cmdview' : '查看', + 'cmdresize' : '重新调整大小', + 'cmdsort' : '排序', + 'cmdnetmount' : '装载网络卷', // added 18.04.2012 + + /*********************************** buttons ***********************************/ + 'btnClose' : '关闭', + 'btnSave' : '保存', + 'btnRm' : '删除', + 'btnApply' : '应用', + 'btnCancel' : '取消', + 'btnNo' : '否', + 'btnYes' : '是', + 'btnMount' : '装载', // added 18.04.2012 + /******************************** notifications ********************************/ + 'ntfopen' : '打开文件夹', + 'ntffile' : '打开文件', + 'ntfreload' : '刷新文件夹内容', + 'ntfmkdir' : '创建文件夹', + 'ntfmkfile' : '创建文件', + 'ntfrm' : '删除文件', + 'ntfcopy' : '复制文件', + 'ntfmove' : '移动文件', + 'ntfprepare' : '准备复制文件', + 'ntfrename' : '重命名文件', + 'ntfupload' : '上传文件', + 'ntfdownload' : '下载文件', + 'ntfsave' : '保存文件', + 'ntfarchive' : '创建压缩包', + 'ntfextract' : '从压缩包提取文件', + 'ntfsearch' : '搜索文件', + 'ntfresize' : '正在更改尺寸', + 'ntfsmth' : '正在忙 >_<', + 'ntfloadimg' : '正在加载图片', + 'ntfnetmount' : '正在装载网络卷', // added 18.04.2012 + + /************************************ dates **********************************/ + 'dateUnknown' : '未知', + 'Today' : '今天', + 'Yesterday' : '昨天', + 'Jan' : '一月', + 'Feb' : '二月', + 'Mar' : '三月', + 'Apr' : '四月', + 'May' : '五月', + 'Jun' : '六月', + 'Jul' : '七月', + 'Aug' : '八月', + 'Sep' : '九月', + 'Oct' : '十月', + 'Nov' : '十一月', + 'Dec' : '十二月', + 'January' : '一月', + 'February' : '二月', + 'March' : '三月', + 'April' : '四月', + 'May' : '五月', + 'June' : '六月', + 'July' : '七月', + 'August' : '八月', + 'September' : '九月', + 'October' : '十月', + 'November' : '十一月', + 'December' : '十二月', + 'Sunday' : '星期日', + 'Monday' : '星期一', + 'Tuesday' : '星期二', + 'Wednesday' : '星期三', + 'Thursday' : '星期四', + 'Friday' : '星期五', + 'Saturday' : '星期六', + 'Sun' : '周日', + 'Mon' : '周一', + 'Tue' : '周二', + 'Wed' : '周三', + 'Thu' : '周四', + 'Fri' : '周五', + 'Sat' : '周六', + /******************************** sort variants ********************************/ + 'sortnameDirsFirst' : '按名称 (文件夹在最前)', + 'sortkindDirsFirst' : '按类型 (文件夹在最前)', + 'sortsizeDirsFirst' : '按大小 (文件夹在最前)', + 'sortdateDirsFirst' : '按日期 (文件夹在最前)', + 'sortname' : '按名称', + 'sortkind' : '按类型', + 'sortsize' : '按大小', + 'sortdate' : '按日期', + + /********************************** messages **********************************/ + 'confirmReq' : '请确认', + 'confirmRm' : '确定要删除文件吗?
该操作不可撤销!', + 'confirmRepl' : '用新的文件替换原有文件?', + 'apllyAll' : '全部应用', + 'name' : '名称', + 'size' : '大小', + 'perms' : '权限', + 'modify' : '修改于', + 'kind' : '类别', + 'read' : '读取', + 'write' : '写入', + 'noaccess' : '无权限', + 'and' : '和', + 'unknown' : '未知', + 'selectall' : '选择所有文件', + 'selectfiles' : '选择文件', + 'selectffile' : '选择第一个文件', + 'selectlfile' : '选择最后一个文件', + 'viewlist' : '列表视图', + 'viewicons' : '图标视图', + 'places' : '位置', + 'calc' : '计算', + 'path' : '路径', + 'aliasfor' : '别名', + 'locked' : '锁定', + 'dim' : '尺寸', + 'files' : '文件', + 'folders' : '文件夹', + 'items' : '项目', + 'yes' : '是', + 'no' : '否', + 'link' : '链接', + 'searcresult' : '搜索结果', + 'selected' : '选中的项目', + 'about' : '关于', + 'shortcuts' : '快捷键', + 'help' : '帮助', + 'webfm' : '网络文件管理器', + 'ver' : '版本', + 'protocolver' : '协议版本', + 'homepage' : '项目主页', + 'docs' : '文档', + 'github' : 'Fork us on Github', + 'twitter' : 'Follow us on twitter', + 'facebook' : 'Join us on facebook', + 'team' : '团队', + 'chiefdev' : '首席开发', + 'developer' : '开发', + 'contributor' : '贡献', + 'maintainer' : '维护', + 'translator' : '翻译', + 'icons' : '图标', + 'dontforget' : '别忘了带上你擦汗的毛巾', + 'shortcutsof' : '快捷键已禁用', + 'dropFiles' : '把文件拖到这里', + 'or' : '或者', + 'selectForUpload' : '选择要上传的文件', + 'moveFiles' : '移动文件', + 'copyFiles' : '复制文件', + 'rmFromPlaces' : '从位置中删除', + 'untitled folder' : '未命名文件夹', + 'untitled file.txt' : '未命名文件.txt', + 'aspectRatio' : '保持比例', + 'scale' : '高宽比', + 'width' : '宽', + 'height' : '高', + 'mode' : '模式', + 'resize' : '重新调整大小', + 'crop' : '裁切', + 'rotate' : '旋转', + 'rotate-cw' : '顺时针旋转90度', + 'rotate-ccw' : '逆时针旋转90度', + 'degree' : '度', + 'port' : '端口', // added 18.04.2012 + 'user' : '用户', // added 18.04.2012 + 'pass' : '密码', // added 18.04.2012 + + /********************************** mimetypes **********************************/ + 'kindUnknown' : '未知', + 'kindFolder' : '文件夹', + 'kindAlias' : '别名', + 'kindAliasBroken' : '错误的别名', + // applications + 'kindApp' : '程序', + 'kindPostscript' : 'Postscript 文档', + 'kindMsOffice' : 'Microsoft Office 文档', + 'kindMsWord' : 'Microsoft Word 文档', + 'kindMsExcel' : 'Microsoft Excel 文档', + 'kindMsPP' : 'Microsoft Powerpoint 演示', + 'kindOO' : 'Open Office 文档', + 'kindAppFlash' : 'Flash 程序', + 'kindPDF' : 'Portable Document Format (PDF)', + 'kindTorrent' : 'Bittorrent 文件', + 'kind7z' : '7z 压缩包', + 'kindTAR' : 'TAR 压缩包', + 'kindGZIP' : 'GZIP 压缩包', + 'kindBZIP' : 'BZIP 压缩包', + 'kindZIP' : 'ZIP 压缩包', + 'kindRAR' : 'RAR 压缩包', + 'kindJAR' : 'Java JAR 文件', + 'kindTTF' : 'True Type 字体', + 'kindOTF' : 'Open Type 字体', + 'kindRPM' : 'RPM 包', + // texts + 'kindText' : '文本文件', + 'kindTextPlain' : '纯文本', + 'kindPHP' : 'PHP 源代码', + 'kindCSS' : '层叠样式表(CSS)', + 'kindHTML' : 'HTML 文档', + 'kindJS' : 'Javascript 源代码', + 'kindRTF' : '富文本格式(RTF)', + 'kindC' : 'C 源代码', + 'kindCHeader' : 'C 头文件', + 'kindCPP' : 'C++ 源代码', + 'kindCPPHeader' : 'C++ 头文件', + 'kindShell' : 'Unix 外壳脚本', + 'kindPython' : 'Python 源代码', + 'kindJava' : 'Java 源代码', + 'kindRuby' : 'Ruby 源代码', + 'kindPerl' : 'Perl 源代码', + 'kindSQL' : 'SQL 脚本', + 'kindXML' : 'XML 文档', + 'kindAWK' : 'AWK 源代码', + 'kindCSV' : '逗号分隔值文件(CSV)', + 'kindDOCBOOK' : 'Docbook XML 文档', + // images + 'kindImage' : '图片', + 'kindBMP' : 'BMP 图片', + 'kindJPEG' : 'JPEG 图片', + 'kindGIF' : 'GIF 图片', + 'kindPNG' : 'PNG 图片', + 'kindTIFF' : 'TIFF 图片', + 'kindTGA' : 'TGA 图片', + 'kindPSD' : 'Adobe Photoshop 图片', + 'kindXBITMAP' : 'X bitmap 图片', + 'kindPXM' : 'Pixelmator 图片', + // media + 'kindAudio' : '音频', + 'kindAudioMPEG' : 'MPEG 音频', + 'kindAudioMPEG4' : 'MPEG-4 音频', + 'kindAudioMIDI' : 'MIDI 音频', + 'kindAudioOGG' : 'Ogg Vorbis 音频', + 'kindAudioWAV' : 'WAV 音频', + 'AudioPlaylist' : 'MP3 播放列表', + 'kindVideo' : '视频', + 'kindVideoDV' : 'DV 视频', + 'kindVideoMPEG' : 'MPEG 视频', + 'kindVideoMPEG4' : 'MPEG-4 视频', + 'kindVideoAVI' : 'AVI 视频', + 'kindVideoMOV' : 'Quick Time 视频', + 'kindVideoWM' : 'Windows Media 视频', + 'kindVideoFlash' : 'Flash 视频', + 'kindVideoMKV' : 'Matroska 视频', + 'kindVideoOGG' : 'Ogg 视频' + } + } +} diff --git a/elFinder.Net.Web/Content/metro-bootstrap.min.css b/elFinder.Net.Web/Content/metro-bootstrap.min.css new file mode 100644 index 0000000..fb8cf9f --- /dev/null +++ b/elFinder.Net.Web/Content/metro-bootstrap.min.css @@ -0,0 +1 @@ +@font-face{font-family:"WeblySleek UI Light";src:url("/fonts/weblysleekuil.eot?") format("eot"),url("/fonts/weblysleekuil.woff") format("woff"),url("/fonts/weblysleekuil.ttf") format("truetype"),url("/fonts/weblysleekuil.svg#WeblySleekUILight") format("svg");font-weight:normal;font-style:normal}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"WeblySleek UI Light","Segoe UI","Segoe WP","Helvetica Neue",sans-serif;font-size:16px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:22px;margin-bottom:22px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"WeblySleek UI Light","Helvetica Neue","Segoe UI","Segoe WP",sans-serif;font-weight:100;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:22px;margin-bottom:11px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:11px;margin-bottom:11px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:41px}h2,.h2{font-size:34px}h3,.h3{font-size:28px}h4,.h4{font-size:20px}h5,.h5{font-size:16px}h6,.h6{font-size:14px}p{margin:0 0 11px}.lead{margin-bottom:22px;font-size:18px;font-weight:300;line-height:1.4}@media(min-width:768px){.lead{font-size:24px}}small,.small{font-size:87%}cite{font-style:normal}mark,.mark{background-color:#f1c40f;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#2ecc71}a.bg-success:hover{background-color:#25a25a}.bg-info{background-color:#3498db}a.bg-info:hover{background-color:#217dbb}.bg-warning{background-color:#f1c40f}a.bg-warning:hover{background-color:#c29d0b}.bg-danger{background-color:#e74c3c}a.bg-danger:hover{background-color:#d62c1a}.page-header{padding-bottom:10px;margin:44px 0 22px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:11px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:22px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:11px 22px;margin:0 0 22px;font-size:20px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'— '}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:' —'}blockquote:before,blockquote:after{content:""}address{margin-bottom:22px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:0;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:10.5px;margin:0 0 11px;font-size:15px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:22px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#2ecc71}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#29b765}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498db}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f1c40f}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#dab10d}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#e74c3c}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:16.5px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:22px;font-size:24px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:16px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:36px;padding:6px 12px;font-size:16px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:36px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:33px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:49px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:22px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:33px;padding:5px 10px;font-size:14px;line-height:1.5;border-radius:0}select.input-sm{height:33px;line-height:33px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:49px;padding:10px 16px;font-size:20px;line-height:1.33;border-radius:0}select.input-lg{height:49px;line-height:49px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:45px}.form-control-feedback{position:absolute;top:27px;right:0;z-index:2;display:block;width:36px;height:36px;line-height:36px;text-align:center}.input-lg+.form-control-feedback{width:49px;height:49px;line-height:49px}.input-sm+.form-control-feedback{width:33px;height:33px;line-height:33px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#2ecc71}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#f1c40f}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#e74c3c}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media(min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media(min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media(min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:16px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#2ecc71;border-color:#29b765}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#25a25a;border-color:#1e854a}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#2ecc71;border-color:#29b765}.btn-success .badge{color:#2ecc71;background-color:#fff}.btn-info{color:#fff;background-color:#3498db;border-color:#258cd1}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#217dbb;border-color:#1c699d}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#3498db;border-color:#258cd1}.btn-info .badge{color:#3498db;background-color:#fff}.btn-warning{color:#fff;background-color:#f1c40f;border-color:#dab10d}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#c29d0b;border-color:#a08209}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f1c40f;border-color:#dab10d}.btn-warning .badge{color:#f1c40f;background-color:#fff}.btn-danger{color:#fff;background-color:#e74c3c;border-color:#e43725}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#d62c1a;border-color:#b62516}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e74c3c;border-color:#e43725}.btn-danger .badge{color:#e74c3c;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:20px;line-height:1.33;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:14px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:14px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"*"}.glyphicon-plus:before{content:"+"}.glyphicon-euro:before{content:"€"}.glyphicon-minus:before{content:"−"}.glyphicon-cloud:before{content:"☁"}.glyphicon-envelope:before{content:"✉"}.glyphicon-pencil:before{content:"✏"}.glyphicon-glass:before{content:""}.glyphicon-music:before{content:""}.glyphicon-search:before{content:""}.glyphicon-heart:before{content:""}.glyphicon-star:before{content:""}.glyphicon-star-empty:before{content:""}.glyphicon-user:before{content:""}.glyphicon-film:before{content:""}.glyphicon-th-large:before{content:""}.glyphicon-th:before{content:""}.glyphicon-th-list:before{content:""}.glyphicon-ok:before{content:""}.glyphicon-remove:before{content:""}.glyphicon-zoom-in:before{content:""}.glyphicon-zoom-out:before{content:""}.glyphicon-off:before{content:""}.glyphicon-signal:before{content:""}.glyphicon-cog:before{content:""}.glyphicon-trash:before{content:""}.glyphicon-home:before{content:""}.glyphicon-file:before{content:""}.glyphicon-time:before{content:""}.glyphicon-road:before{content:""}.glyphicon-download-alt:before{content:""}.glyphicon-download:before{content:""}.glyphicon-upload:before{content:""}.glyphicon-inbox:before{content:""}.glyphicon-play-circle:before{content:""}.glyphicon-repeat:before{content:""}.glyphicon-refresh:before{content:""}.glyphicon-list-alt:before{content:""}.glyphicon-lock:before{content:""}.glyphicon-flag:before{content:""}.glyphicon-headphones:before{content:""}.glyphicon-volume-off:before{content:""}.glyphicon-volume-down:before{content:""}.glyphicon-volume-up:before{content:""}.glyphicon-qrcode:before{content:""}.glyphicon-barcode:before{content:""}.glyphicon-tag:before{content:""}.glyphicon-tags:before{content:""}.glyphicon-book:before{content:""}.glyphicon-bookmark:before{content:""}.glyphicon-print:before{content:""}.glyphicon-camera:before{content:""}.glyphicon-font:before{content:""}.glyphicon-bold:before{content:""}.glyphicon-italic:before{content:""}.glyphicon-text-height:before{content:""}.glyphicon-text-width:before{content:""}.glyphicon-align-left:before{content:""}.glyphicon-align-center:before{content:""}.glyphicon-align-right:before{content:""}.glyphicon-align-justify:before{content:""}.glyphicon-list:before{content:""}.glyphicon-indent-left:before{content:""}.glyphicon-indent-right:before{content:""}.glyphicon-facetime-video:before{content:""}.glyphicon-picture:before{content:""}.glyphicon-map-marker:before{content:""}.glyphicon-adjust:before{content:""}.glyphicon-tint:before{content:""}.glyphicon-edit:before{content:""}.glyphicon-share:before{content:""}.glyphicon-check:before{content:""}.glyphicon-move:before{content:""}.glyphicon-step-backward:before{content:""}.glyphicon-fast-backward:before{content:""}.glyphicon-backward:before{content:""}.glyphicon-play:before{content:""}.glyphicon-pause:before{content:""}.glyphicon-stop:before{content:""}.glyphicon-forward:before{content:""}.glyphicon-fast-forward:before{content:""}.glyphicon-step-forward:before{content:""}.glyphicon-eject:before{content:""}.glyphicon-chevron-left:before{content:""}.glyphicon-chevron-right:before{content:""}.glyphicon-plus-sign:before{content:""}.glyphicon-minus-sign:before{content:""}.glyphicon-remove-sign:before{content:""}.glyphicon-ok-sign:before{content:""}.glyphicon-question-sign:before{content:""}.glyphicon-info-sign:before{content:""}.glyphicon-screenshot:before{content:""}.glyphicon-remove-circle:before{content:""}.glyphicon-ok-circle:before{content:""}.glyphicon-ban-circle:before{content:""}.glyphicon-arrow-left:before{content:""}.glyphicon-arrow-right:before{content:""}.glyphicon-arrow-up:before{content:""}.glyphicon-arrow-down:before{content:""}.glyphicon-share-alt:before{content:""}.glyphicon-resize-full:before{content:""}.glyphicon-resize-small:before{content:""}.glyphicon-exclamation-sign:before{content:""}.glyphicon-gift:before{content:""}.glyphicon-leaf:before{content:""}.glyphicon-fire:before{content:""}.glyphicon-eye-open:before{content:""}.glyphicon-eye-close:before{content:""}.glyphicon-warning-sign:before{content:""}.glyphicon-plane:before{content:""}.glyphicon-calendar:before{content:""}.glyphicon-random:before{content:""}.glyphicon-comment:before{content:""}.glyphicon-magnet:before{content:""}.glyphicon-chevron-up:before{content:""}.glyphicon-chevron-down:before{content:""}.glyphicon-retweet:before{content:""}.glyphicon-shopping-cart:before{content:""}.glyphicon-folder-close:before{content:""}.glyphicon-folder-open:before{content:""}.glyphicon-resize-vertical:before{content:""}.glyphicon-resize-horizontal:before{content:""}.glyphicon-hdd:before{content:""}.glyphicon-bullhorn:before{content:""}.glyphicon-bell:before{content:""}.glyphicon-certificate:before{content:""}.glyphicon-thumbs-up:before{content:""}.glyphicon-thumbs-down:before{content:""}.glyphicon-hand-right:before{content:""}.glyphicon-hand-left:before{content:""}.glyphicon-hand-up:before{content:""}.glyphicon-hand-down:before{content:""}.glyphicon-circle-arrow-right:before{content:""}.glyphicon-circle-arrow-left:before{content:""}.glyphicon-circle-arrow-up:before{content:""}.glyphicon-circle-arrow-down:before{content:""}.glyphicon-globe:before{content:""}.glyphicon-wrench:before{content:""}.glyphicon-tasks:before{content:""}.glyphicon-filter:before{content:""}.glyphicon-briefcase:before{content:""}.glyphicon-fullscreen:before{content:""}.glyphicon-dashboard:before{content:""}.glyphicon-paperclip:before{content:""}.glyphicon-heart-empty:before{content:""}.glyphicon-link:before{content:""}.glyphicon-phone:before{content:""}.glyphicon-pushpin:before{content:""}.glyphicon-usd:before{content:""}.glyphicon-gbp:before{content:""}.glyphicon-sort:before{content:""}.glyphicon-sort-by-alphabet:before{content:""}.glyphicon-sort-by-alphabet-alt:before{content:""}.glyphicon-sort-by-order:before{content:""}.glyphicon-sort-by-order-alt:before{content:""}.glyphicon-sort-by-attributes:before{content:""}.glyphicon-sort-by-attributes-alt:before{content:""}.glyphicon-unchecked:before{content:""}.glyphicon-expand:before{content:""}.glyphicon-collapse-down:before{content:""}.glyphicon-collapse-up:before{content:""}.glyphicon-log-in:before{content:""}.glyphicon-flash:before{content:""}.glyphicon-log-out:before{content:""}.glyphicon-new-window:before{content:""}.glyphicon-record:before{content:""}.glyphicon-save:before{content:""}.glyphicon-open:before{content:""}.glyphicon-saved:before{content:""}.glyphicon-import:before{content:""}.glyphicon-export:before{content:""}.glyphicon-send:before{content:""}.glyphicon-floppy-disk:before{content:""}.glyphicon-floppy-saved:before{content:""}.glyphicon-floppy-remove:before{content:""}.glyphicon-floppy-save:before{content:""}.glyphicon-floppy-open:before{content:""}.glyphicon-credit-card:before{content:""}.glyphicon-transfer:before{content:""}.glyphicon-cutlery:before{content:""}.glyphicon-header:before{content:""}.glyphicon-compressed:before{content:""}.glyphicon-earphone:before{content:""}.glyphicon-phone-alt:before{content:""}.glyphicon-tower:before{content:""}.glyphicon-stats:before{content:""}.glyphicon-sd-video:before{content:""}.glyphicon-hd-video:before{content:""}.glyphicon-subtitles:before{content:""}.glyphicon-sound-stereo:before{content:""}.glyphicon-sound-dolby:before{content:""}.glyphicon-sound-5-1:before{content:""}.glyphicon-sound-6-1:before{content:""}.glyphicon-sound-7-1:before{content:""}.glyphicon-copyright-mark:before{content:""}.glyphicon-registration-mark:before{content:""}.glyphicon-cloud-download:before{content:""}.glyphicon-cloud-upload:before{content:""}.glyphicon-tree-conifer:before{content:""}.glyphicon-tree-deciduous:before{content:""}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:16px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:10px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:14px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:49px;padding:10px 16px;font-size:20px;line-height:1.33;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:49px;line-height:49px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:33px;padding:5px 10px;font-size:14px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:33px;line-height:33px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:16px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:14px;border-radius:0}.input-group-addon.input-lg{padding:10px 16px;font-size:20px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:10px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:22px;border:1px solid transparent}@media(min-width:768px){.navbar{border-radius:0}}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media(max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:14px 15px;font-size:20px;line-height:22px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:22px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:22px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:14px;padding-bottom:14px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:7px;margin-bottom:7px}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7px;margin-bottom:7px}.navbar-btn.btn-sm{margin-top:8.5px;margin-bottom:8.5px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:14px;margin-bottom:14px}@media(min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#2e8bcc;border-color:#2e8bcc}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#e6e6e6;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#2879b1}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#2879b1}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#2e8bcc}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#2879b1;color:#fff}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#2879b1}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#2879b1}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#fff}.navbar-default .btn-link{color:#fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#fff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#222}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#555}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#3498db}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#3498db;color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#222}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#222}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#555}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#3498db}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#fff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:22px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:22px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:20px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:14px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:22px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:0}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#2ecc71}.label-success[href]:hover,.label-success[href]:focus{background-color:#25a25a}.label-info{background-color:#3498db}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#f1c40f}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c29d0b}.label-danger{background-color:#e74c3c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:14px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:0}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:#eee;background-color:#333}.jumbotron h1,.jumbotron .h1{color:#f39c12}.jumbotron p{margin-bottom:15px;font-size:24px;font-weight:200}.jumbotron>hr{border-top-color:#1a1a1a}.container .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:72px}}.thumbnail{display:block;padding:4px;margin-bottom:22px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:22px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#2ecc71;border-color:#29b74e;color:#3c763d}.alert-success hr{border-top-color:#25a245}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#3498db;border-color:#23a1c8;color:#31708f}.alert-info hr{border-top-color:#2090b2}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#f1c40f;border-color:#da8f0d;color:#8a6d3b}.alert-warning hr{border-top-color:#c27f0b}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#e74c3c;border-color:#e42533;color:#a94442}.alert-danger hr{border-top-color:#d61a28}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:22px;margin-bottom:22px;background-color:#f5f5f5;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:14px;line-height:22px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#777;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#2ecc71}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#3498db}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f1c40f}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#e74c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#2ecc71}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#29b765}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#3498db}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#258cd1}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#f1c40f}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#dab10d}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#e74c3c}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#e43725}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:22px;background-color:#fff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:18px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:22px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#29b74e}.panel-success>.panel-heading{color:#3c763d;background-color:#2ecc71;border-color:#29b74e}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#29b74e}.panel-success>.panel-heading .badge{color:#2ecc71;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#29b74e}.panel-info{border-color:#23a1c8}.panel-info>.panel-heading{color:#31708f;background-color:#3498db;border-color:#23a1c8}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#23a1c8}.panel-info>.panel-heading .badge{color:#3498db;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#23a1c8}.panel-warning{border-color:#da8f0d}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#f1c40f;border-color:#da8f0d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#da8f0d}.panel-warning>.panel-heading .badge{color:#f1c40f;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#da8f0d}.panel-danger{border-color:#e42533}.panel-danger>.panel-heading{color:#a94442;background-color:#e74c3c;border-color:#e42533}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e42533}.panel-danger>.panel-heading .badge{color:#e74c3c;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e42533}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:24px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media(min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:14px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:16px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:-1px -1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'‹'}.carousel-control .icon-next:before{content:'›'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width;}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media(max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media(max-width:767px){.visible-xs-block{display:block !important}}@media(max-width:767px){.visible-xs-inline{display:inline !important}}@media(max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media(min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media(min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media(min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media(min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media(min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media(min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media(min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media(min-width:1200px){.visible-lg-block{display:block !important}}@media(min-width:1200px){.visible-lg-inline{display:inline !important}}@media(min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media(max-width:767px){.hidden-xs{display:none !important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media(min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.tile{display:block;cursor:pointer;-webkit-perspective:0;-webkit-transform-style:preserve-3d;-webkit-transition:-webkit-transform .2s;float:left;min-width:75px;min-height:75px;text-align:center;opacity:.75;background-color:#2e8bcc;z-index:1;border:4px #fff solid;color:#fff}.tile h1,.tile h2,.tile h3,.tile h4,.tile h5,.tile h6{color:#fff;-webkit-user-select:none}.tile h2{margin-top:-20px;margin-left:0}.tile h3,.tile h4{margin-top:-15px}.tile h1.tile-text,.tile h2.tile-text,.tile h3.tile-text,.tile h4.tile-text{margin-top:20px}.tile h1{font-size:41px}.tile h2{font-size:34px}.tile h3{font-size:28px}.tile h4{font-size:20px}.tile a:hover{text-decoration:none}.tile img{border:0}.tile:hover{opacity:1}.tile .tile-label{position:absolute;bottom:10px;left:20px;font-size:14px;color:#fff}.tile .tile-content .tile-icon-large{margin-left:0;vertical-align:middle !important;text-align:center}.tile .tile-content{padding-top:20px;line-height:normal;position:relative;width:100%;-moz-box-sizing:border-box;box-sizing:border-box}.tile.tile-blue{background-color:#2e8bcc}.tile.tile-green{background-color:#393}.tile.tile-red{background-color:#e51400}.tile.tile-yellow{background-color:#ffc40d}.tile.tile-orange{background-color:#f39c12}.tile.tile-pink{background-color:#e671b8}.tile.tile-purple{background-color:#7b4f9d}.tile.tile-lime{background-color:#8cbf26}.tile.tile-magenta{background-color:#ff0097}.tile.tile-teal{background-color:#00aba9}.tile.tile-turquoise{background-color:#1abc9c}.tile.tile-green-sea{background-color:#16a085}.tile.tile-emerald{background-color:#2ecc71}.tile.tile-nephritis{background-color:#27ae60}.tile.tile-peter-river{background-color:#3498db}.tile.tile-belize-hole{background-color:#2980b9}.tile.tile-amethyst{background-color:#9b59b6}.tile.tile-wisteria{background-color:#8e44ad}.tile.tile-wet-asphalt{background-color:#34495e}.tile.tile-midnight-blue{background-color:#2c3e50}.tile.tile-sun-flower{background-color:#f1c40f}.tile.tile-carrot{background-color:#e67e22}.tile.tile-pumpkin{background-color:#d35400}.tile.tile-alizarin{background-color:#e74c3c}.tile.tile-pomegranate{background-color:#c0392b}.tile.tile-clouds{background-color:#ecf0f1;color:#34495e}.tile.tile-clouds h1,.tile.tile-clouds h2,.tile.tile-clouds h3,.tile.tile-clouds h4,.tile.tile-clouds h5,.tile.tile-clouds h6{color:#34495e}.tile.tile-clouds .tile-label{color:#34495e}.tile.tile-silver{background-color:#bdc3c7}.tile.tile-concrete{background-color:#95a5a6}.tile.tile-asbestos{background-color:#7f8c8d}.tile.tile-info{background-color:#3498db}.tile.tile-danger{background-color:#e74c3c}.tile.tile-warning{background-color:#f1c40f}.tile.tile-success{background-color:#2ecc71}a.fa-links{color:#fff}a.fa-links:hover,a.fa-links:focus{color:#fff}.tile.tile-small{height:70px;width:70px}.tile.tile-medium{height:150px;width:150px}.tile.tile-wide,.tile.tile-double{height:150px;width:310px}.tile.tile-large{height:310px;width:310px}.alert{border:none;color:#fff}.alert .alert-link{color:#fff;font-weight:bold;font-variant:small-caps}.alert-success{background-color:#2ecc71}.alert-info{background-color:#428bca}.alert-warning{background-color:#f1c40f}.alert-danger{background-color:#e74c3c}.checkbox{display:inline-block;margin-right:10px;margin-bottom:10px;cursor:pointer}.checkbox>input[type=checkbox]{position:absolute;opacity:0}.checkbox .checkbox-label{padding-left:28px;position:relative}.checkbox .checkbox-label:before{position:absolute;display:block;height:24px;width:24px;content:"";text-indent:-9999px;border:2px #d9d9d9 solid;z-index:1;opacity:1;top:0;left:0}.checkbox input[type="checkbox"]:checked~.checkbox-label:after{position:absolute;display:block;content:"";font-size:10pt;height:14px;width:14px;line-height:14px;z-index:2;top:50%;margin-top:-6px;left:0;margin-left:4px;font-family:FontAwesome}.radio{display:inline-block;margin-right:10px;margin-bottom:10px;cursor:pointer}.radio>input[type=radio]{position:absolute;opacity:0}.radio .radio-label{padding-left:28px;position:relative}.radio .radio-label:before{position:absolute;display:block;height:24px;width:24px;content:"";text-indent:-9999px;border:2px #d9d9d9 solid;z-index:1;opacity:1;top:0;left:0;border-radius:100%}.radio input[type="radio"]:checked~.radio-label:after{position:absolute;display:block;content:"";color:#1a1a1a;z-index:2;font-size:16px;font-weight:bold;left:10px;margin-left:-3px;top:60%;margin-top:-4px;background-color:#1a1a1a;width:10px;height:10px;border-radius:100%}.label{border-radius:0}.label-default{border-radius:0}.label-primary{border-radius:0}.label-success{border-radius:0}.label-info{border-radius:0}.label-warning{border-radius:0}.label-danger{border-radius:0}.modal-dialog{margin-left:auto;margin-right:auto}@media(min-width:768px){.navbar-side{width:225px;margin-left:-225px;left:225px;position:fixed;height:100%;z-index:1000}.navbar-side .navbar-header{float:none;padding-top:15px}.navbar-side .navbar-nav{float:none}.navbar-side .navbar-collapse{padding-right:0;padding-left:0;padding-top:30px;margin-bottom:50px}.navbar-side .navbar-nav>li{float:none}.navbar-side .navbar-nav>li>a{display:inline-block;width:100%;padding-left:25px}.navbar-side .navbar-nav>li>a:hover{background:rgba(85,85,85,.5)}.navbar-side.navbar-side-closed{width:85px;margin-left:-85px;left:85px}.navbar-side.navbar-side-closed .navbar-nav .fa{font-size:2em}.navbar-side.navbar-side-closed .navbar-nav span{font-size:12px}.navbar-side.navbar-side-closed .navbar-nav>li>a{padding-left:0;padding-right:0;text-align:center}.navbar-side.navbar-side-closed .navbar-nav>li>a>span{display:list-item}}.navbar-side-options{padding-left:0;padding-right:0;padding-top:40px;width:100%;text-align:center}@media(max-width:768px){.navbar-side-options{display:none}}img.right{border:1px solid #ccc;float:right;margin-left:15px;padding:5px}img.left{border:1px solid #ccc;float:left;margin-right:15px;padding:5px}.navbar-brand{padding:8px 15px}.navbar-brand img{margin-top:-4px}.jumbotron h1,.jumbotron .h1,.jumbotron h2,.jumbotron .h2{margin-top:0}.jumbotron h2,.jumbotron .h2{font-size:56px;color:#f39c12}pre.prettyprint{-mo-word-break:normal;-mo-word-wrap:normal;word-break:normal;word-wrap:normal}small,.small{font-size:80%}.navbar ul li a i{margin-right:5px} \ No newline at end of file diff --git a/elFinder.Net.Web/Controllers/HomeController.cs b/elFinder.Net.Web/Controllers/HomeController.cs index 7625338..dcafab0 100644 --- a/elFinder.Net.Web/Controllers/HomeController.cs +++ b/elFinder.Net.Web/Controllers/HomeController.cs @@ -11,7 +11,7 @@ public partial class HomeController : Controller [GET("")] public virtual ActionResult Index() { - DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/Files/MyFolder")); + var di = new DirectoryInfo(Server.MapPath("~/Files/MyFolder")); // Enumerating all 1st level directories of a given root folder (MyFolder in this case) and retrieving the folders names. var folders = di.GetDirectories().ToList().Select(d => d.Name); @@ -21,9 +21,40 @@ public virtual ActionResult Index() [GET("FileManager/{subFolder?}")] public virtual ActionResult Files(string subFolder) { // FileViewModel contains the root MyFolder and the selected subfolder if any - FileViewModel model = new FileViewModel() { Folder = "MyFolder", SubFolder = subFolder }; + var model = new FileViewModel { Folder = "MyFolder", SubFolder = subFolder }; return View(model); } + + public ActionResult TinyMceFiles(string subFolder) + { + var model = new FileViewModel { Folder = "MyFolder", SubFolder = subFolder }; + return View(model); + } + + public ActionResult CkEditorFiles(string subFolder) + { + var model = new FileViewModel { Folder = "MyFolder", SubFolder = subFolder }; + return View(model); + } + + public ActionResult StandAloneFile(string subFolder) + { + var model = new FileViewModel { Folder = "MyFolder", SubFolder = subFolder }; + return View(model); + } + + #region File dialog + public ActionResult FileBrowser(string subFolder, string caller, string langCode, string type, string fn, string CKEditorFuncNum) + { + ViewBag.Caller = caller; + ViewBag.LangCode = langCode; + ViewBag.Type = type; + ViewBag.Callbackfn = fn; + ViewBag.CKEditorFuncNum = CKEditorFuncNum; + var model = new FileViewModel { Folder = "MyFolder", SubFolder = subFolder }; + return View(model); + } + #endregion } } diff --git a/elFinder.Net.Web/T4MVC.cs b/elFinder.Net.Web/T4MVC.cs deleted file mode 100644 index 082b746..0000000 --- a/elFinder.Net.Web/T4MVC.cs +++ /dev/null @@ -1,253 +0,0 @@ -// -// This file was generated by a T4 template. -// Don't change it directly as your change would get overwritten. Instead, make changes -// to the .tt file (i.e. the T4 template) and save it to regenerate this file. - -// Make sure the compiler doesn't complain about missing Xml comments -#pragma warning disable 1591 -#region T4MVC - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Web; -using System.Web.Mvc; -using System.Web.Routing; - -[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] -public static class MVC -{ - public static elFinder.Net.Web.Controllers.FileController File = new elFinder.Net.Web.Controllers.T4MVC_FileController(); - public static elFinder.Net.Web.Controllers.HomeController Home = new elFinder.Net.Web.Controllers.T4MVC_HomeController(); - public static T4MVC.SharedController Shared = new T4MVC.SharedController(); -} - -namespace T4MVC -{ -} - -namespace T4MVC -{ - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public class Dummy - { - private Dummy() { } - public static Dummy Instance = new Dummy(); - } -} - -[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] -internal class T4MVC_System_Web_Mvc_ActionResult : System.Web.Mvc.ActionResult, IT4MVCActionResult -{ - public T4MVC_System_Web_Mvc_ActionResult(string area, string controller, string action, string protocol = null): base() - { - this.InitMVCT4Result(area, controller, action, protocol); - } - - public override void ExecuteResult(System.Web.Mvc.ControllerContext context) { } - - public string Controller { get; set; } - public string Action { get; set; } - public string Protocol { get; set; } - public RouteValueDictionary RouteValueDictionary { get; set; } -} - - - -namespace Links -{ - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class Scripts { - private const string URLPATH = "~/Scripts"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - public static readonly string _references_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/_references.min.js") ? Url("_references.min.js") : Url("_references.js"); - - public static readonly string jquery_1_8_2_intellisense_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery-1.8.2.intellisense.min.js") ? Url("jquery-1.8.2.intellisense.min.js") : Url("jquery-1.8.2.intellisense.js"); - - public static readonly string jquery_1_8_2_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery-1.8.2.min.js") ? Url("jquery-1.8.2.min.js") : Url("jquery-1.8.2.js"); - - public static readonly string jquery_1_8_2_min_js = Url("jquery-1.8.2.min.js"); - public static readonly string jquery_ui_1_10_2_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery-ui-1.10.2.min.js") ? Url("jquery-ui-1.10.2.min.js") : Url("jquery-ui-1.10.2.js"); - - public static readonly string jquery_ui_1_10_2_min_js = Url("jquery-ui-1.10.2.min.js"); - public static readonly string jquery_unobtrusive_ajax_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.unobtrusive-ajax.min.js") ? Url("jquery.unobtrusive-ajax.min.js") : Url("jquery.unobtrusive-ajax.js"); - - public static readonly string jquery_unobtrusive_ajax_min_js = Url("jquery.unobtrusive-ajax.min.js"); - public static readonly string jquery_validate_vsdoc_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.validate-vsdoc.min.js") ? Url("jquery.validate-vsdoc.min.js") : Url("jquery.validate-vsdoc.js"); - - public static readonly string jquery_validate_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.validate.min.js") ? Url("jquery.validate.min.js") : Url("jquery.validate.js"); - - public static readonly string jquery_validate_min_js = Url("jquery.validate.min.js"); - public static readonly string jquery_validate_unobtrusive_js = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.validate.unobtrusive.min.js") ? Url("jquery.validate.unobtrusive.min.js") : Url("jquery.validate.unobtrusive.js"); - - public static readonly string jquery_validate_unobtrusive_min_js = Url("jquery.validate.unobtrusive.min.js"); - } - - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class Content { - private const string URLPATH = "~/Content"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - public static readonly string Site_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/Site.min.css") ? Url("Site.min.css") : Url("Site.css"); - - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class themes { - private const string URLPATH = "~/Content/themes"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class @base { - private const string URLPATH = "~/Content/themes/base"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class images { - private const string URLPATH = "~/Content/themes/base/images"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - public static readonly string animated_overlay_gif = Url("animated-overlay.gif"); - public static readonly string ui_bg_flat_0_aaaaaa_40x100_png = Url("ui-bg_flat_0_aaaaaa_40x100.png"); - public static readonly string ui_bg_flat_75_ffffff_40x100_png = Url("ui-bg_flat_75_ffffff_40x100.png"); - public static readonly string ui_bg_glass_55_fbf9ee_1x400_png = Url("ui-bg_glass_55_fbf9ee_1x400.png"); - public static readonly string ui_bg_glass_65_ffffff_1x400_png = Url("ui-bg_glass_65_ffffff_1x400.png"); - public static readonly string ui_bg_glass_75_dadada_1x400_png = Url("ui-bg_glass_75_dadada_1x400.png"); - public static readonly string ui_bg_glass_75_e6e6e6_1x400_png = Url("ui-bg_glass_75_e6e6e6_1x400.png"); - public static readonly string ui_bg_glass_95_fef1ec_1x400_png = Url("ui-bg_glass_95_fef1ec_1x400.png"); - public static readonly string ui_bg_highlight_soft_75_cccccc_1x100_png = Url("ui-bg_highlight-soft_75_cccccc_1x100.png"); - public static readonly string ui_icons_222222_256x240_png = Url("ui-icons_222222_256x240.png"); - public static readonly string ui_icons_2e83ff_256x240_png = Url("ui-icons_2e83ff_256x240.png"); - public static readonly string ui_icons_454545_256x240_png = Url("ui-icons_454545_256x240.png"); - public static readonly string ui_icons_888888_256x240_png = Url("ui-icons_888888_256x240.png"); - public static readonly string ui_icons_cd0a0a_256x240_png = Url("ui-icons_cd0a0a_256x240.png"); - } - - public static readonly string jquery_ui_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery-ui.min.css") ? Url("jquery-ui.min.css") : Url("jquery-ui.css"); - - public static readonly string jquery_ui_accordion_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.accordion.min.css") ? Url("jquery.ui.accordion.min.css") : Url("jquery.ui.accordion.css"); - - public static readonly string jquery_ui_all_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.all.min.css") ? Url("jquery.ui.all.min.css") : Url("jquery.ui.all.css"); - - public static readonly string jquery_ui_autocomplete_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.autocomplete.min.css") ? Url("jquery.ui.autocomplete.min.css") : Url("jquery.ui.autocomplete.css"); - - public static readonly string jquery_ui_base_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.base.min.css") ? Url("jquery.ui.base.min.css") : Url("jquery.ui.base.css"); - - public static readonly string jquery_ui_button_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.button.min.css") ? Url("jquery.ui.button.min.css") : Url("jquery.ui.button.css"); - - public static readonly string jquery_ui_core_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.core.min.css") ? Url("jquery.ui.core.min.css") : Url("jquery.ui.core.css"); - - public static readonly string jquery_ui_datepicker_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.datepicker.min.css") ? Url("jquery.ui.datepicker.min.css") : Url("jquery.ui.datepicker.css"); - - public static readonly string jquery_ui_dialog_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.dialog.min.css") ? Url("jquery.ui.dialog.min.css") : Url("jquery.ui.dialog.css"); - - public static readonly string jquery_ui_menu_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.menu.min.css") ? Url("jquery.ui.menu.min.css") : Url("jquery.ui.menu.css"); - - public static readonly string jquery_ui_progressbar_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.progressbar.min.css") ? Url("jquery.ui.progressbar.min.css") : Url("jquery.ui.progressbar.css"); - - public static readonly string jquery_ui_resizable_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.resizable.min.css") ? Url("jquery.ui.resizable.min.css") : Url("jquery.ui.resizable.css"); - - public static readonly string jquery_ui_selectable_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.selectable.min.css") ? Url("jquery.ui.selectable.min.css") : Url("jquery.ui.selectable.css"); - - public static readonly string jquery_ui_slider_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.slider.min.css") ? Url("jquery.ui.slider.min.css") : Url("jquery.ui.slider.css"); - - public static readonly string jquery_ui_spinner_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.spinner.min.css") ? Url("jquery.ui.spinner.min.css") : Url("jquery.ui.spinner.css"); - - public static readonly string jquery_ui_tabs_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.tabs.min.css") ? Url("jquery.ui.tabs.min.css") : Url("jquery.ui.tabs.css"); - - public static readonly string jquery_ui_theme_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.theme.min.css") ? Url("jquery.ui.theme.min.css") : Url("jquery.ui.theme.css"); - - public static readonly string jquery_ui_tooltip_css = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/jquery.ui.tooltip.min.css") ? Url("jquery.ui.tooltip.min.css") : Url("jquery.ui.tooltip.css"); - - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class minified { - private const string URLPATH = "~/Content/themes/base/minified"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static class images { - private const string URLPATH = "~/Content/themes/base/minified/images"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } - public static readonly string animated_overlay_gif = Url("animated-overlay.gif"); - public static readonly string ui_bg_flat_0_aaaaaa_40x100_png = Url("ui-bg_flat_0_aaaaaa_40x100.png"); - public static readonly string ui_bg_flat_75_ffffff_40x100_png = Url("ui-bg_flat_75_ffffff_40x100.png"); - public static readonly string ui_bg_glass_55_fbf9ee_1x400_png = Url("ui-bg_glass_55_fbf9ee_1x400.png"); - public static readonly string ui_bg_glass_65_ffffff_1x400_png = Url("ui-bg_glass_65_ffffff_1x400.png"); - public static readonly string ui_bg_glass_75_dadada_1x400_png = Url("ui-bg_glass_75_dadada_1x400.png"); - public static readonly string ui_bg_glass_75_e6e6e6_1x400_png = Url("ui-bg_glass_75_e6e6e6_1x400.png"); - public static readonly string ui_bg_glass_95_fef1ec_1x400_png = Url("ui-bg_glass_95_fef1ec_1x400.png"); - public static readonly string ui_bg_highlight_soft_75_cccccc_1x100_png = Url("ui-bg_highlight-soft_75_cccccc_1x100.png"); - public static readonly string ui_icons_222222_256x240_png = Url("ui-icons_222222_256x240.png"); - public static readonly string ui_icons_2e83ff_256x240_png = Url("ui-icons_2e83ff_256x240.png"); - public static readonly string ui_icons_454545_256x240_png = Url("ui-icons_454545_256x240.png"); - public static readonly string ui_icons_888888_256x240_png = Url("ui-icons_888888_256x240.png"); - public static readonly string ui_icons_cd0a0a_256x240_png = Url("ui-icons_cd0a0a_256x240.png"); - } - - public static readonly string jquery_ui_min_css = Url("jquery-ui.min.css"); - public static readonly string jquery_ui_accordion_min_css = Url("jquery.ui.accordion.min.css"); - public static readonly string jquery_ui_autocomplete_min_css = Url("jquery.ui.autocomplete.min.css"); - public static readonly string jquery_ui_button_min_css = Url("jquery.ui.button.min.css"); - public static readonly string jquery_ui_core_min_css = Url("jquery.ui.core.min.css"); - public static readonly string jquery_ui_datepicker_min_css = Url("jquery.ui.datepicker.min.css"); - public static readonly string jquery_ui_dialog_min_css = Url("jquery.ui.dialog.min.css"); - public static readonly string jquery_ui_menu_min_css = Url("jquery.ui.menu.min.css"); - public static readonly string jquery_ui_progressbar_min_css = Url("jquery.ui.progressbar.min.css"); - public static readonly string jquery_ui_resizable_min_css = Url("jquery.ui.resizable.min.css"); - public static readonly string jquery_ui_selectable_min_css = Url("jquery.ui.selectable.min.css"); - public static readonly string jquery_ui_slider_min_css = Url("jquery.ui.slider.min.css"); - public static readonly string jquery_ui_spinner_min_css = Url("jquery.ui.spinner.min.css"); - public static readonly string jquery_ui_tabs_min_css = Url("jquery.ui.tabs.min.css"); - public static readonly string jquery_ui_theme_min_css = Url("jquery.ui.theme.min.css"); - public static readonly string jquery_ui_tooltip_min_css = Url("jquery.ui.tooltip.min.css"); - } - - } - - } - - } - - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static partial class Bundles - { - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static partial class Scripts {} - [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] - public static partial class Styles {} - } -} - -[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] -internal static class T4MVCHelpers { - // You can change the ProcessVirtualPath method to modify the path that gets returned to the client. - // e.g. you can prepend a domain, or append a query string: - // return "http://localhost" + path + "?foo=bar"; - private static string ProcessVirtualPathDefault(string virtualPath) { - // The path that comes in starts with ~/ and must first be made absolute - string path = VirtualPathUtility.ToAbsolute(virtualPath); - - // Add your own modifications here before returning the path - return path; - } - - // Calling ProcessVirtualPath through delegate to allow it to be replaced for unit testing - public static Func ProcessVirtualPath = ProcessVirtualPathDefault; - - // Calling T4Extension.TimestampString through delegate to allow it to be replaced for unit testing and other purposes - public static Func TimestampString = System.Web.Mvc.T4Extensions.TimestampString; - - // Logic to determine if the app is running in production or dev environment - public static bool IsProduction() { - return (HttpContext.Current != null && !HttpContext.Current.IsDebuggingEnabled); - } -} - - - - - -#endregion T4MVC -#pragma warning restore 1591 - - diff --git a/elFinder.Net.Web/T4MVC.tt b/elFinder.Net.Web/T4MVC.tt deleted file mode 100644 index 33a9c03..0000000 --- a/elFinder.Net.Web/T4MVC.tt +++ /dev/null @@ -1,2375 +0,0 @@ -<# -/* -T4MVC Version 3.6.0 -Find latest version and documentation at http://mvccontrib.codeplex.com/wikipage?title=T4MVC -Discuss on StackOverflow or on Codeplex (https://t4mvc.codeplex.com/discussions) - -T4MVC is part of the MvcContrib project, but in a different Codeplex location (http://t4mvc.codeplex.com) -Maintained by David Ebbo, with much feedback from the MVC community (thanks all!) -david.ebbo@microsoft.com -http://twitter.com/davidebbo -http://blog.davidebbo.com/ (previously: http://blogs.msdn.com/davidebb) - -Related blog posts: http://blogs.msdn.com/davidebb/archive/tags/T4MVC/default.aspx - -Please use in accordance to the MvcContrib license (http://mvccontrib.codeplex.com/license) -*/ -#> -<#@ template language="C#" debug="true" hostspecific="true" #> -<#@ assembly name="System.Core" #> -<#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #> -<#@ assembly name="EnvDTE" #> -<#@ assembly name="EnvDTE80" #> -<#@ assembly name="VSLangProj" #> -<#@ assembly name="System.Xml" #> -<#@ assembly name="System.Xml.Linq" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Text.RegularExpressions" #> -<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #> -<#@ import namespace="EnvDTE" #> -<#@ import namespace="EnvDTE80" #> -<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> -<# // To debug, uncomment the next two lines !! -// System.Diagnostics.Debugger.Launch(); -// System.Diagnostics.Debugger.Break(); -#> -<#settings=MvcSettings.Load(Host);#> -<#PrepareDataToRender(this); #> -<#var manager = Manager.Create(Host, GenerationEnvironment); #> -<#manager.StartHeader(); #>// -// This file was generated by a T4 template. -// Don't change it directly as your change would get overwritten. Instead, make changes -// to the .tt file (i.e. the T4 template) and save it to regenerate this file. - -// Make sure the compiler doesn't complain about missing Xml comments -#pragma warning disable 1591 -#region T4MVC - -using System; -using System.Diagnostics; -using System.CodeDom.Compiler; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Web; -using System.Web.Hosting; -using System.Web.Mvc; -using System.Web.Mvc.Ajax; -using System.Web.Mvc.Html; -using System.Web.Routing; -using <#=settings.T4MVCNamespace #>; -<#foreach (var referencedNamespace in settings.ReferencedNamespaces) { #> -using <#=referencedNamespace #>; -<#} #> -<#manager.EndBlock(); #> - -[<#= GeneratedCode #>, DebuggerNonUserCode] -public static class <#=settings.HelpersPrefix #> -{ -<#if (settings.IncludeAreasToken) { #> -public static class Areas -{ -<#} #> -<#foreach (var area in Areas.Where(a => !string.IsNullOrEmpty(a.Name))) { #> - static readonly <#=area.Name #>Class s_<#=area.Name #> = new <#=area.Name #>Class(); - public static <#=area.Name #>Class <#=EscapeID(area.Namespace) #> { get { return s_<#=area.Name #>; } } -<#} #> -<#if (settings.IncludeAreasToken) { #> -} -<#} #> -<#foreach (var controller in DefaultArea.GetControllers()) { #> - public static <#=controller.FullClassName #> <#=controller.Name #> = new <#=controller.FullDerivedClassName #>(); -<#} #> -} - -namespace <#=settings.T4MVCNamespace #> -{ -<#foreach (var area in Areas.Where(a => !string.IsNullOrEmpty(a.Name))) { #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class <#=area.Name #>Class - { - public readonly string Name = "<#=ProcessAreaOrControllerName(area.Name) #>"; -<#foreach (var controller in area.GetControllers()) { #> - public <#=controller.FullClassName #> <#=controller.Name #> = new <#=controller.FullDerivedClassName #>(); -<#} #> - } -<#} #> -} - -namespace <#=settings.T4MVCNamespace #> -{ - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class Dummy - { - private Dummy() { } - public static Dummy Instance = new Dummy(); - } -} - -<#foreach (var resultType in ResultTypes.Values) { #> -[<#= GeneratedCode #>, DebuggerNonUserCode] -internal class T4MVC_<#=resultType.UniqueName #> : <#=resultType.FullName #>, IT4MVCActionResult -{ - public T4MVC_<#=resultType.UniqueName #>(string area, string controller, string action, string protocol = null): base(<#resultType.Constructor.WriteNonEmptyParameterValues(true); #>) - { - this.InitMVCT4Result(area, controller, action, protocol); - } - <#foreach (var method in resultType.AbstractMethods) { #> - <#=method.IsPublic ? "public" : "protected" #> override void <#=method.Name #>(<#method.WriteFormalParameters(true); #>) { } - <#} #> - - public string Controller { get; set; } - public string Action { get; set; } - public string Protocol { get; set; } - public RouteValueDictionary RouteValueDictionary { get; set; } -} -<#} #> - - - -namespace <#=settings.LinksNamespace #> -{ -<# -foreach (string folder in settings.StaticFilesFolders) { - ProcessStaticFiles(Project, folder); -} -#> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public static partial class Bundles - { - [<#= GeneratedCode #>, DebuggerNonUserCode] - public static partial class Scripts {} - [<#= GeneratedCode #>, DebuggerNonUserCode] - public static partial class Styles {} - } -} - -<# -RenderAdditionalCode(); -#> -<#foreach (var controller in GetAbstractControllers().Where(c => !c.HasDefaultConstructor)) { #> -<#manager.StartNewFile(controller.GeneratedFileName); #> -namespace <#=controller.Namespace #> -{ - [<#= GeneratedCode #>, DebuggerNonUserCode] - public partial class <#=controller.ClassName #> - { - protected <#=controller.ClassName #>() { } - } -} -<#manager.EndBlock(); #> -<#} #> - -<#foreach (var controller in GetControllers()) { #> -<# - // Don't generate the file at all if the existing one is up to date - // NOTE: disable this optimization since it doesn't catch view changes! It can be re-enabled later if smarter change detection is added - //if (controller.GeneratedCodeIsUpToDate) { - // manager.KeepGeneratedFile(controller.GeneratedFileName); - // continue; - //} -#> -<#manager.StartNewFile(controller.GeneratedFileName); #> -<#if (!String.IsNullOrEmpty(controller.Namespace)) { #> -namespace <#=controller.Namespace #> -{ -<#} #> - public <#if (!controller.NotRealController) { #>partial <#} #>class <#=controller.ClassName #> - { -<#if (!controller.NotRealController) { #> -<#if (!controller.HasExplicitConstructor) { #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public <#=controller.ClassName #>() { } - -<#} #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - protected <#=controller.ClassName #>(Dummy d) { } - - [<#= GeneratedCode #>, DebuggerNonUserCode] - protected RedirectToRouteResult RedirectToAction(ActionResult result) - { - var callInfo = result.GetT4MVCResult(); - return RedirectToRoute(callInfo.RouteValueDictionary); - } - - [<#= GeneratedCode #>, DebuggerNonUserCode] - protected RedirectToRouteResult RedirectToActionPermanent(ActionResult result) - { - var callInfo = result.GetT4MVCResult(); - return RedirectToRoutePermanent(callInfo.RouteValueDictionary); - } - -<#foreach (var method in controller.ActionMethodsUniqueWithoutParameterlessOverload) { #> - [NonAction] - [<#= GeneratedCode #>, DebuggerNonUserCode] - public virtual <#=method.ReturnTypeFullName #> <#=method.Name #>() - { -<#if (method.ReturnTypeFullName == "System.Threading.Tasks.Task") { #> - var callInfo = new T4MVC_<#=method.ReturnTypeUniqueName #>(Area, Name, ActionNames.<#=method.ActionName #><# if (method.ActionUrlHttps) {#>, "https"<#}#>); - return System.Threading.Tasks.Task.FromResult(callInfo as ActionResult); -<#} else { #> - return new T4MVC_<#=method.ReturnTypeUniqueName #>(Area, Name, ActionNames.<#=method.ActionName #><# if (method.ActionUrlHttps) {#>, "https"<#}#>); -<#} #> - } -<#} #> -<#foreach (var method in controller.CustomActionMethodsUniqueWithoutParameterlessOverload) { #> - [NonAction] - [<#= GeneratedCode #>, DebuggerNonUserCode] - public virtual <#=method.ReturnTypeFullName #> <#=method.ActionName #>() - { - return new T4MVC_<#=method.ReturnTypeUniqueName #>(Area, Name, ActionNames.<#=method.ActionName #><# if (method.ActionUrlHttps) {#>, "https"<#}#>); - } -<#} #> -<#foreach (var method in controller.CustomActionMethods) { #> - [NonAction] - [<#= GeneratedCode #>, DebuggerNonUserCode] - public virtual <#=method.ReturnTypeFullName #> <#=method.ActionName #>(<#method.WriteFormalParameters(true, true); #>) - { - var callInfo = new T4MVC_<#=method.ReturnTypeUniqueName #>(Area, Name, ActionNames.<#=method.ActionName #><# if (method.ActionUrlHttps) {#>, "https"<#}#>); -<#if (method.Parameters.Count > 0) { #> -<#foreach (var p in method.Parameters) { #> - ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, <#=p.RouteNameExpression #>, <#=p.Name #>); -<#} #> -<#}#> -<#if (method.ReturnTypeFullName == "System.Threading.Tasks.Task") { #> - return System.Threading.Tasks.Task.FromResult(callInfo as ActionResult); -<#} else { #> - return callInfo; -<#} #> - } -<#} #> - - [<#= GeneratedCode #>, DebuggerNonUserCode] - public <#=controller.ClassName #> Actions { get { return <#=controller.T4MVCControllerFullName #>; } } - [<#= GeneratedCode #>] - public readonly string Area = "<#=ProcessAreaOrControllerName(controller.AreaName) #>"; - [<#= GeneratedCode #>] - public readonly string Name = "<#=ProcessAreaOrControllerName(controller.Name) #>"; - [<#= GeneratedCode #>] - public const string NameConst = "<#=ProcessAreaOrControllerName(controller.Name) #>"; - - static readonly ActionNamesClass s_actions = new ActionNamesClass(); - [<#= GeneratedCode #>, DebuggerNonUserCode] - public ActionNamesClass ActionNames { get { return s_actions; } } - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class ActionNamesClass - { -<#foreach (var method in controller.ActionMethodsWithUniqueNames) { #> -<# if (settings.UseLowercaseRoutes) { #> - public readonly string <#=method.ActionName #> = (<#=method.ActionNameValueExpression #>).ToLowerInvariant(); -<# } else { #> - public readonly string <#=method.ActionName #> = <#=method.ActionNameValueExpression #>; -<# } -} #> - } - -<# -// Issue: we can't honor UseLowercaseRoutes here because ToLowerInvariant() is not valid in constants! -if (!settings.UseLowercaseRoutes) { #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class ActionNameConstants - { -<#foreach (var method in controller.ActionMethodsWithUniqueNames) { #> - public const string <#=method.ActionName #> = <#=method.ActionNameValueExpression #>; -<# -} #> - } - -<#} -} #> - -<#if (settings.GenerateParamsForActionMethods && !settings.GenerateParamsAsConstantsForActionMethods){ -foreach (var group in controller.UniqueParameterNamesGroupedByActionName) if (group.Any()) { #> - static readonly ActionParamsClass_<#=group.Key #> s_params_<#=group.Key #> = new ActionParamsClass_<#=group.Key #>(); - [<#= GeneratedCode #>, DebuggerNonUserCode] - public ActionParamsClass_<#=group.Key #> <#=group.Key + settings.ParamsPropertySuffix #> { get { return s_params_<#=group.Key #>; } } - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class ActionParamsClass_<#=group.Key #> - { -<#foreach (var param in group) { #> -<# if (settings.UseLowercaseRoutes) { #> - public readonly string <#=param.Name #> = (<#=param.RouteNameExpression #>).ToLowerInvariant(); -<# } else { #> - public readonly string <#=param.Name #> = <#=param.RouteNameExpression #>; -<# } -} #> - } -<# } #> -<#} #> -<#if (settings.GenerateParamsAsConstantsForActionMethods){ - -foreach (var group in controller.UniqueParameterNamesGroupedByActionName) if (group.Any()) { #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class <#=group.Key + settings.ParamsPropertySuffix#> - { -<#foreach (var param in group) { #> -<# if (settings.UseLowercaseRoutes) { #> - public const string <#=param.Name #> = (<#=param.RouteNameExpression #>).ToLowerInvariant(); -<# } else { #> - public const string <#=param.Name #> = <#=param.RouteNameExpression #>; -<# } -} #> - } -<# } #> -<#} #> - static readonly ViewsClass s_views = new ViewsClass(); - [<#= GeneratedCode #>, DebuggerNonUserCode] - public ViewsClass Views { get { return s_views; } } - [<#= GeneratedCode #>, DebuggerNonUserCode] - public class ViewsClass - { -<#RenderControllerViews(controller);#> - } - } - -<#if (!controller.NotRealController) { #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public partial class <#=controller.DerivedClassName #> : <#=controller.FullClassName #> - { - public <#=controller.DerivedClassName #>() : base(Dummy.Instance) { } - -<#foreach (var method in controller.ActionMethods.Where(m => !m.IsCustomReturnType)) { #> - partial void <#=method.Name #>Override(T4MVC_<#=method.ReturnTypeUniqueName #> callInfo<#if (method.Parameters.Count > 0) { #>, <#method.WriteFormalParameters(true); #><#}#>); - - public override <#=method.ReturnTypeFullName #> <#=method.Name #>(<#method.WriteFormalParameters(true); #>) - { - var callInfo = new T4MVC_<#=method.ReturnTypeUniqueName #>(Area, Name, ActionNames.<#=method.ActionName #><# if (method.ActionUrlHttps) {#>, "https"<#}#>); -<#if (method.Parameters.Count > 0) { #> -<#foreach (var p in method.Parameters) { #> - ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, <#=p.RouteNameExpression #>, <#=p.Name #>); -<#} #> -<#}#> - <#=method.Name #>Override(callInfo<#if (method.Parameters.Count > 0) { #><#foreach (var p in method.Parameters) { #>, <#=p.Name #><#}}#>); -<#if (method.ReturnTypeFullName == "System.Threading.Tasks.Task") { #> - return System.Threading.Tasks.Task.FromResult(callInfo as ActionResult); -<#} else { #> - return callInfo; -<#} #> - } - -<#} #> - } -<#} #> -<#if (!String.IsNullOrEmpty(controller.Namespace)) { #> -} -<#} #> - -<#manager.EndBlock(); #> -<#} #> - - -<# if (settings.ExplicitHtmlHelpersForPartials) { - manager.StartNewFile("T4MVC.ExplicitExtensions.cs"); #> - -namespace System.Web.Mvc { - [<#= GeneratedCode #>] - public static class HtmlHelpersForExplicitPartials - { - <# - foreach(var partialView in GetPartials()) { - string partialName = partialView.Key; - string partialPath = partialView.Value; - string partialRenderMethod = string.Format(settings.ExplicitHtmlHelpersForPartialsFormat, partialName); - #> - /// - ///Render the <#= partialName #> partial. - /// - public static void <#= partialRenderMethod #>(this HtmlHelper html) { - html.RenderPartial("<#= partialPath #>"); - } - - /// - ///Render the <#= partialName #> partial. - /// - public static void <#= partialRenderMethod #>(this HtmlHelper html, object model) { - html.RenderPartial("<#= partialPath #>", model); - } - <# } #> - } -} -<# manager.EndBlock(); #> -<# } #> - -<#manager.StartFooter(); #> -#endregion T4MVC -#pragma warning restore 1591 -<#manager.EndBlock(); #> -<#settings.SaveChanges(manager); #> -<#manager.Process(settings.SplitIntoMultipleFiles); #> - -<#@ Include File="T4MVC.tt.hooks.t4" #> - -<#+ -static MvcSettings settings; -const string ControllerSuffix = "Controller"; - -static DTE Dte; -static Project Project; -static string AppRoot; -static HashSet Areas; -static AreaInfo DefaultArea; -static Dictionary ResultTypes; -static TextTransformation TT; -static string T4FileName; -static string T4Folder; -static string GeneratedCode = @"GeneratedCode(""T4MVC"", ""2.0"")"; -static Microsoft.CSharp.CSharpCodeProvider codeProvider = new Microsoft.CSharp.CSharpCodeProvider(); -List virtualPathesForStaticFiles = new List(); - -IEnumerable GetControllers() -{ - var controllers = new List(); - - foreach (var area in Areas) - { - controllers.AddRange(area.GetControllers()); - } - - return controllers; -} - -IEnumerable GetAbstractControllers() -{ - var controllers = new List(); - - foreach (var area in Areas) - { - controllers.AddRange(area.GetAbstractControllers()); - } - - return controllers; -} - -IDictionary GetPartials() -{ - var parts = GetControllers() - .Select(m => m.ViewsFolder) - .SelectMany(m => m.Views) - .Where(m => IsPartialView(m.Value)); - - var partsDic = new Dictionary>(); - - foreach(var part in parts) - { - string viewName = Sanitize(part.Key); - - // Check if we already have a partial view by that name (e.g. if two Views folders have the same ascx) - int keyCollisionCount = partsDic.Where(m => m.Key == viewName || m.Value.Key == viewName).Count(); - - if (keyCollisionCount > 0) - { - // Append a numbered suffix to avoid the conflict - partsDic.Add(viewName + keyCollisionCount.ToString(), part); - } - else - { - partsDic.Add(viewName, part); - } - } - - return partsDic.ToDictionary(k => k.Key, v => v.Value.Value); -} - -bool IsPartialView(string viewFilePath) -{ - string viewFileName = Path.GetFileName(viewFilePath); - - if (viewFileName.EndsWith(".ascx")) return true; - - if ((viewFileName.EndsWith(".cshtml") || viewFileName.EndsWith(".vbhtml")) && viewFileName.StartsWith("_")) - { - return true; - } - - return false; -} - -void PrepareDataToRender(TextTransformation tt) -{ - TT = tt; - T4FileName = Path.GetFileName(Host.TemplateFile); - T4Folder = Path.GetDirectoryName(Host.TemplateFile); - Areas = new HashSet(); - ResultTypes = new Dictionary(); - - // Get the DTE service from the host - var serviceProvider = Host as IServiceProvider; - if (serviceProvider != null) - { - Dte = serviceProvider.GetService(typeof(SDTE)) as DTE; - } - - // Fail if we couldn't get the DTE. This can happen when trying to run in TextTransform.exe - if (Dte == null) - { - throw new Exception("T4MVC can only execute through the Visual Studio host"); - } - - Project = GetProjectContainingT4File(Dte); - - if (Project == null) - { - Error("Could not find the VS Project containing the T4 file."); - return; - } - - // Get the path of the root folder of the app - AppRoot = Path.GetDirectoryName(Project.FullName) + '\\'; - - ProcessAreas(Project); -} - -Project GetProjectContainingT4File(DTE dte) -{ - - // Find the .tt file's ProjectItem - ProjectItem projectItem = dte.Solution.FindProjectItem(Host.TemplateFile); - - // If the .tt file is not opened, open it - if (projectItem.Document == null) - projectItem.Open(Constants.vsViewKindCode); - - return projectItem.ContainingProject; -} - -void ProcessAreas(Project project) -{ - // Process the default area - ProcessArea(project.ProjectItems, null); - - // Get the Areas folder - ProjectItem areaProjectItem = GetProjectItem(project, settings.AreasFolder); - - // Process areas folder - if (areaProjectItem != null) - { - foreach (ProjectItem item in areaProjectItem.ProjectItems) - { - if (IsFolder(item)) - { - ProcessArea(item.ProjectItems, item.Name); - } - } - } - - // Process portable areas - foreach (string portableArea in settings.PortableAreas) - { - ProjectItem portableAreaProjectItem = GetProjectItem(project, portableArea); - - if (portableAreaProjectItem == null) - return; - - if (IsFolder(portableAreaProjectItem)) - { - ProcessArea(portableAreaProjectItem.ProjectItems, portableAreaProjectItem.Name); - } - } -} - -void ProcessArea(ProjectItems areaFolderItems, string name) -{ - var area = new AreaInfo() { Name = name }; - ProcessAreaControllers(areaFolderItems, area); - ProcessAreaViews(areaFolderItems, area); - Areas.Add(area); - - if (String.IsNullOrEmpty(name)) - DefaultArea = area; -} - -void ProcessAreaControllers(ProjectItems areaFolderItems, AreaInfo area) -{ - // Get area Controllers folder - ProjectItem controllerProjectItem = GetProjectItem(areaFolderItems, settings.ControllersFolder); - if (controllerProjectItem == null) - return; - - ProcessControllersRecursive(controllerProjectItem, area); -} - -void ProcessAreaViews(ProjectItems areaFolderItems, AreaInfo area) -{ - // Get area Views folder - ProjectItem viewsProjectItem = GetProjectItem(areaFolderItems, settings.ViewsRootFolder); - if (viewsProjectItem == null) - return; - - ProcessAllViews(viewsProjectItem, area); -} - -void ProcessControllersRecursive(ProjectItem projectItem, AreaInfo area) -{ - - // Recurse into all the sub-items (both files and folder can have some - e.g. .tt files) - foreach (ProjectItem item in projectItem.ProjectItems) - { - ProcessControllersRecursive(item, area); - } - - if (projectItem.FileCodeModel != null) - { - DateTime controllerLastWriteTime = File.GetLastWriteTime(projectItem.get_FileNames(0)); - foreach (var type in projectItem.FileCodeModel.CodeElements.OfType()) - { - ProcessControllerType(type, area, controllerLastWriteTime); - } - // Process all the elements that are namespaces - foreach (var ns in projectItem.FileCodeModel.CodeElements.OfType()) - { - foreach (var type in ns.Members.OfType()) - { - ProcessControllerType(type, area, controllerLastWriteTime); - } - } - } -} - -void ProcessControllerType(CodeClass2 type, AreaInfo area, DateTime controllerLastWriteTime) -{ - // Only process controllers - if (!IsController(type)) - return; - - // Don't process generic classes (their concrete derived classes will be processed) - if (type.IsGeneric) - return; - - //Ignore references to controllers we create - if(area.Controllers.Any(c => c.DerivedClassName == type.Name)) - return; - - // Make sure the class is partial - if (type.ClassKind != vsCMClassKind.vsCMClassKindPartialClass) - { - try - { - type.ClassKind = vsCMClassKind.vsCMClassKindPartialClass; - } - catch - { - // If we couldn't make it partial, give a warning and skip it - Warning(String.Format("{0} was not able to make the class {1} partial. Please change it manually if possible", T4FileName, type.Name)); - return; - } - Warning(String.Format("{0} changed the class {1} to be partial", T4FileName, type.Name)); - } - - // Collect misc info about the controller class and add it to the collection - var controllerInfo = new ControllerInfo - { - Area = area, - Namespace = type.Namespace != null ? type.Namespace.Name : String.Empty, - ClassName = type.Name - }; - - //Filter references to controllers we create - foreach(var derived in area.Controllers.Where(c => c.ClassName == controllerInfo.DerivedClassName).ToArray()) - area.Controllers.Remove(derived); - - // Check if the controller has changed since the generated file was last created - DateTime lastGenerationTime = File.GetLastWriteTime(controllerInfo.GeneratedFileFullPath); - if (lastGenerationTime > controllerLastWriteTime) - { - controllerInfo.GeneratedCodeIsUpToDate = true; - } - - // Either process new ControllerInfo or integrate results into existing object for partially defined controllers - var target = area.Controllers.Add(controllerInfo) ? controllerInfo : area.Controllers.First(c => c.Equals(controllerInfo)); - target.HasExplicitConstructor |= HasExplicitConstructor(type); - target.HasExplicitDefaultConstructor |= HasExplicitDefaultConstructor(type); - - if (type.IsAbstract) - { - // If it's abstract, set a flag and don't process action methods (derived classes will) - target.IsAbstract = true; - } - else - { - // Process all the action methods in the controller - ProcessControllerActionMethods(target, type); - } -} - -void ProcessControllerActionMethods(ControllerInfo controllerInfo, CodeClass2 current) -{ - - bool isAsyncController = IsAsyncController(current); - - // We want to process not just the controller class itself, but also its parents, as they - // may themselves define actions - for (CodeClass2 type = current; type != null && type.FullName != "System.Web.Mvc.Controller"; type = (CodeClass2)type.Bases.Item(1)) - { - - // If the type doesn't come from this project, some actions on it will fail. Try to get a real project type if possible. - if (type.InfoLocation != vsCMInfoLocation.vsCMInfoLocationProject) - { - // Go through all the projects in the solution - for (int i = 1; i <= Dte.Solution.Projects.Count; i++) - { - Project prj = null; - try - { - prj = Dte.Solution.Projects.Item(i); - } - catch (System.Runtime.Serialization.SerializationException) - { - // Some project types (that we don't care about) cause a strange exception, so ingore it - continue; - } - - // Skip it if it's the current project or doesn't have a code model - try - { - if (prj == Project || prj.CodeModel == null) - continue; - } - catch (System.NotImplementedException) - { - // Installer project does not implement CodeModel property - continue; - } - - try - { - // If we can get a local project type, use it instead of the original - var codeType = prj.CodeModel.CodeTypeFromFullName(type.FullName); - if (codeType != null && codeType.InfoLocation == vsCMInfoLocation.vsCMInfoLocationProject) - { - type = (CodeClass2)codeType; - break; - } - } - catch (System.ArgumentException) - { - // CodeTypeFromFullName throws when called on VB projects with a type it doesn't know - // (instead of returning null), so ignore those exceptions (See http://t4mvc.codeplex.com/workitem/7) - } - } - } - - foreach (CodeFunction2 method in GetMethods(type)) - { - // Ignore non-public methods - if (method.Access != vsCMAccess.vsCMAccessPublic) - continue; - - // Ignore methods that are marked as not being actions - if (GetAttribute(method.Attributes, "System.Web.Mvc.NonActionAttribute") != null) - continue; - - // Ignore methods that are marked as Obsolete - if (GetAttribute(method.Attributes, "System.ObsoleteAttribute") != null) - continue; - - // Ignore generic methods - if (method.IsGeneric) - continue; - - if(isAsyncController && settings.SupportAsyncActions && (method.Type.TypeKind == vsCMTypeRef.vsCMTypeRefVoid) && method.Name.EndsWith("Async")) - { - //Async methods return void and there could be multiple matching Completed methods, so we will use - //the generic ActionResult as the return type for the method. - var resultType = Project.CodeModel.CodeTypeFromFullName("System.Web.Mvc.ActionResult"); - // If we haven't yet seen this return type, keep track of it - if (!ResultTypes.ContainsKey(resultType.Name)) - { - var resTypeInfo = new ResultTypeInfo(resultType); - ResultTypes[resultType.FullName] = resTypeInfo; - } - - // Collect misc info about the action method and add it to the collection - controllerInfo.ActionMethods.Add(new ActionMethodInfo(method, current, resultType)); - - continue; - } - - // This takes care of avoiding generic types which cause method.Type.CodeType to blow up - if (method.Type.TypeKind != vsCMTypeRef.vsCMTypeRefCodeType || !(method.Type.CodeType is CodeClass2)) - continue; - - // We only support action methods that return an ActionResult and Task derived types - if (!method.Type.CodeType.get_IsDerivedFrom("System.Web.Mvc.ActionResult") && method.Type.CodeType.FullName !="System.Threading.Tasks.Task") - { - Warning(String.Format("{0} doesn't support {1}.{2} because it doesn't return a supported {3} type", T4FileName, type.Name, method.Name, method.Type.CodeType.FullName)); - continue; - } - - // Ignore async completion methods as they can't really be used in T4MVC, and can cause issues. - // See http://stackoverflow.com/questions/5419173/t4mvc-asynccontroller - if (isAsyncController && method.Name.EndsWith("Completed", StringComparison.OrdinalIgnoreCase)) - continue; - - // If we haven't yet seen this return type, keep track of it - var resTypeInfo2 = new ResultTypeInfo(method.Type.CodeType); - if (!ResultTypes.ContainsKey(resTypeInfo2.FullName)) - { - ResultTypes[resTypeInfo2.FullName] = resTypeInfo2; - } - - // Make sure the method is virtual - if (!method.CanOverride && method.OverrideKind != vsCMOverrideKind.vsCMOverrideKindOverride) - { - try - { - method.CanOverride = true; - } - catch - { - // If we couldn't make it virtual, give a warning and skip it - Warning(String.Format("{0} was not able to make the action method {1}.{2} virtual. Please change it manually if possible", T4FileName, type.Name, method.Name)); - continue; - } - Warning(String.Format("{0} changed the action method {1}.{2} to be virtual", T4FileName, type.Name, method.Name)); - } - - // Collect misc info about the action method and add it to the collection - controllerInfo.ActionMethods.Add(new ActionMethodInfo(method, current)); - } - } -} - -void ProcessAllViews(ProjectItem viewsProjectItem, AreaInfo area) -{ - // Go through all the sub-folders in the Views folder - foreach (ProjectItem item in viewsProjectItem.ProjectItems) - { - - // We only care about sub-folders, not files - if (!IsFolder(item)) - continue; - - // Find the controller for this view folder - ControllerInfo controller = area.Controllers.SingleOrDefault(c => c.Name.Equals(item.Name, StringComparison.OrdinalIgnoreCase)); - - if (controller == null) - { - // If it doesn't match a controller, treat as a pseudo-controller for consistency - controller = new ControllerInfo - { - Area = area, - NotRealController = true, - Namespace = MakeClassName(settings.T4MVCNamespace, area.Name), - ClassName = item.Name + ControllerSuffix - }; - area.Controllers.Add(controller); - } - - AddViewsRecursive(item.ProjectItems, controller.ViewsFolder); - } -} - -void AddViewsRecursive(ProjectItems items, ViewsFolderInfo viewsFolder) -{ - AddViewsRecursive(items, viewsFolder, false); -} - -void AddViewsRecursive(ProjectItems items, ViewsFolderInfo viewsFolder, bool useNonQualifiedViewNames) -{ - // Go through all the files in the subfolder to get the view names - foreach (ProjectItem item in items) - { - if (item.Kind == Constants.vsProjectItemKindPhysicalFile) - { - if (Path.GetExtension(item.Name).Equals(".master", StringComparison.OrdinalIgnoreCase)) - continue; // ignore master files - viewsFolder.AddView(item, useNonQualifiedViewNames); - } - else if (item.Kind == Constants.vsProjectItemKindPhysicalFolder) - { - string folderName = Path.GetFileName(item.Name); - if (folderName.Equals("App_LocalResources", StringComparison.OrdinalIgnoreCase)) - continue; - // Use simple view names if we're already in that mode, or if the folder name is in the collection - bool folderShouldUseNonQualifiedViewNames = useNonQualifiedViewNames || settings.NonQualifiedViewFolders.Contains(folderName, StringComparer.OrdinalIgnoreCase); - var subViewFolder = new ViewsFolderInfo() { Name = folderName }; - viewsFolder.SubFolders.Add(subViewFolder); - AddViewsRecursive(item.ProjectItems, subViewFolder, folderShouldUseNonQualifiedViewNames); - } - } -} - -void RenderControllerViews(ControllerInfo controller) -{ - PushIndent(" "); - RenderViewsRecursive(controller.ViewsFolder, controller); - PopIndent(); -} - -void RenderViewsRecursive(ViewsFolderInfo viewsFolder, ControllerInfo controller) -{ - if(!viewsFolder.HasNonQualifiedViewNames) - { -#> -static readonly _ViewNamesClass s_ViewNames = new _ViewNamesClass(); -public _ViewNamesClass ViewNames { get { return s_ViewNames; } } -public class _ViewNamesClass -{ -<#+ - PushIndent(" "); - foreach (var viewPair in viewsFolder.Views) - { - WriteLine("public readonly string " + EscapeID(Sanitize(viewPair.Key)) + " = \"" + viewPair.Key + "\";"); - } - PopIndent(); -#> -} -<#+} - // For each view, generate a readonly string - foreach (var viewPair in viewsFolder.Views) - { - WriteLine("public readonly string " + EscapeID(Sanitize(viewPair.Key)) + " = \"" + viewPair.Value + "\";"); - } - - // For each sub folder, generate a class and recurse - foreach (var subFolder in viewsFolder.SubFolders) - { - string name = Sanitize(subFolder.Name); - string className = "_" + name; - - // If the folder name is the same as the parent, add a modifier to avoid class name conflicts - // http://mvccontrib.codeplex.com/workitem/7153 - if (name == Sanitize(viewsFolder.Name)) - { - className += "_"; - }#> -static readonly <#=className#>Class s_<#=name#> = new <#=className#>Class(); -public <#=className#>Class <#=EscapeID(name)#> { get { return s_<#=name#>; } } -[<#= GeneratedCode #>, DebuggerNonUserCode] -public partial class <#=className#>Class -{ -<#+ -PushIndent(" "); -RenderViewsRecursive(subFolder, controller); -PopIndent(); - -WriteLine("}"); - } -} - -void ProcessStaticFiles(Project project, string folder) -{ - ProjectItem folderProjectItem = GetProjectItem(project, folder); - if (folderProjectItem != null) - { - var rootPath = "~"; - if (folder.Contains("\\")) - { - rootPath += "/" + folder.Replace("\\", "/"); - rootPath = rootPath.Substring(0, rootPath.LastIndexOf("/")); - } - ProcessStaticFilesRecursive(folderProjectItem, rootPath); - } -} - -void ProcessStaticFilesRecursive(ProjectItem projectItem, string path) -{ - int nestedLevel = BuildClassStructureForProvidedPath(path); - ProcessStaticFilesRecursive(projectItem, path, false /*hasSameNameAsParent*/); - for(int i = 0; i < nestedLevel; ++i) {#> -} -<#+ - PopIndent(); - } -} - -void ProcessStaticFilesRecursive(ProjectItem projectItem, string path, bool hasSameNameAsParent) -{ - if (IsFolder(projectItem)) - { - string className = EscapeID(Sanitize(projectItem.Name)); - // If the folder name is the same as the parent, add a modifier to avoid class name conflicts - // http://mvccontrib.codeplex.com/workitem/7153 - if (hasSameNameAsParent) - { - className += "_"; - } #> - [<#= GeneratedCode #>, DebuggerNonUserCode] - public static class <#=className #> { - private const string URLPATH = "<#=path#>/<#=projectItem.Name#>"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } -<#+ -PushIndent(" "); - -// Recurse into all the items in the folder -foreach (ProjectItem item in projectItem.ProjectItems) -{ - ProcessStaticFilesRecursive( - item, - path + "/" + projectItem.Name, - item.Name == projectItem.Name); -} - -PopIndent(); -#> - } - -<#+ -} - else { #> -<#+ -if (!settings.ExcludedStaticFileExtensions.Any(extension => projectItem.Name.EndsWith(extension, StringComparison.OrdinalIgnoreCase))) { - // if it's a non-minified javascript file - if (projectItem.Name.EndsWith(".js") && !projectItem.Name.EndsWith(".min.js")) { - string minifiedName = projectItem.Name.Replace(".js", ".min.js"); - if (AddTimestampToStaticLink(projectItem)) { #> - public static readonly string <#=Sanitize(projectItem.Name)#> = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/<#=minifiedName#>") ? Url("<#=minifiedName#>")+"?"+T4MVCHelpers.TimestampString(URLPATH + "/<#=minifiedName#>") : Url("<#=projectItem.Name#>")+"?"+T4MVCHelpers.TimestampString(URLPATH + "/<#=projectItem.Name#>"); - <#+} else {#> - public static readonly string <#=Sanitize(projectItem.Name)#> = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/<#=minifiedName#>") ? Url("<#=minifiedName#>") : Url("<#=projectItem.Name#>"); - <#+} #> -<#+} - else if (projectItem.Name.EndsWith(".css") && !projectItem.Name.EndsWith(".min.css")) { - string minifiedName = projectItem.Name.Replace(".css", ".min.css"); - if (AddTimestampToStaticLink(projectItem)) { #> - public static readonly string <#=Sanitize(projectItem.Name)#> = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/<#=minifiedName#>") ? Url("<#=minifiedName#>")+"?"+T4MVCHelpers.TimestampString(URLPATH + "/<#=minifiedName#>") : Url("<#=projectItem.Name#>")+"?"+T4MVCHelpers.TimestampString(URLPATH + "/<#=projectItem.Name#>"); - <#+} else {#> - public static readonly string <#=Sanitize(projectItem.Name)#> = T4MVCHelpers.IsProduction() && T4Extensions.FileExists(URLPATH + "/<#=minifiedName#>") ? Url("<#=minifiedName#>") : Url("<#=projectItem.Name#>"); - <#+} #> -<#+} - else if (AddTimestampToStaticLink(projectItem)) { #> - public static readonly string <#=Sanitize(projectItem.Name)#> = Url("<#=projectItem.Name#>")+"?"+T4MVCHelpers.TimestampString(URLPATH + "/<#=projectItem.Name#>"); -<#+} - else { #> - public static readonly string <#=Sanitize(projectItem.Name)#> = Url("<#=projectItem.Name#>"); -<#+} -} #> -<#+ -// Non folder items may also have children (virtual folders, Class.cs -> Class.Designer.cs, template output) -// Just register them on the same path as their parent item -foreach (ProjectItem item in projectItem.ProjectItems) -{ - ProcessStaticFilesRecursive(item, path, false); -} - } -} - -int BuildClassStructureForProvidedPath(string path) -{ - var folders = path.Split(new char[] {'/', '~'}, StringSplitOptions.RemoveEmptyEntries); - var parentFolder = String.Empty; - var currentPath = "~"; - foreach(var folder in folders) - { - currentPath += "/" + folder; - string className = EscapeID(Sanitize(folder)); - // If the folder name is the same as the parent, add a modifier to avoid class name conflicts - // http://mvccontrib.codeplex.com/workitem/7153 - if (parentFolder == folder) - { - className += "_"; - } - - if(!virtualPathesForStaticFiles.Contains(currentPath)) - { - virtualPathesForStaticFiles.Add(currentPath);#> - - [<#= GeneratedCode #>, DebuggerNonUserCode] - public static partial class <#=className #> { - private const string URLPATH = "<#=currentPath#>"; - public static string Url() { return T4MVCHelpers.ProcessVirtualPath(URLPATH); } - public static string Url(string fileName) { return T4MVCHelpers.ProcessVirtualPath(URLPATH + "/" + fileName); } -<#+ } else { - #> - - public static partial class <#=className #> { -<#+ } - PushIndent(" "); - parentFolder = folder; - } - return folders.Length; -} - -ProjectItem GetProjectItem(Project project, string name) -{ - return GetProjectItem(project.ProjectItems, name); -} - -ProjectItem GetProjectItem(ProjectItems items, string subPath) -{ - - ProjectItem current = null; - foreach (string name in subPath.Split('\\')) - { - try - { - // ProjectItems.Item() throws when it doesn't exist, so catch the exception - // to return null instead. - current = items.Item(name); - } - catch - { - // If any chunk couldn't be found, fail - return null; - } - items = current.ProjectItems; - } - - return current; -} - -static bool IsController(CodeClass2 type) -{ - // Ignore any class which name doesn't end with "Controller" - if (!type.FullName.EndsWith(ControllerSuffix)) return false; - - for (; type.FullName != "System.Web.Mvc.Controller"; type = (CodeClass2)type.Bases.Item(1)) - { - if (type.Bases.Count == 0) - return false; - } - return true; -} - -static bool IsAsyncController(CodeClass2 type) -{ - for (; type.FullName != "System.Web.Mvc.AsyncController"; type = (CodeClass2)type.Bases.Item(1)) - { - if (type.Bases.Count == 0) - return false; - } - return true; -} - -static string GetVirtualPath(ProjectItem item) -{ - string fileFullPath = item.get_FileNames(0); - if (!fileFullPath.StartsWith(AppRoot, StringComparison.OrdinalIgnoreCase)) - throw new Exception(string.Format("File {0} is not under app root {1}. Please report issue.", fileFullPath, AppRoot)); - - // Make a virtual path from the physical path - return "~/" + fileFullPath.Substring(AppRoot.Length).Replace('\\', '/'); -} - -static string ProcessAreaOrControllerName(string name) -{ - return settings.UseLowercaseRoutes ? name.ToLowerInvariant() : name; -} - -// Return all the CodeFunction2 in the CodeElements collection -static IEnumerable GetMethods(CodeClass2 codeClass) -{ - // Only look at regular method (e.g. ignore things like contructors) - return codeClass.Members.OfType() - .Where(f => f.FunctionKind == vsCMFunction.vsCMFunctionFunction); -} - -// Check if the class has any explicit constructor -static bool HasExplicitConstructor(CodeClass2 codeClass) -{ - return codeClass.Members.OfType().Any( - f => !f.IsShared && f.FunctionKind == vsCMFunction.vsCMFunctionConstructor); -} - -// Check if the class has a default (i.e. no params) constructor -static bool HasExplicitDefaultConstructor(CodeClass2 codeClass) -{ - return codeClass.Members.OfType().Any( - f => !f.IsShared && f.FunctionKind == vsCMFunction.vsCMFunctionConstructor && f.Parameters.Count == 0); -} - -// Find a method with a given name -static CodeFunction2 GetMethod(CodeClass2 codeClass, string name) -{ - return GetMethods(codeClass).FirstOrDefault(f => f.Name == name); -} - -// Find an attribute of a given type on an attribute collection -static CodeAttribute2 GetAttribute(CodeElements attributes, string attributeType) -{ - for (int i = 1; i <= attributes.Count; i++) - { - try - { - var attrib = (CodeAttribute2)attributes.Item(i); - if (attributeType.Split(',').Contains(attrib.FullName, StringComparer.OrdinalIgnoreCase)) - { - return attrib; - } - } - catch - { - // FullName can throw in some cases, so just ignore those attributes - continue; - } - } - return null; -} - -static CodeAttribute2 GetAttribute(CodeClass2 type, string attributeType) -{ - while(type != null) { - var attribute = GetAttribute(type.Attributes, attributeType); - if(attribute != null) - return attribute; - if (type.Bases.Count == 0) - return null; - type = (CodeClass2)type.Bases.Item(1); - } - return null; -} - -static string UniqueFullName(CodeType codeType) -{ - var uniqueName = codeType.FullName; - - // Match characters not allowed in class names. - uniqueName = Regex.Replace(uniqueName, @"[^\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\d]", "_"); - - // Remove duplicate '_' characters - uniqueName = Regex.Replace(uniqueName, @"__+", "_"); - - // Remove trailing '_' characters - uniqueName = uniqueName.TrimEnd('_'); - - return uniqueName; -} - -// Return whether a ProjectItem is a folder and not a file -static bool IsFolder(ProjectItem item) -{ - return (item.Kind == Constants.vsProjectItemKindPhysicalFolder); -} - -static string MakeClassName(string ns, string classname) -{ - return String.IsNullOrEmpty(ns) ? classname : - String.IsNullOrEmpty(classname) ? ns : ns + "." + codeProvider.CreateEscapedIdentifier(classname); -} - -static string Sanitize(string token) -{ - if (token == null) return null; - - // Replace all invalid chars by underscores - token = Regex.Replace(token, @"[\W\b]", "_", RegexOptions.IgnoreCase); - - // If it starts with a digit, prefix it with an underscore - token = Regex.Replace(token, @"^\d", @"_$0"); - - // Check for reserved words - // TODO: Clean this up and add other reserved words (keywords, etc) - if (token == "Url") token = "_Url"; - - return token; -} - -static string EscapeID(string id) -{ - return codeProvider.CreateEscapedIdentifier(id); -} - -// Data structure to collect data about an area -class AreaInfo -{ - public AreaInfo() - { - Controllers = new HashSet(); - } - - public string Name { get; set; } - public HashSet Controllers { get; set; } - - public string Namespace - { - get - { - // When *not* using an 'Areas' token, we need to disambiguate conflicts - // between Area names and controller names (from the default Area) - if (!settings.IncludeAreasToken && DefaultArea.Controllers.Any(c => c.Name == Name)) - return Name + "Area"; - - return Name; - } - } - - public IEnumerable GetControllers() - { - return Controllers.Where(c => !c.IsAbstract); - } - - public IEnumerable GetAbstractControllers() - { - return Controllers.Where(c => c.IsAbstract); - } -} - -// Data structure to collect data about a controller class -class ControllerInfo -{ - public ControllerInfo() - { - ActionMethods = new HashSet(); - ViewsFolder = new ViewsFolderInfo(); - } - - public AreaInfo Area { get; set; } - public string AreaName - { - get { return Area.Name ?? ""; } - } - - public string T4MVCControllerFullName - { - get - { - string name = settings.HelpersPrefix; - if (!String.IsNullOrEmpty(AreaName)) - { - if (settings.IncludeAreasToken) - name += ".Areas." + EscapeID(Area.Namespace); - else - name += "." + EscapeID(Area.Namespace); - } - return name + "." + Name; - } - } - - public string ViewPath - { - get - { - if (string.IsNullOrEmpty(Area.Name)) - return String.Format("~/{0}/{1}/", settings.ViewsRootFolder, Name); - else - return String.Format("~/{0}/{1}/{2}/", settings.AreasFolder, settings.ViewsRootFolder, Name); - } - } - - // True when this is not a real controller, but a placeholder for views folders that don't match a controller - public bool NotRealController { get; set; } - - public bool HasExplicitConstructor { get; set; } - public bool HasExplicitDefaultConstructor { get; set; } - public bool HasDefaultConstructor { get { return !HasExplicitConstructor || HasExplicitDefaultConstructor; } } - public bool IsAbstract { get; set; } - - public bool GeneratedCodeIsUpToDate { get; set; } - - public string ClassName { get; set; } - public string Name - { - get - { - // Trim the Controller suffix - return ClassName.Substring(0, ClassName.Length - ControllerSuffix.Length); - } - } - - public string Namespace { get; set; } - - public string FullClassName - { - get - { - return MakeClassName(Namespace, ClassName); - } - } - - public string DerivedClassName - { - get - { - return "T4MVC_" + ClassName; - } - } - - public string FullDerivedClassName - { - get - { - if (NotRealController) - return FullClassName; - return MakeClassName(Namespace, DerivedClassName); - } - } - - public string GeneratedFileName - { - get - { - return MakeClassName(AreaName, ClassName + ".generated.cs"); - } - } - - public string GeneratedFileFullPath - { - get - { - return Path.Combine(T4Folder, GeneratedFileName); - } - } - - public HashSet ActionMethods { get; set; } - - public IEnumerable CustomActionMethods - { - get - { - return ActionMethods.Where(m => m.IsCustomReturnType); - } - } - - IEnumerable ActionMethodsWithNoParameters - { - get - { - return ActionMethods.Where(m => m.CanBeCalledWithoutParameters); - } - } - - public IEnumerable ActionMethodsUniqueWithoutParameterlessOverload - { - get - { - return ActionMethodsWithUniqueNames.Except(ActionMethodsWithNoParameters, new ActionComparer()); - } - } - - public IEnumerable CustomActionMethodsUniqueWithoutParameterlessOverload - { - get - { - return CustomActionMethodsWithUniqueNames.Except(ActionMethodsWithNoParameters, new ActionComparer()); - } - } - - // Return a list of actions without duplicate names (even with multiple overloads) - public IEnumerable ActionMethodsWithUniqueNames - { - get - { - return ActionMethods.Distinct(new ActionComparer()); - } - } - - // Return a list of actions without duplicate names (even with multiple overloads) - public IEnumerable CustomActionMethodsWithUniqueNames - { - get - { - return CustomActionMethods.Distinct(new ActionComparer()); - } - } - - class ActionComparer : IEqualityComparer - { - public bool Equals(ActionMethodInfo x, ActionMethodInfo y) - { - return x.ActionName == y.ActionName; - } - - public int GetHashCode(ActionMethodInfo obj) - { - return obj.ActionName.GetHashCode(); - } - } - - public IEnumerable> UniqueParameterNamesGroupedByActionName - { - get - { - var comp = new ActionParameterComparer(); - return ActionMethods - .SelectMany(m => m.Parameters, (m, p) => new { Method = m, Parameter = p }) - .GroupBy(m => m.Method.ActionName, m => m.Parameter) - .Select(g => new { g.Key, Items = g.Distinct(comp) }) - .SelectMany(g => g.Items, (g, i) => new { g.Key, Item = i }) - .GroupBy(i => i.Key, i => i.Item); - } - } - - class ActionParameterComparer : IEqualityComparer - { - public bool Equals(MethodParamInfo x, MethodParamInfo y) - { - return x.Name == y.Name; - } - - public int GetHashCode(MethodParamInfo obj){ - return obj.Name.GetHashCode(); - } - } - - public ViewsFolderInfo ViewsFolder { get; private set; } - - public override string ToString() - { - return Name; - } - - public override bool Equals(object obj) - { - return obj != null && FullClassName == ((ControllerInfo)obj).FullClassName; - } - - public override int GetHashCode() - { - return FullClassName.GetHashCode(); - } -} - -// Info about a view folder, its views and its sub view folders -class ViewsFolderInfo -{ - public ViewsFolderInfo() - { - Views = new Dictionary(); - SubFolders = new List(); - } - - public void AddView(ProjectItem item, bool useNonQualifiedViewName) - { - string viewName = Path.GetFileName(item.Name); - string viewFieldName = Path.GetFileNameWithoutExtension(viewName); - - // If the simple view name is already in use, include the extension (e.g. foo_ascx instead of just foo) - if (Views.ContainsKey(viewFieldName)) - viewFieldName = Sanitize(viewName); - - HasNonQualifiedViewNames = HasNonQualifiedViewNames | useNonQualifiedViewName; - Views[viewFieldName] = useNonQualifiedViewName ? Path.GetFileNameWithoutExtension(viewName) : GetVirtualPath(item); - } - - public bool HasNonQualifiedViewNames { get; private set; } - public string Name { get; set; } - public Dictionary Views { get; private set; } - public List SubFolders { get; set; } -} - -// Data structure to collect data about a method -class FunctionInfo -{ - protected CodeFunction2 _method; - private string _signature; - - public FunctionInfo(CodeFunction2 method) - { - Parameters = new List(); - - // Can be null when an custom ActionResult has no ctor - if (method == null) - return; - - _method = method; - - // Build a unique signature for the method, used to avoid duplication - _signature = method.Name; - - CanBeCalledWithoutParameters = true; - - // Process all the parameters - foreach (var p in method.Parameters.OfType()) - { - // If any param is not optional, then the method can't be called without parameters - if (p.ParameterKind != vsCMParameterKind.vsCMParameterKindOptional) - { - CanBeCalledWithoutParameters = false; - } - - // Note: if the param name starts with @ (e.g. to escape a keyword), we need to trim that - string routeNameExpression = "\"" + p.Name.TrimStart('@') + "\""; - - // If there is a [Bind(Prefix = "someName")] attribute, use it - if (p.InfoLocation != vsCMInfoLocation.vsCMInfoLocationExternal) - { - var attrib = GetAttribute(p.Attributes, "System.Web.Mvc.BindAttribute"); - if (attrib != null) - { - var arg = attrib.Arguments.OfType().FirstOrDefault(a => a.Name == "Prefix"); - if (arg != null) - routeNameExpression = arg.Value; - } - } - - Parameters.Add( - new MethodParamInfo() - { - Name = p.Name, - RouteNameExpression = routeNameExpression, - Type = p.Type.AsString, - DefaultValue = p.DefaultValue - }); - _signature += "," + p.Type.AsString; - } - } - - protected virtual CodeType ReturnTypeImpl { get { return _method.Type.CodeType; } } - - public string Name { get { return _method.Name; } } - public string ReturnType { get { return ReturnTypeImpl.Name; } } - public string ReturnTypeFullName { get { return ReturnTypeImpl.FullName; } } - public string ReturnTypeUniqueName { get { return IsTaskBased ? "System_Web_Mvc_ActionResult" : UniqueFullName(ReturnTypeImpl); } } - public bool IsPublic { get { return _method.Access == vsCMAccess.vsCMAccessPublic; } } - public List Parameters { get; private set; } - public bool CanBeCalledWithoutParameters { get; private set; } - - private bool IsTaskBased { get {return ReturnTypeImpl.FullName == "System.Threading.Tasks.Task"; } } - - // Write out all the parameters as part of a method declaration - public void WriteFormalParameters(bool first, bool includeDefaults = false) - { - foreach (var p in Parameters) - { - if (first) - first = false; - else - TT.Write(", "); - - TT.Write(p.Type + " " + p.Name); - if(includeDefaults && !string.IsNullOrEmpty(p.DefaultValue)) - TT.Write(" = " + p.DefaultValue); - } - } - - // Pass non-empty param values to make sure the ActionResult ctors don't complain - // REVIEW: this is a bit dirty - public void WriteNonEmptyParameterValues(bool first) - { - foreach (var p in Parameters) - { - if (first) - first = false; - else - TT.Write(", "); - - if(!string.IsNullOrEmpty(p.DefaultValue)) - TT.Write(p.DefaultValue); - else - { - switch (p.Type) - { - case "string": - TT.Write("\" \""); - break; - case "byte[]": - TT.Write("new byte[0]"); - break; - default: - TT.Write("default(" + p.Type + ")"); - break; - } - } - } - } - - public override bool Equals(object obj) - { - return obj != null && _signature == ((FunctionInfo)obj)._signature; - } - - public override int GetHashCode() - { - return _signature.GetHashCode(); - } -} - -// Data structure to collect data about an action method -class ActionMethodInfo : FunctionInfo -{ - public ActionMethodInfo(CodeFunction2 method, CodeClass2 controller, CodeType asyncType = null) - : base(method) - { - if(asyncType != null) - { - // Remove the Async from the end of the name to match the actual Action routing would use. - // This also separates the Action Calls from the implementation - _actionName = method.Name.Remove(method.Name.Length - 5); - _returnType = asyncType; - } - // Normally, the action name is the method name. But if there is an [ActionName] on - // the method, get the expression from that instead - ActionNameValueExpression = '"' + ActionName + '"'; - var attrib = GetAttribute(method.Attributes, "System.Web.Mvc.ActionNameAttribute"); - if (attrib != null) - { - var arg = (CodeAttributeArgument)attrib.Arguments.Item(1); - ActionNameValueExpression = arg.Value; - } - - if (GetAttribute(method.Attributes, settings.AttributeIndicatingHttps) != null || GetAttribute(controller, settings.AttributeIndicatingHttps) != null) - { - ActionUrlHttps = true; - } - } - - string _actionName; - CodeType _returnType; - protected override CodeType ReturnTypeImpl { get { return _returnType ?? base.ReturnTypeImpl; } } - - public string ActionName { get { return _actionName ?? base.Name; } } - public string ActionNameValueExpression { get; set; } - public bool ActionUrlHttps {get; set; } - - public bool IsCustomReturnType { get { return _returnType != null; } } - -} - -// Data about an ActionResult derived type -class ResultTypeInfo -{ - CodeType _codeType; - public ResultTypeInfo(CodeType codeType) - { - _codeType = codeType; - - var ctor = _codeType.Members.OfType().FirstOrDefault( - f => f.FunctionKind == vsCMFunction.vsCMFunctionConstructor); - Constructor = new FunctionInfo(ctor); - } - - public string Name { get { return _codeType.Name; } } - public string FullName { get { return this.IsTaskBased ? "System.Web.Mvc.ActionResult" : _codeType.FullName; } } - public string UniqueName { get { return this.IsTaskBased ? "System_Web_Mvc_ActionResult" : UniqueFullName(_codeType); } } - public FunctionInfo Constructor { get; set; } - public IEnumerable AbstractMethods - { - get - { - return _codeType.Members.OfType().Where( - f => f.MustImplement).Select(f => new FunctionInfo(f)); - } - } - - private bool IsTaskBased { get {return _codeType.FullName == "System.Threading.Tasks.Task"; } } -} - -class MethodParamInfo -{ - public string Name { get; set; } - public string RouteNameExpression { get; set; } - public string Type { get; set; } - public string DefaultValue { get; set; } -} - -class MvcSettings : XmlSettings -{ - public static MvcSettings Load(ITextTemplatingEngineHost host) - { - return Load(host); - } - - public MvcSettings() - { - this.T4MVCNamespace = "T4MVC"; - this.HelpersPrefix = "MVC"; - this.ReferencedNamespaces = new XmlStringArray(new string[] { - }, "Namespace"); - this.AreasFolder = "Areas"; - this.PortableAreas = new XmlStringArray(new string[] { - }, "Area"); - this.IncludeAreasToken = false; - this.ControllersFolder = "Controllers"; - this.ViewsRootFolder = "Views"; - this.NonQualifiedViewFolders = new XmlStringArray(new string[] { - "DisplayTemplates", - "EditorTemplates" - }, "ViewFolder"); - this.GenerateActionResultInterface = true; - this.GenerateParamsAsConstantsForActionMethods = false; - this.GenerateParamsForActionMethods = true; - this.SupportAsyncActions = false; - this.UseLowercaseRoutes = false; - this.LinksNamespace = "Links"; - this.AddTimestampToStaticLinks = false; - this.StaticFilesFolders = new XmlStringArray(new string[] { - "Scripts", - "Content", - }, "FileFolder"); - this.ExcludedStaticFileExtensions = new XmlStringArray(new string[] { - ".cs" - }, "Extension"); - this.AttributeIndicatingHttps = "System.Web.Mvc.RequireHttpsAttribute"; - this.GenerateSecureLinksInDebugMode = false; - this.ParamsPropertySuffix = "Params"; - this.ExplicitHtmlHelpersForPartialsFormat = "Render{0}"; - this.SplitIntoMultipleFiles = true; - - } - - [System.ComponentModel.Description("The namespace used by some of T4MVC's generated code")] - public string T4MVCNamespace { get; set; } - - [System.ComponentModel.Description("The prefix used for things like MVC.Dinners.Name and MVC.Dinners.Delete(Model.DinnerID)")] - public string HelpersPrefix { get; set; } - - [System.ComponentModel.Description("Namespaces to be referenced by the generated code")] - public XmlStringArray ReferencedNamespaces { get; set; } - - [System.ComponentModel.Description("The folder under the project that contains the areas")] - public string AreasFolder { get; set; } - - [System.ComponentModel.Description("You can list folders containing portable areas here")] - public IEnumerable PortableAreas { get; set; } - - [System.ComponentModel.Description("Choose whether you want to include an 'Areas' token when referring to areas.\r\ne.g. Assume the Area is called Blog and the Controller is Post:\r\n- When false use MVC.Blog.Post.etc...\r\n- When true use MVC.Areas.Blog.Post.etc...")] - public bool IncludeAreasToken { get; set; } - - [System.ComponentModel.Description("The folder under the project that contains the controllers")] - public string ControllersFolder { get; set; } - - [System.ComponentModel.Description("The folder under the project that contains the views")] - public string ViewsRootFolder { get; set; } - - [System.ComponentModel.Description("Views in DisplayTemplates and EditorTemplates folders shouldn't be fully qualifed\r\nas it breaks the templated helper code")] - public XmlStringArray NonQualifiedViewFolders { get; set; } - - [System.ComponentModel.Description("If true, the T4MVC action result interface will be generated\r\nIf false, the namespace of the interface must be referenced in the 'ReferencedNamespaces' setting")] - public bool GenerateActionResultInterface { get; set; } - - [System.ComponentModel.Description("If true, [new] overrides will be created for async actions on AsyncControllers\r\nThis breaks the Go To Definition function for async actions.")] - public bool SupportAsyncActions { get; set; } - - [System.ComponentModel.Description("If true, use lower case tokens in routes for the area, controller and action names")] - public bool UseLowercaseRoutes { get; set; } - - [System.ComponentModel.Description("The namespace that the links are generated in (e.g. \"Links\", as in Links.Content.nerd_jpg)")] - public string LinksNamespace { get; set; } - - [System.ComponentModel.Description("If true, links to static files include a query string containing the file's last change time.\r\nThis way, when the static file changes, the link changes and guarantees that the client will re-request the resource.\r\ne.g. when true, the link looks like: \"/Content/nerd.jpg?2009-09-04T12:25:48\"\r\nSee http://mvccontrib.codeplex.com/workitem/7163 for potential issues with this feature")] - public bool AddTimestampToStaticLinks { get; set; } - - [System.ComponentModel.Description("Folders containing static files for which links are generated (e.g. Links.Scripts.Map_js)")] - public XmlStringArray StaticFilesFolders { get; set; } - - [System.ComponentModel.Description("Static files to exclude from the generated links")] - public XmlStringArray ExcludedStaticFileExtensions { get; set; } - - [System.ComponentModel.Description("When creating links with T4MVC, it can force them to HTTPS if the action method you are linking to requires Http.")] - public string AttributeIndicatingHttps { get; set; } - public bool GenerateSecureLinksInDebugMode { get; set; } - - [System.ComponentModel.Description("Set this to false to omit the generation of parameters for action methods.")] - public bool GenerateParamsForActionMethods { get; set; } - - [System.ComponentModel.Description("Set this to true to omit the generation of parameters for action methods as constants. Choose this or GenerateParamsForActionMethods.")] - public bool GenerateParamsAsConstantsForActionMethods { get; set; } - - [System.ComponentModel.Description("The suffix added to action method names for the property containing the parameters, for example ImportParams\r\nfor the Import action method.")] - public string ParamsPropertySuffix { get; set; } - - [System.ComponentModel.Description("create explicit HtmlHelpers for rendering partials")] - public bool ExplicitHtmlHelpersForPartials { get; set; } - public string ExplicitHtmlHelpersForPartialsFormat { get; set; } - - [System.ComponentModel.Description("If true,the template output will be split into multiple files.")] - public bool SplitIntoMultipleFiles { get; set; } - -} - -/* - XmlSettings base classes, if you need to modify the T4MVC properties edit the MvcSettings Class Above -*/ - -/// Base XmlSettings class, responsible for reading/writing the settigns file contents, all settings other -/// than string convertable types should decend from this class -abstract class XmlSettingsBase -{ - protected XmlSettingsBase() - { - this.NeedsSave = true; - } - - protected virtual void Init() - { - } - - protected bool SaveAsChild { get; private set; } - - protected bool NeedsSave { get; private set; } - - protected static void SetSaveAsChild(XmlSettingsBase settings, bool value) - { - settings.SaveAsChild = value; - } - - protected static void SetNeedsSave(XmlSettingsBase settings, bool value) - { - settings.NeedsSave = value; - } - - protected static void WriteCommentedProperty(System.Xml.XmlWriter writer, string name) - { - writer.WriteComment(string.Concat("<", name, ">")); - } - - protected static void WritePropertyDesc(System.Xml.XmlWriter writer, System.ComponentModel.PropertyDescriptor property) - { - var desc = property.Attributes.OfType().FirstOrDefault(); - if(desc != null) - { - writer.WriteComment(desc.Description); - } - } - - protected virtual void Load(System.Xml.Linq.XElement xml) - { - this.NeedsSave = false; - int matched = 0; - int read = 0; - foreach(System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(this)) - { - object pvalue; - if(typeof(XmlSettingsBase).IsAssignableFrom(property.PropertyType) || (((pvalue = property.GetValue(this)) != null) && typeof(XmlSettingsBase).IsAssignableFrom(pvalue.GetType()))) - { - read++; - var value = xml.Element(property.Name); - if(value != null) - { - var settings = (XmlSettingsBase)property.GetValue(this); - settings.Load(value); - if(!settings.NeedsSave) - matched++; - settings.SaveAsChild = true; - } - } - else if(!property.IsReadOnly) - { - read++; - var value = xml.Element(property.Name); - if(value != null) - { - if(property.Converter.CanConvertFrom(typeof(string))) - { - matched++; - property.SetValue(this, property.Converter.ConvertFromString(value.Value)); - } - else - { - System.Reflection.MethodBase parser = property.PropertyType.GetMethod("Parse", new Type[] { typeof(string) }); - if(parser == null) - parser = property.PropertyType.GetConstructor(new Type[] { typeof(string) }); - - if(parser != null) - { - matched++; - property.SetValue(this, parser.Invoke(null, new Object[] { value.Value })); - } - } - } - } - } - this.NeedsSave = this.NeedsSave || (matched < read); - } - - protected virtual void Save(System.Xml.XmlWriter writer) - { - foreach(System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(this)) - { - var value = property.GetValue(this); - WritePropertyDesc(writer, property); - if(value != null) - { - if(typeof(XmlSettingsBase).IsAssignableFrom(value.GetType())) - { - var settings = (XmlSettingsBase)property.GetValue(this); - if((settings != null) && settings.SaveAsChild) - { - writer.WriteStartElement(property.Name); - settings.Save(writer); - writer.WriteEndElement(); - } - } else if(!property.IsReadOnly) - { - writer.WriteElementString(property.Name, property.Converter.ConvertToString(value)); - } - } - else - { - WriteCommentedProperty(writer, property.Name); - } - } - } -} - -/// Custom class to allow string arrays to be read and written to/from settings -class XmlStringArray : XmlSettingsBase, IEnumerable -{ - public XmlStringArray(IEnumerable items, string name) - { - this._items = items; - this._name = name; - SetSaveAsChild(this, true); - } - - string _name; - IEnumerable _items; - - protected override void Load(System.Xml.Linq.XElement xml) - { - var items = new List(); - foreach(var item in xml.Elements(this._name)) - { - items.Add(item.Value); - } - this._items = items; - SetNeedsSave(this, false); - } - - protected override void Save(System.Xml.XmlWriter writer) - { - if(this._items == null || !this._items.Any()) - { - WriteCommentedProperty(writer, this._name); - return; - } - - foreach(var item in this._items) - { - writer.WriteElementString(this._name, item); - } - } - - public IEnumerator GetEnumerator() - { - return this._items.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return this.GetEnumerator(); - } -} - -/// This is the base class for the standard settings, the main settigns class should inherit from this -/// one since it provides the methods to interact with the T4 system and EnvDTE. Sub-properties can -/// just inherit from XmlSettingsBase. -abstract class XmlSettings : XmlSettingsBase -{ - protected static T Load(ITextTemplatingEngineHost host) where T : XmlSettings, new() - { - T settings = new T(); - settings.Init(host); - return settings; - } - - void Init(ITextTemplatingEngineHost host) - { - - this.TemplateFile = Path.GetFileName(host.TemplateFile); - this.TemplateFolder = Path.GetDirectoryName(host.TemplateFile); - - // Get the DTE service from the host - var serviceProvider = host as IServiceProvider; - if (serviceProvider != null) - { - this.DTE = serviceProvider.GetService(typeof(SDTE)) as DTE; - } - - // Fail if we couldn't get the DTE. This can happen when trying to run in TextTransform.exe - if (this.DTE == null) - { - throw new Exception("T4Build can only execute through the Visual Studio host"); - } - - this.ProjectItem = this.DTE.Solution.FindProjectItem(host.TemplateFile); - - // If the .tt file is not opened, open it - if (this.ProjectItem.Document == null) - this.ProjectItem.Open(Constants.vsViewKindCode); - - this.Project = this.ProjectItem.ContainingProject; - - if (Project == null) - { - throw new Exception("Could not find the VS Project containing the T4 file."); - } - - this.Load(); - this.Init(); - } - - public string TemplateFile { get; private set; } - - public string TemplateFolder { get; private set; } - - public DTE DTE { get; private set; } - - public ProjectItem ProjectItem { get; private set; } - - public Project Project { get; private set; } - - ProjectItem FindProjectItemRecursive(ProjectItems items, string name) - { - if(items == null) - return null; - - foreach(ProjectItem item in items) - { - if(item.Name.Equals(name) || item.Name.StartsWith(name + ".")) - return item; - var found = FindProjectItemRecursive(item.ProjectItems, name); - if(found != null) - return found; - } - - return null; - } - - protected ProjectItem FindProjectItem(string name) - { - return this.FindProjectItemRecursive(this.Project.ProjectItems, name); - } - - protected string SettingsFile - { - get - { - return Path.Combine(this.TemplateFolder, string.Concat(this.TemplateFile, ".settings.xml")); - } - } - - void Load() - { - if(System.IO.File.Exists(this.SettingsFile)) - try - { - this.Load(System.Xml.Linq.XElement.Load(this.SettingsFile)); - } catch { throw; } - } - - public void SaveChanges(Manager manager) - { - // Avoid saving if we dont need to; - if(!this.NeedsSave) - return; - - if(manager.FileOkToWrite(this.SettingsFile)) - { - var settings = new System.Xml.XmlWriterSettings - { - Indent = true - }; - using(var writer = System.Xml.XmlWriter.Create(this.SettingsFile, settings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement(this.GetType().Name); - this.Save(writer); - writer.WriteEndElement(); - writer.WriteEndDocument(); - } - - var item = this.ProjectItem.Collection.AddFromFile(this.SettingsFile); - item.Properties.Item("ItemType").Value = "None"; - } else - TT.Error("Cannot save settings file! " + this.SettingsFile); - } -} - -/* - Manager.tt from Damien Guard: http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited -*/ - - -// Manager class records the various blocks so it can split them up -class Manager -{ - private class Block - { - public String Name; - public int Start, Length; - } - - private Block currentBlock; - private List files = new List(); - private Block footer = new Block(); - private Block header = new Block(); - private ITextTemplatingEngineHost host; - private StringBuilder template; - protected List generatedFileNames = new List(); - - public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) - { - return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template); - } - - public virtual bool FileOkToWrite(String fileName) - { - return true; - } - - public void KeepGeneratedFile(String name) - { - name = Path.Combine(Path.GetDirectoryName(host.TemplateFile), name); - generatedFileNames.Add(name); - } - - public void StartNewFile(String name) - { - if (name == null) - throw new ArgumentNullException("name"); - CurrentBlock = new Block { Name = name }; - } - - public void StartFooter() - { - CurrentBlock = footer; - } - - public void StartHeader() - { - CurrentBlock = header; - } - - public void EndBlock() - { - if (CurrentBlock == null) - return; - CurrentBlock.Length = template.Length - CurrentBlock.Start; - if (CurrentBlock != header && CurrentBlock != footer) - files.Add(CurrentBlock); - currentBlock = null; - } - - public virtual void Process(bool split) - { - if (split) - { - EndBlock(); - String headerText = template.ToString(header.Start, header.Length); - String footerText = template.ToString(footer.Start, footer.Length); - String outputPath = Path.GetDirectoryName(host.TemplateFile); - files.Reverse(); - foreach (Block block in files) - { - String fileName = Path.Combine(outputPath, block.Name); - String content = headerText + template.ToString(block.Start, block.Length) + footerText; - generatedFileNames.Add(fileName); - CreateFile(fileName, content); - template.Remove(block.Start, block.Length); - } - } - } - - protected virtual void CreateFile(String fileName, String content) - { - if (IsFileContentDifferent(fileName, content)) - File.WriteAllText(fileName, content); - } - - public virtual String GetCustomToolNamespace(String fileName) - { - return null; - } - - public virtual String DefaultProjectNamespace - { - get { return null; } - } - - protected bool IsFileContentDifferent(String fileName, String newContent) - { - return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent); - } - - private Manager(ITextTemplatingEngineHost host, StringBuilder template) - { - this.host = host; - this.template = template; - } - - private Block CurrentBlock - { - get { return currentBlock; } - set - { - if (CurrentBlock != null) - EndBlock(); - if (value != null) - value.Start = template.Length; - currentBlock = value; - } - } - - private class VSManager : Manager - { - private EnvDTE.ProjectItem templateProjectItem; - private EnvDTE.DTE dte; - private Action checkOutAction; - private Action> projectSyncAction; - - public override String DefaultProjectNamespace - { - get - { - return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString(); - } - } - - public override String GetCustomToolNamespace(string fileName) - { - return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString(); - } - - public override void Process(bool split) - { - if (templateProjectItem.ProjectItems == null) - return; - base.Process(split); - projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); - } - - public override bool FileOkToWrite(String fileName) - { - CheckoutFileIfRequired(fileName); - return base.FileOkToWrite(fileName); - } - - protected override void CreateFile(String fileName, String content) - { - if (IsFileContentDifferent(fileName, content)) - { - CheckoutFileIfRequired(fileName); - File.WriteAllText(fileName, content); - } - } - - internal VSManager(ITextTemplatingEngineHost host, StringBuilder template) - : base(host, template) - { - var hostServiceProvider = (IServiceProvider)host; - if (hostServiceProvider == null) - throw new ArgumentNullException("Could not obtain IServiceProvider"); - dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE)); - if (dte == null) - throw new ArgumentNullException("Could not obtain DTE from host"); - templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile); - checkOutAction = (String fileName) => dte.SourceControl.CheckOutItem(fileName); - projectSyncAction = (IEnumerable keepFileNames) => ProjectSync(templateProjectItem, keepFileNames); - } - - private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable keepFileNames) - { - var keepFileNameSet = new HashSet(keepFileNames); - var projectFiles = new Dictionary(); - var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.get_FileNames(0)) + "."; - foreach (EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) - projectFiles.Add(projectItem.get_FileNames(0), projectItem); - - // Remove unused items from the project - foreach (var pair in projectFiles) - if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix)) - pair.Value.Delete(); - - // Add missing files to the project - foreach (String fileName in keepFileNameSet) - if (!projectFiles.ContainsKey(fileName)) - templateProjectItem.ProjectItems.AddFromFile(fileName); - } - - private void CheckoutFileIfRequired(String fileName) - { - var sc = dte.SourceControl; - if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName)) - checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null)); - } - } -} - -/* - End of Manager.tt -*/ -#> diff --git a/elFinder.Net.Web/T4MVC.tt.hooks.t4 b/elFinder.Net.Web/T4MVC.tt.hooks.t4 deleted file mode 100644 index 61797e8..0000000 --- a/elFinder.Net.Web/T4MVC.tt.hooks.t4 +++ /dev/null @@ -1,45 +0,0 @@ -<#+ -/* - -This file contains hooks and extra code used by T4MVC.tt. The main goal is to avoid the need for users -to fork the 'official' template in order to achieve what they want. - -*/ - -static bool AddTimestampToStaticLink(ProjectItem projectItem) { - // By default, this just returns the static flag, but you can add additional logic to make more complex - // decisions about which files should have the timestamp - // See http://mvccontrib.codeplex.com/workitem/7129 for details - return settings.AddTimestampToStaticLinks; -} - -void RenderAdditionalCode() { -#> -[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] -internal static class T4MVCHelpers { - // You can change the ProcessVirtualPath method to modify the path that gets returned to the client. - // e.g. you can prepend a domain, or append a query string: - // return "http://localhost" + path + "?foo=bar"; - private static string ProcessVirtualPathDefault(string virtualPath) { - // The path that comes in starts with ~/ and must first be made absolute - string path = VirtualPathUtility.ToAbsolute(virtualPath); - - // Add your own modifications here before returning the path - return path; - } - - // Calling ProcessVirtualPath through delegate to allow it to be replaced for unit testing - public static Func ProcessVirtualPath = ProcessVirtualPathDefault; - - // Calling T4Extension.TimestampString through delegate to allow it to be replaced for unit testing and other purposes - public static Func TimestampString = System.Web.Mvc.T4Extensions.TimestampString; - - // Logic to determine if the app is running in production or dev environment - public static bool IsProduction() { - return (HttpContext.Current != null && !HttpContext.Current.IsDebuggingEnabled); - } -} - -<#+ -} -#> diff --git a/elFinder.Net.Web/T4MVC.tt.settings.xml b/elFinder.Net.Web/T4MVC.tt.settings.xml deleted file mode 100644 index bb90b25..0000000 --- a/elFinder.Net.Web/T4MVC.tt.settings.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - T4MVC - - MVC - - - - - - Areas - - - - - - False - - Controllers - - Views - - - DisplayTemplates - EditorTemplates - - - True - - False - - False - - Links - - False - - - Scripts - Content - - - - .cs - - - System.Web.Mvc.RequireHttpsAttribute - False - - True - - False - - Params - - False - Render{0} - - True - \ No newline at end of file diff --git a/elFinder.Net.Web/Views/Home/CkEditorFiles.cshtml b/elFinder.Net.Web/Views/Home/CkEditorFiles.cshtml new file mode 100644 index 0000000..10876cf --- /dev/null +++ b/elFinder.Net.Web/Views/Home/CkEditorFiles.cshtml @@ -0,0 +1,17 @@ +@model FileViewModel + +@{ + ViewBag.Title = "CKEditor Files"; +} +
+ +
+ + \ No newline at end of file diff --git a/elFinder.Net.Web/Views/Home/FileBrowser.cshtml b/elFinder.Net.Web/Views/Home/FileBrowser.cshtml new file mode 100644 index 0000000..ef96d75 --- /dev/null +++ b/elFinder.Net.Web/Views/Home/FileBrowser.cshtml @@ -0,0 +1,98 @@ +@model FileViewModel +@{ + ViewBag.Title = "TinyMCE Files"; + Layout = "../Shared/_PopupLayout.cshtml"; +} +@Styles.Render("~/Content/elfinder") +@Scripts.Render("~/Scripts/elfinder") + + +
\ No newline at end of file diff --git a/elFinder.Net.Web/Views/Home/Files.cshtml b/elFinder.Net.Web/Views/Home/Files.cshtml index 5b06b73..6de5634 100644 --- a/elFinder.Net.Web/Views/Home/Files.cshtml +++ b/elFinder.Net.Web/Views/Home/Files.cshtml @@ -4,4 +4,4 @@ ViewBag.Title = "Files"; } -@Html.Partial(MVC.Shared.Views.FilesForm, Model) \ No newline at end of file +@Html.Partial("FilesForm", Model) \ No newline at end of file diff --git a/elFinder.Net.Web/Views/Home/Index.cshtml b/elFinder.Net.Web/Views/Home/Index.cshtml index d4c627c..9d296b1 100644 --- a/elFinder.Net.Web/Views/Home/Index.cshtml +++ b/elFinder.Net.Web/Views/Home/Index.cshtml @@ -9,6 +9,6 @@ Available 1st level Folders - clicking will navigate you to the File Manager set diff --git a/elFinder.Net.Web/Views/Home/StandAloneFile.cshtml b/elFinder.Net.Web/Views/Home/StandAloneFile.cshtml new file mode 100644 index 0000000..5f1d036 --- /dev/null +++ b/elFinder.Net.Web/Views/Home/StandAloneFile.cshtml @@ -0,0 +1,80 @@ +@model FileViewModel + +@{ + ViewBag.Title = "CKEditor Files"; +} + + + + + + + + +
+
+
+

Popup file browser

+
+
+ +
+ +
+
+
+

Modal file browser

+
+
+ +
+ +
+
+
+
+ + \ No newline at end of file diff --git a/elFinder.Net.Web/Views/Home/TinyMceFiles.cshtml b/elFinder.Net.Web/Views/Home/TinyMceFiles.cshtml new file mode 100644 index 0000000..a4b6440 --- /dev/null +++ b/elFinder.Net.Web/Views/Home/TinyMceFiles.cshtml @@ -0,0 +1,37 @@ +@model FileViewModel + +@{ + ViewBag.Title = "TinyMCE Files"; +} +
+ +
+ + \ No newline at end of file diff --git a/elFinder.Net.Web/Views/Shared/_Layout.cshtml b/elFinder.Net.Web/Views/Shared/_Layout.cshtml index 6a291f8..e863171 100644 --- a/elFinder.Net.Web/Views/Shared/_Layout.cshtml +++ b/elFinder.Net.Web/Views/Shared/_Layout.cshtml @@ -24,6 +24,9 @@ diff --git a/elFinder.Net.Web/Views/Shared/_PopupLayout.cshtml b/elFinder.Net.Web/Views/Shared/_PopupLayout.cshtml new file mode 100644 index 0000000..08a3705 --- /dev/null +++ b/elFinder.Net.Web/Views/Shared/_PopupLayout.cshtml @@ -0,0 +1,15 @@ + + + + + + + + + @Styles.Render("~/Content/themes/ui-lightness/css", "~/Content/css") + @Scripts.Render("~/Scripts/js") + + + @RenderBody() + + diff --git a/elFinder.Net.Web/Web.config b/elFinder.Net.Web/Web.config index 52d28da..a816264 100644 --- a/elFinder.Net.Web/Web.config +++ b/elFinder.Net.Web/Web.config @@ -60,10 +60,7 @@ - - - - + @@ -72,7 +69,7 @@ - + \ No newline at end of file diff --git a/elFinder.Net.Web/elFinder.Net.Web.csproj b/elFinder.Net.Web/elFinder.Net.Web.csproj index e3625e0..e43d5c7 100644 --- a/elFinder.Net.Web/elFinder.Net.Web.csproj +++ b/elFinder.Net.Web/elFinder.Net.Web.csproj @@ -65,6 +65,10 @@ + + True + ..\packages\Microsoft.AspNet.Mvc.4.0.40804.0\lib\net40\System.Web.Mvc.dll + False ..\packages\Microsoft.AspNet.Web.Optimization.1.1.0-Beta1\lib\net40\System.Web.Optimization.dll @@ -91,10 +95,6 @@ True ..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.Helpers.dll - - True - ..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll - True ..\packages\Microsoft.AspNet.Razor.2.0.20715.0\lib\net40\System.Web.Razor.dll @@ -133,24 +133,10 @@ - - T4MVC.tt - Global.asax - - T4MVC.tt - - - T4MVC.tt - - - True - True - T4MVC.tt - @@ -195,6 +181,7 @@ + @@ -239,7 +226,6 @@ - Web.config @@ -255,12 +241,12 @@ - - - TextTemplatingFileGenerator - T4MVC.cs - + + + + + diff --git a/elFinder.Net.Web/packages.config b/elFinder.Net.Web/packages.config index 16f4c4b..0dbdacf 100644 --- a/elFinder.Net.Web/packages.config +++ b/elFinder.Net.Web/packages.config @@ -6,7 +6,7 @@ - + diff --git a/elFinder.Net/Facade/FileSystemDriver.cs b/elFinder.Net/Facade/FileSystemDriver.cs index c0dac4c..83a6aaf 100644 --- a/elFinder.Net/Facade/FileSystemDriver.cs +++ b/elFinder.Net/Facade/FileSystemDriver.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.IO; using System.Linq; using System.Web; @@ -369,7 +370,7 @@ JsonResult IDriver.Paste(string source, string dest, IEnumerable targets } return Json(response); } - JsonResult IDriver.Upload(string target, System.Web.HttpFileCollectionBase targets) + JsonResult IDriver.Upload(string target, HttpFileCollectionBase targets) { FullPath dest = ParsePath(target); var response = new AddResponse(); @@ -386,9 +387,13 @@ JsonResult IDriver.Upload(string target, System.Web.HttpFileCollectionBase targe } for (int i = 0; i < targets.AllKeys.Length; i++) { - HttpPostedFileBase file = targets[i]; - FileInfo path = new FileInfo(Path.Combine(dest.Directory.FullName, Path.GetFileName(file.FileName))); + HttpPostedFileBase file = targets[i]; + var path = + new FileInfo(Path.Combine(dest.Directory.FullName, + Path.GetFileNameWithoutExtension(file.FileName).Transliterate() + + Path.GetExtension(file.FileName))); + string savedfilePath = string.Empty; if (path.Exists) { if (dest.Root.UploadOverwrite) @@ -409,6 +414,8 @@ JsonResult IDriver.Upload(string target, System.Web.HttpFileCollectionBase targe { File.Delete(path.FullName); File.Move(tmpPath, path.FullName); + + savedfilePath = path.FullName; } else { @@ -418,14 +425,43 @@ JsonResult IDriver.Upload(string target, System.Web.HttpFileCollectionBase targe } else { - file.SaveAs(Path.Combine(path.DirectoryName, Helper.GetDuplicatedName(path))); + savedfilePath = Path.Combine(path.DirectoryName, Helper.GetDuplicatedName(path)); + file.SaveAs(savedfilePath); } } else { - file.SaveAs(path.FullName); - } - response.Added.Add((FileDTO)DTOBase.Create(new FileInfo(path.FullName), dest.Root)); + savedfilePath = path.FullName; + file.SaveAs(savedfilePath); + } + + //check dimenssion + FileStream fs = null; + + try + { + fs = new FileStream(savedfilePath, FileMode.Open, FileAccess.Read); + using (var image = Image.FromStream(fs)) + { + if (image.Width != 0)//check it's real image + { + response.Added.Add((FileDTO)DTOBase.Create(new FileInfo(path.FullName), dest.Root)); + } + else + { + return Error.CannotUploadFile(); + } + } + } + catch + { + return Error.CannotUploadFile(); + } + finally + { + if (fs != null) fs.Close(); + } + } return Json(response); } diff --git a/elFinder.Net/Facade/Root.cs b/elFinder.Net/Facade/Root.cs index 7c8c1c9..169e13b 100644 --- a/elFinder.Net/Facade/Root.cs +++ b/elFinder.Net/Facade/Root.cs @@ -254,9 +254,23 @@ internal Size GetImageDimension(FileInfo input) { if (!input.Exists) throw new ArgumentException("File not exist"); - using (Image image = Image.FromFile(input.FullName)) + FileStream fs = null; + + try + { + fs = new FileStream(input.FullName, FileMode.Open, FileAccess.Read); + using (var image = Image.FromStream(fs)) + { + return new Size(image.Width, image.Height); + } + } + catch + { + return new Size(150, 150); + } + finally { - return new Size(image.Width, image.Height); + if (fs != null) fs.Close(); } } diff --git a/elFinder.Net/Facade/StringExtension.cs b/elFinder.Net/Facade/StringExtension.cs new file mode 100644 index 0000000..3fd5f79 --- /dev/null +++ b/elFinder.Net/Facade/StringExtension.cs @@ -0,0 +1,28 @@ +using System.IO; + +namespace ElFinder +{ + using System; + using System.Diagnostics; + using System.Security.Cryptography; + using System.Text; + using System.Text.RegularExpressions; + using System.Web; + using System.Collections.Generic; + + public static class StringExtension + { + private const string InvalidFileNameChars = "[ .,_/\\\\+:;?!@]|<>'()^`"; + + public static string Transliterate(this string text, bool allowunicodeCharacters = false) + { + if (string.IsNullOrEmpty(text)) + { + return string.Empty; + } + var rgx = new Regex(InvalidFileNameChars); + text = rgx.Replace(text, "-").Trim(); + return Utf8ToAsciiConverter.ToAsciiString(text).ToLower(); + } + } +} \ No newline at end of file diff --git a/elFinder.Net/Facade/Utf8ToAsciiConverter.cs b/elFinder.Net/Facade/Utf8ToAsciiConverter.cs new file mode 100644 index 0000000..d9e683f --- /dev/null +++ b/elFinder.Net/Facade/Utf8ToAsciiConverter.cs @@ -0,0 +1,3624 @@ +using System; + +namespace ElFinder +{ + /// + /// Provides methods to convert Utf8 text to Ascii. + /// + /// + /// Tries to match characters such as accented eg "é" to Ascii equivalent eg "e". + /// Converts all "whitespace" characters to a single whitespace. + /// Removes all non-Utf8 (unicode) characters, so in fact it can sort-of "convert" Unicode to Ascii. + /// Replaces symbols with '?'. + /// + internal static class Utf8ToAsciiConverter + { + /// + /// Converts an Utf8 string into an Ascii string. + /// + /// The text to convert. + /// The converted text. + public static string ToAsciiString(string text) + { + var input = text.ToCharArray(); + + // this is faster although it uses more memory + // but... we should be filtering short strings only... + + var output = new char[input.Length * 3]; // *3 because of things such as OE + var len = ToAscii(input, output); + return new string(output, 0, len); + + //var output = new StringBuilder(input.Length + 16); // default is 16, start with at least input length + little extra + //ToAscii(input, output); + //return output.ToString(); + } + + /// + /// Converts an Utf8 string into an array of Ascii characters. + /// + /// The text to convert. + /// The converted text. + public static char[] ToAsciiCharArray(string text) + { + var input = text.ToCharArray(); + + // this is faster although it uses more memory + // but... we should be filtering short strings only... + + var output = new char[input.Length * 3]; // *3 because of things such as OE + var len = ToAscii(input, output); + var array = new char[len]; + Array.Copy(output, array, len); + return array; + + //var temp = new StringBuilder(input.Length + 16); // default is 16, start with at least input length + little extra + //ToAscii(input, temp); + //var output = new char[temp.Length]; + //temp.CopyTo(0, output, 0, temp.Length); + //return output; + } + + /// + /// Converts an array of Utf8 characters into an array of Ascii characters. + /// + /// The input array. + /// The output array. + /// The number of characters in the output array. + /// The caller must ensure that the output array is big enough. + /// The output array is not big enough. + private static int ToAscii(char[] input, char[] output) + { + var opos = 0; + + for (var ipos = 0; ipos < input.Length; ipos++) + if (char.IsSurrogate(input[ipos])) // ignore high surrogate + { + ipos++; // and skip low surrogate + output[opos++] = '?'; + } + else + ToAscii(input, ipos, output, ref opos); + + return opos; + } + + //private static void ToAscii(char[] input, StringBuilder output) + //{ + // var chars = new char[5]; + + // for (var ipos = 0; ipos < input.Length; ipos++) + // { + // var opos = 0; + // if (char.IsSurrogate(input[ipos])) + // ipos++; + // else + // { + // ToAscii(input, ipos, chars, ref opos); + // output.Append(chars, 0, opos); + // } + // } + //} + + /// + /// Converts the character at position in input array of Utf8 characters + /// and writes the converted value to output array of Ascii characters at position , + /// and increments that position accordingly. + /// + /// The input array. + /// The input position. + /// The output array. + /// The output position. + /// + /// Adapted from various sources on the 'net including Lucene.Net.Analysis.ASCIIFoldingFilter. + /// Input should contain Utf8 characters exclusively and NOT Unicode. + /// Removes controls, normalizes whitespaces, replaces symbols by '?'. + /// + private static void ToAscii(char[] input, int ipos, char[] output, ref int opos) + { + var c = input[ipos]; + + if (char.IsControl(c)) + { + // Control characters are non-printing and formatting characters, such as ACK, BEL, CR, FF, LF, and VT. + // The Unicode standard assigns the following code points to control characters: from \U0000 to \U001F, + // \U007F, and from \U0080 to \U009F. According to the Unicode standard, these values are to be + // interpreted as control characters unless their use is otherwise defined by an application. Valid + // control characters are members of the UnicodeCategory.Control category. + + // we don't want them + } + //else if (char.IsSeparator(c)) + //{ + // // The Unicode standard recognizes three subcategories of separators: + // // - Space separators (the UnicodeCategory.SpaceSeparator category), which includes characters such as \u0020. + // // - Line separators (the UnicodeCategory.LineSeparator category), which includes \u2028. + // // - Paragraph separators (the UnicodeCategory.ParagraphSeparator category), which includes \u2029. + // // + // // Note: The Unicode standard classifies the characters \u000A (LF), \u000C (FF), and \u000A (CR) as control + // // characters (members of the UnicodeCategory.Control category), not as separator characters. + + // // better do it via WhiteSpace + //} + else if (char.IsWhiteSpace(c)) + { + // White space characters are the following Unicode characters: + // - Members of the SpaceSeparator category, which includes the characters SPACE (U+0020), + // OGHAM SPACE MARK (U+1680), MONGOLIAN VOWEL SEPARATOR (U+180E), EN QUAD (U+2000), EM QUAD (U+2001), + // EN SPACE (U+2002), EM SPACE (U+2003), THREE-PER-EM SPACE (U+2004), FOUR-PER-EM SPACE (U+2005), + // SIX-PER-EM SPACE (U+2006), FIGURE SPACE (U+2007), PUNCTUATION SPACE (U+2008), THIN SPACE (U+2009), + // HAIR SPACE (U+200A), NARROW NO-BREAK SPACE (U+202F), MEDIUM MATHEMATICAL SPACE (U+205F), + // and IDEOGRAPHIC SPACE (U+3000). + // - Members of the LineSeparator category, which consists solely of the LINE SEPARATOR character (U+2028). + // - Members of the ParagraphSeparator category, which consists solely of the PARAGRAPH SEPARATOR character (U+2029). + // - The characters CHARACTER TABULATION (U+0009), LINE FEED (U+000A), LINE TABULATION (U+000B), + // FORM FEED (U+000C), CARRIAGE RETURN (U+000D), NEXT LINE (U+0085), and NO-BREAK SPACE (U+00A0). + + // make it a whitespace + output[opos++] = ' '; + } + else if (c < '\u0080') + { + // safe + output[opos++] = c; + } + else + { + switch (c) + { + + case '\u00C0': + // À [LATIN CAPITAL LETTER A WITH GRAVE] + case '\u00C1': + // � [LATIN CAPITAL LETTER A WITH ACUTE] + case '\u00C2': + //  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX] + case '\u00C3': + // à [LATIN CAPITAL LETTER A WITH TILDE] + case '\u00C4': + // Ä [LATIN CAPITAL LETTER A WITH DIAERESIS] + case '\u00C5': + // Ã… [LATIN CAPITAL LETTER A WITH RING ABOVE] + case '\u0100': + // Ä€ [LATIN CAPITAL LETTER A WITH MACRON] + case '\u0102': + // Ä‚ [LATIN CAPITAL LETTER A WITH BREVE] + case '\u0104': + // Ä„ [LATIN CAPITAL LETTER A WITH OGONEK] + case '\u018F': + // � http://en.wikipedia.org/wiki/Schwa [LATIN CAPITAL LETTER SCHWA] + case '\u01CD': + // � [LATIN CAPITAL LETTER A WITH CARON] + case '\u01DE': + // Çž [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON] + case '\u01E0': + // Ç  [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON] + case '\u01FA': + // Ǻ [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE] + case '\u0200': + // È€ [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE] + case '\u0202': + // È‚ [LATIN CAPITAL LETTER A WITH INVERTED BREVE] + case '\u0226': + // Ȧ [LATIN CAPITAL LETTER A WITH DOT ABOVE] + case '\u023A': + // Ⱥ [LATIN CAPITAL LETTER A WITH STROKE] + case '\u1D00': + // á´€ [LATIN LETTER SMALL CAPITAL A] + case '\u1E00': + // Ḁ [LATIN CAPITAL LETTER A WITH RING BELOW] + case '\u1EA0': + // Ạ [LATIN CAPITAL LETTER A WITH DOT BELOW] + case '\u1EA2': + // Ả [LATIN CAPITAL LETTER A WITH HOOK ABOVE] + case '\u1EA4': + // Ấ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE] + case '\u1EA6': + // Ầ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE] + case '\u1EA8': + // Ẩ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE] + case '\u1EAA': + // Ẫ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE] + case '\u1EAC': + // Ậ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW] + case '\u1EAE': + // Ắ [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE] + case '\u1EB0': + // Ằ [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE] + case '\u1EB2': + // Ẳ [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE] + case '\u1EB4': + // Ẵ [LATIN CAPITAL LETTER A WITH BREVE AND TILDE] + case '\u1EB6': + // Ặ [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW] + case '\u24B6': + // â’¶ [CIRCLED LATIN CAPITAL LETTER A] + case '\uFF21': // A [FULLWIDTH LATIN CAPITAL LETTER A] + output[opos++] = 'A'; + break; + + case '\u00E0': + // à [LATIN SMALL LETTER A WITH GRAVE] + case '\u00E1': + // á [LATIN SMALL LETTER A WITH ACUTE] + case '\u00E2': + // â [LATIN SMALL LETTER A WITH CIRCUMFLEX] + case '\u00E3': + // ã [LATIN SMALL LETTER A WITH TILDE] + case '\u00E4': + // ä [LATIN SMALL LETTER A WITH DIAERESIS] + case '\u00E5': + // Ã¥ [LATIN SMALL LETTER A WITH RING ABOVE] + case '\u0101': + // � [LATIN SMALL LETTER A WITH MACRON] + case '\u0103': + // ă [LATIN SMALL LETTER A WITH BREVE] + case '\u0105': + // Ä… [LATIN SMALL LETTER A WITH OGONEK] + case '\u01CE': + // ÇŽ [LATIN SMALL LETTER A WITH CARON] + case '\u01DF': + // ÇŸ [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON] + case '\u01E1': + // Ç¡ [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON] + case '\u01FB': + // Ç» [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE] + case '\u0201': + // � [LATIN SMALL LETTER A WITH DOUBLE GRAVE] + case '\u0203': + // ȃ [LATIN SMALL LETTER A WITH INVERTED BREVE] + case '\u0227': + // ȧ [LATIN SMALL LETTER A WITH DOT ABOVE] + case '\u0250': + // � [LATIN SMALL LETTER TURNED A] + case '\u0259': + // É™ [LATIN SMALL LETTER SCHWA] + case '\u025A': + // Éš [LATIN SMALL LETTER SCHWA WITH HOOK] + case '\u1D8F': + // � [LATIN SMALL LETTER A WITH RETROFLEX HOOK] + case '\u1D95': + // á¶• [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK] + case '\u1E01': + // ạ [LATIN SMALL LETTER A WITH RING BELOW] + case '\u1E9A': + // ả [LATIN SMALL LETTER A WITH RIGHT HALF RING] + case '\u1EA1': + // ạ [LATIN SMALL LETTER A WITH DOT BELOW] + case '\u1EA3': + // ả [LATIN SMALL LETTER A WITH HOOK ABOVE] + case '\u1EA5': + // ấ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE] + case '\u1EA7': + // ầ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE] + case '\u1EA9': + // ẩ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE] + case '\u1EAB': + // ẫ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE] + case '\u1EAD': + // ậ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW] + case '\u1EAF': + // ắ [LATIN SMALL LETTER A WITH BREVE AND ACUTE] + case '\u1EB1': + // ằ [LATIN SMALL LETTER A WITH BREVE AND GRAVE] + case '\u1EB3': + // ẳ [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE] + case '\u1EB5': + // ẵ [LATIN SMALL LETTER A WITH BREVE AND TILDE] + case '\u1EB7': + // ặ [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW] + case '\u2090': + // � [LATIN SUBSCRIPT SMALL LETTER A] + case '\u2094': + // �? [LATIN SUBSCRIPT SMALL LETTER SCHWA] + case '\u24D0': + // � [CIRCLED LATIN SMALL LETTER A] + case '\u2C65': + // â±¥ [LATIN SMALL LETTER A WITH STROKE] + case '\u2C6F': + // Ɐ [LATIN CAPITAL LETTER TURNED A] + case '\uFF41': // � [FULLWIDTH LATIN SMALL LETTER A] + output[opos++] = 'a'; + break; + + case '\uA732': // Ꜳ [LATIN CAPITAL LETTER AA] + output[opos++] = 'A'; + output[opos++] = 'A'; + break; + + case '\u00C6': + // Æ [LATIN CAPITAL LETTER AE] + case '\u01E2': + // Ç¢ [LATIN CAPITAL LETTER AE WITH MACRON] + case '\u01FC': + // Ǽ [LATIN CAPITAL LETTER AE WITH ACUTE] + case '\u1D01': // á´� [LATIN LETTER SMALL CAPITAL AE] + output[opos++] = 'A'; + output[opos++] = 'E'; + break; + + case '\uA734': // Ꜵ [LATIN CAPITAL LETTER AO] + output[opos++] = 'A'; + output[opos++] = 'O'; + break; + + case '\uA736': // Ꜷ [LATIN CAPITAL LETTER AU] + output[opos++] = 'A'; + output[opos++] = 'U'; + break; + + case '\uA738': + // Ꜹ [LATIN CAPITAL LETTER AV] + case '\uA73A': // Ꜻ [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR] + output[opos++] = 'A'; + output[opos++] = 'V'; + break; + + case '\uA73C': // Ꜽ [LATIN CAPITAL LETTER AY] + output[opos++] = 'A'; + output[opos++] = 'Y'; + break; + + case '\u249C': // â’œ [PARENTHESIZED LATIN SMALL LETTER A] + output[opos++] = '('; + output[opos++] = 'a'; + output[opos++] = ')'; + break; + + case '\uA733': // ꜳ [LATIN SMALL LETTER AA] + output[opos++] = 'a'; + output[opos++] = 'a'; + break; + + case '\u00E6': + // æ [LATIN SMALL LETTER AE] + case '\u01E3': + // Ç£ [LATIN SMALL LETTER AE WITH MACRON] + case '\u01FD': + // ǽ [LATIN SMALL LETTER AE WITH ACUTE] + case '\u1D02': // á´‚ [LATIN SMALL LETTER TURNED AE] + output[opos++] = 'a'; + output[opos++] = 'e'; + break; + + case '\uA735': // ꜵ [LATIN SMALL LETTER AO] + output[opos++] = 'a'; + output[opos++] = 'o'; + break; + + case '\uA737': // ꜷ [LATIN SMALL LETTER AU] + output[opos++] = 'a'; + output[opos++] = 'u'; + break; + + case '\uA739': + // ꜹ [LATIN SMALL LETTER AV] + case '\uA73B': // ꜻ [LATIN SMALL LETTER AV WITH HORIZONTAL BAR] + output[opos++] = 'a'; + output[opos++] = 'v'; + break; + + case '\uA73D': // ꜽ [LATIN SMALL LETTER AY] + output[opos++] = 'a'; + output[opos++] = 'y'; + break; + + case '\u0181': + // � [LATIN CAPITAL LETTER B WITH HOOK] + case '\u0182': + // Æ‚ [LATIN CAPITAL LETTER B WITH TOPBAR] + case '\u0243': + // Ƀ [LATIN CAPITAL LETTER B WITH STROKE] + case '\u0299': + // Ê™ [LATIN LETTER SMALL CAPITAL B] + case '\u1D03': + // á´ƒ [LATIN LETTER SMALL CAPITAL BARRED B] + case '\u1E02': + // Ḃ [LATIN CAPITAL LETTER B WITH DOT ABOVE] + case '\u1E04': + // Ḅ [LATIN CAPITAL LETTER B WITH DOT BELOW] + case '\u1E06': + // Ḇ [LATIN CAPITAL LETTER B WITH LINE BELOW] + case '\u24B7': + // â’· [CIRCLED LATIN CAPITAL LETTER B] + case '\uFF22': // ï¼¢ [FULLWIDTH LATIN CAPITAL LETTER B] + output[opos++] = 'B'; + break; + + case '\u0180': + // Æ€ [LATIN SMALL LETTER B WITH STROKE] + case '\u0183': + // ƃ [LATIN SMALL LETTER B WITH TOPBAR] + case '\u0253': + // É“ [LATIN SMALL LETTER B WITH HOOK] + case '\u1D6C': + // ᵬ [LATIN SMALL LETTER B WITH MIDDLE TILDE] + case '\u1D80': + // á¶€ [LATIN SMALL LETTER B WITH PALATAL HOOK] + case '\u1E03': + // ḃ [LATIN SMALL LETTER B WITH DOT ABOVE] + case '\u1E05': + // ḅ [LATIN SMALL LETTER B WITH DOT BELOW] + case '\u1E07': + // ḇ [LATIN SMALL LETTER B WITH LINE BELOW] + case '\u24D1': + // â“‘ [CIRCLED LATIN SMALL LETTER B] + case '\uFF42': // b [FULLWIDTH LATIN SMALL LETTER B] + output[opos++] = 'b'; + break; + + case '\u249D': // â’� [PARENTHESIZED LATIN SMALL LETTER B] + output[opos++] = '('; + output[opos++] = 'b'; + output[opos++] = ')'; + break; + + case '\u00C7': + // Ç [LATIN CAPITAL LETTER C WITH CEDILLA] + case '\u0106': + // Ć [LATIN CAPITAL LETTER C WITH ACUTE] + case '\u0108': + // Ĉ [LATIN CAPITAL LETTER C WITH CIRCUMFLEX] + case '\u010A': + // ÄŠ [LATIN CAPITAL LETTER C WITH DOT ABOVE] + case '\u010C': + // ÄŒ [LATIN CAPITAL LETTER C WITH CARON] + case '\u0187': + // Ƈ [LATIN CAPITAL LETTER C WITH HOOK] + case '\u023B': + // È» [LATIN CAPITAL LETTER C WITH STROKE] + case '\u0297': + // Ê— [LATIN LETTER STRETCHED C] + case '\u1D04': + // á´„ [LATIN LETTER SMALL CAPITAL C] + case '\u1E08': + // Ḉ [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE] + case '\u24B8': + // â’¸ [CIRCLED LATIN CAPITAL LETTER C] + case '\uFF23': // ï¼£ [FULLWIDTH LATIN CAPITAL LETTER C] + output[opos++] = 'C'; + break; + + case '\u00E7': + // ç [LATIN SMALL LETTER C WITH CEDILLA] + case '\u0107': + // ć [LATIN SMALL LETTER C WITH ACUTE] + case '\u0109': + // ĉ [LATIN SMALL LETTER C WITH CIRCUMFLEX] + case '\u010B': + // Ä‹ [LATIN SMALL LETTER C WITH DOT ABOVE] + case '\u010D': + // � [LATIN SMALL LETTER C WITH CARON] + case '\u0188': + // ƈ [LATIN SMALL LETTER C WITH HOOK] + case '\u023C': + // ȼ [LATIN SMALL LETTER C WITH STROKE] + case '\u0255': + // É• [LATIN SMALL LETTER C WITH CURL] + case '\u1E09': + // ḉ [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE] + case '\u2184': + // ↄ [LATIN SMALL LETTER REVERSED C] + case '\u24D2': + // â“’ [CIRCLED LATIN SMALL LETTER C] + case '\uA73E': + // Ꜿ [LATIN CAPITAL LETTER REVERSED C WITH DOT] + case '\uA73F': + // ꜿ [LATIN SMALL LETTER REVERSED C WITH DOT] + case '\uFF43': // c [FULLWIDTH LATIN SMALL LETTER C] + output[opos++] = 'c'; + break; + + case '\u249E': // â’ž [PARENTHESIZED LATIN SMALL LETTER C] + output[opos++] = '('; + output[opos++] = 'c'; + output[opos++] = ')'; + break; + + case '\u00D0': + // � [LATIN CAPITAL LETTER ETH] + case '\u010E': + // ÄŽ [LATIN CAPITAL LETTER D WITH CARON] + case '\u0110': + // � [LATIN CAPITAL LETTER D WITH STROKE] + case '\u0189': + // Ɖ [LATIN CAPITAL LETTER AFRICAN D] + case '\u018A': + // ÆŠ [LATIN CAPITAL LETTER D WITH HOOK] + case '\u018B': + // Æ‹ [LATIN CAPITAL LETTER D WITH TOPBAR] + case '\u1D05': + // á´… [LATIN LETTER SMALL CAPITAL D] + case '\u1D06': + // á´† [LATIN LETTER SMALL CAPITAL ETH] + case '\u1E0A': + // Ḋ [LATIN CAPITAL LETTER D WITH DOT ABOVE] + case '\u1E0C': + // Ḍ [LATIN CAPITAL LETTER D WITH DOT BELOW] + case '\u1E0E': + // Ḏ [LATIN CAPITAL LETTER D WITH LINE BELOW] + case '\u1E10': + // � [LATIN CAPITAL LETTER D WITH CEDILLA] + case '\u1E12': + // Ḓ [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW] + case '\u24B9': + // â’¹ [CIRCLED LATIN CAPITAL LETTER D] + case '\uA779': + // � [LATIN CAPITAL LETTER INSULAR D] + case '\uFF24': // D [FULLWIDTH LATIN CAPITAL LETTER D] + output[opos++] = 'D'; + break; + + case '\u00F0': + // ð [LATIN SMALL LETTER ETH] + case '\u010F': + // � [LATIN SMALL LETTER D WITH CARON] + case '\u0111': + // Ä‘ [LATIN SMALL LETTER D WITH STROKE] + case '\u018C': + // ÆŒ [LATIN SMALL LETTER D WITH TOPBAR] + case '\u0221': + // È¡ [LATIN SMALL LETTER D WITH CURL] + case '\u0256': + // É– [LATIN SMALL LETTER D WITH TAIL] + case '\u0257': + // É— [LATIN SMALL LETTER D WITH HOOK] + case '\u1D6D': + // áµ­ [LATIN SMALL LETTER D WITH MIDDLE TILDE] + case '\u1D81': + // � [LATIN SMALL LETTER D WITH PALATAL HOOK] + case '\u1D91': + // á¶‘ [LATIN SMALL LETTER D WITH HOOK AND TAIL] + case '\u1E0B': + // ḋ [LATIN SMALL LETTER D WITH DOT ABOVE] + case '\u1E0D': + // � [LATIN SMALL LETTER D WITH DOT BELOW] + case '\u1E0F': + // � [LATIN SMALL LETTER D WITH LINE BELOW] + case '\u1E11': + // ḑ [LATIN SMALL LETTER D WITH CEDILLA] + case '\u1E13': + // ḓ [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW] + case '\u24D3': + // â““ [CIRCLED LATIN SMALL LETTER D] + case '\uA77A': + // � [LATIN SMALL LETTER INSULAR D] + case '\uFF44': // d [FULLWIDTH LATIN SMALL LETTER D] + output[opos++] = 'd'; + break; + + case '\u01C4': + // Ç„ [LATIN CAPITAL LETTER DZ WITH CARON] + case '\u01F1': // DZ [LATIN CAPITAL LETTER DZ] + output[opos++] = 'D'; + output[opos++] = 'Z'; + break; + + case '\u01C5': + // Ç… [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON] + case '\u01F2': // Dz [LATIN CAPITAL LETTER D WITH SMALL LETTER Z] + output[opos++] = 'D'; + output[opos++] = 'z'; + break; + + case '\u249F': // â’Ÿ [PARENTHESIZED LATIN SMALL LETTER D] + output[opos++] = '('; + output[opos++] = 'd'; + output[opos++] = ')'; + break; + + case '\u0238': // ȸ [LATIN SMALL LETTER DB DIGRAPH] + output[opos++] = 'd'; + output[opos++] = 'b'; + break; + + case '\u01C6': + // dž [LATIN SMALL LETTER DZ WITH CARON] + case '\u01F3': + // dz [LATIN SMALL LETTER DZ] + case '\u02A3': + // Ê£ [LATIN SMALL LETTER DZ DIGRAPH] + case '\u02A5': // Ê¥ [LATIN SMALL LETTER DZ DIGRAPH WITH CURL] + output[opos++] = 'd'; + output[opos++] = 'z'; + break; + + case '\u00C8': + // È [LATIN CAPITAL LETTER E WITH GRAVE] + case '\u00C9': + // É [LATIN CAPITAL LETTER E WITH ACUTE] + case '\u00CA': + // Ê [LATIN CAPITAL LETTER E WITH CIRCUMFLEX] + case '\u00CB': + // Ë [LATIN CAPITAL LETTER E WITH DIAERESIS] + case '\u0112': + // Ä’ [LATIN CAPITAL LETTER E WITH MACRON] + case '\u0114': + // �? [LATIN CAPITAL LETTER E WITH BREVE] + case '\u0116': + // Ä– [LATIN CAPITAL LETTER E WITH DOT ABOVE] + case '\u0118': + // Ę [LATIN CAPITAL LETTER E WITH OGONEK] + case '\u011A': + // Äš [LATIN CAPITAL LETTER E WITH CARON] + case '\u018E': + // ÆŽ [LATIN CAPITAL LETTER REVERSED E] + case '\u0190': + // � [LATIN CAPITAL LETTER OPEN E] + case '\u0204': + // È„ [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE] + case '\u0206': + // Ȇ [LATIN CAPITAL LETTER E WITH INVERTED BREVE] + case '\u0228': + // Ȩ [LATIN CAPITAL LETTER E WITH CEDILLA] + case '\u0246': + // Ɇ [LATIN CAPITAL LETTER E WITH STROKE] + case '\u1D07': + // á´‡ [LATIN LETTER SMALL CAPITAL E] + case '\u1E14': + // �? [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE] + case '\u1E16': + // Ḗ [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE] + case '\u1E18': + // Ḙ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW] + case '\u1E1A': + // Ḛ [LATIN CAPITAL LETTER E WITH TILDE BELOW] + case '\u1E1C': + // Ḝ [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE] + case '\u1EB8': + // Ẹ [LATIN CAPITAL LETTER E WITH DOT BELOW] + case '\u1EBA': + // Ẻ [LATIN CAPITAL LETTER E WITH HOOK ABOVE] + case '\u1EBC': + // Ẽ [LATIN CAPITAL LETTER E WITH TILDE] + case '\u1EBE': + // Ế [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE] + case '\u1EC0': + // Ề [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE] + case '\u1EC2': + // Ể [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE] + case '\u1EC4': + // Ễ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE] + case '\u1EC6': + // Ệ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW] + case '\u24BA': + // â’º [CIRCLED LATIN CAPITAL LETTER E] + case '\u2C7B': + // â±» [LATIN LETTER SMALL CAPITAL TURNED E] + case '\uFF25': // ï¼¥ [FULLWIDTH LATIN CAPITAL LETTER E] + output[opos++] = 'E'; + break; + + case '\u00E8': + // è [LATIN SMALL LETTER E WITH GRAVE] + case '\u00E9': + // é [LATIN SMALL LETTER E WITH ACUTE] + case '\u00EA': + // ê [LATIN SMALL LETTER E WITH CIRCUMFLEX] + case '\u00EB': + // ë [LATIN SMALL LETTER E WITH DIAERESIS] + case '\u0113': + // Ä“ [LATIN SMALL LETTER E WITH MACRON] + case '\u0115': + // Ä• [LATIN SMALL LETTER E WITH BREVE] + case '\u0117': + // Ä— [LATIN SMALL LETTER E WITH DOT ABOVE] + case '\u0119': + // Ä™ [LATIN SMALL LETTER E WITH OGONEK] + case '\u011B': + // Ä› [LATIN SMALL LETTER E WITH CARON] + case '\u01DD': + // � [LATIN SMALL LETTER TURNED E] + case '\u0205': + // È… [LATIN SMALL LETTER E WITH DOUBLE GRAVE] + case '\u0207': + // ȇ [LATIN SMALL LETTER E WITH INVERTED BREVE] + case '\u0229': + // È© [LATIN SMALL LETTER E WITH CEDILLA] + case '\u0247': + // ɇ [LATIN SMALL LETTER E WITH STROKE] + case '\u0258': + // ɘ [LATIN SMALL LETTER REVERSED E] + case '\u025B': + // É› [LATIN SMALL LETTER OPEN E] + case '\u025C': + // Éœ [LATIN SMALL LETTER REVERSED OPEN E] + case '\u025D': + // � [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK] + case '\u025E': + // Éž [LATIN SMALL LETTER CLOSED REVERSED OPEN E] + case '\u029A': + // Êš [LATIN SMALL LETTER CLOSED OPEN E] + case '\u1D08': + // á´ˆ [LATIN SMALL LETTER TURNED OPEN E] + case '\u1D92': + // á¶’ [LATIN SMALL LETTER E WITH RETROFLEX HOOK] + case '\u1D93': + // á¶“ [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK] + case '\u1D94': + // �? [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK] + case '\u1E15': + // ḕ [LATIN SMALL LETTER E WITH MACRON AND GRAVE] + case '\u1E17': + // ḗ [LATIN SMALL LETTER E WITH MACRON AND ACUTE] + case '\u1E19': + // ḙ [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW] + case '\u1E1B': + // ḛ [LATIN SMALL LETTER E WITH TILDE BELOW] + case '\u1E1D': + // � [LATIN SMALL LETTER E WITH CEDILLA AND BREVE] + case '\u1EB9': + // ẹ [LATIN SMALL LETTER E WITH DOT BELOW] + case '\u1EBB': + // ẻ [LATIN SMALL LETTER E WITH HOOK ABOVE] + case '\u1EBD': + // ẽ [LATIN SMALL LETTER E WITH TILDE] + case '\u1EBF': + // ế [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE] + case '\u1EC1': + // � [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE] + case '\u1EC3': + // ể [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE] + case '\u1EC5': + // á»… [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE] + case '\u1EC7': + // ệ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW] + case '\u2091': + // â‚‘ [LATIN SUBSCRIPT SMALL LETTER E] + case '\u24D4': + // �? [CIRCLED LATIN SMALL LETTER E] + case '\u2C78': + // ⱸ [LATIN SMALL LETTER E WITH NOTCH] + case '\uFF45': // ï½… [FULLWIDTH LATIN SMALL LETTER E] + output[opos++] = 'e'; + break; + + case '\u24A0': // â’  [PARENTHESIZED LATIN SMALL LETTER E] + output[opos++] = '('; + output[opos++] = 'e'; + output[opos++] = ')'; + break; + + case '\u0191': + // Æ‘ [LATIN CAPITAL LETTER F WITH HOOK] + case '\u1E1E': + // Ḟ [LATIN CAPITAL LETTER F WITH DOT ABOVE] + case '\u24BB': + // â’» [CIRCLED LATIN CAPITAL LETTER F] + case '\uA730': + // ꜰ [LATIN LETTER SMALL CAPITAL F] + case '\uA77B': + // � [LATIN CAPITAL LETTER INSULAR F] + case '\uA7FB': + // ꟻ [LATIN EPIGRAPHIC LETTER REVERSED F] + case '\uFF26': // F [FULLWIDTH LATIN CAPITAL LETTER F] + output[opos++] = 'F'; + break; + + case '\u0192': + // Æ’ [LATIN SMALL LETTER F WITH HOOK] + case '\u1D6E': + // áµ® [LATIN SMALL LETTER F WITH MIDDLE TILDE] + case '\u1D82': + // á¶‚ [LATIN SMALL LETTER F WITH PALATAL HOOK] + case '\u1E1F': + // ḟ [LATIN SMALL LETTER F WITH DOT ABOVE] + case '\u1E9B': + // ẛ [LATIN SMALL LETTER LONG S WITH DOT ABOVE] + case '\u24D5': + // â“• [CIRCLED LATIN SMALL LETTER F] + case '\uA77C': + // � [LATIN SMALL LETTER INSULAR F] + case '\uFF46': // f [FULLWIDTH LATIN SMALL LETTER F] + output[opos++] = 'f'; + break; + + case '\u24A1': // â’¡ [PARENTHESIZED LATIN SMALL LETTER F] + output[opos++] = '('; + output[opos++] = 'f'; + output[opos++] = ')'; + break; + + case '\uFB00': // ff [LATIN SMALL LIGATURE FF] + output[opos++] = 'f'; + output[opos++] = 'f'; + break; + + case '\uFB03': // ffi [LATIN SMALL LIGATURE FFI] + output[opos++] = 'f'; + output[opos++] = 'f'; + output[opos++] = 'i'; + break; + + case '\uFB04': // ffl [LATIN SMALL LIGATURE FFL] + output[opos++] = 'f'; + output[opos++] = 'f'; + output[opos++] = 'l'; + break; + + case '\uFB01': // � [LATIN SMALL LIGATURE FI] + output[opos++] = 'f'; + output[opos++] = 'i'; + break; + + case '\uFB02': // fl [LATIN SMALL LIGATURE FL] + output[opos++] = 'f'; + output[opos++] = 'l'; + break; + + case '\u011C': + // Äœ [LATIN CAPITAL LETTER G WITH CIRCUMFLEX] + case '\u011E': + // Äž [LATIN CAPITAL LETTER G WITH BREVE] + case '\u0120': + // Ä  [LATIN CAPITAL LETTER G WITH DOT ABOVE] + case '\u0122': + // Ä¢ [LATIN CAPITAL LETTER G WITH CEDILLA] + case '\u0193': + // Æ“ [LATIN CAPITAL LETTER G WITH HOOK] + case '\u01E4': + // Ǥ [LATIN CAPITAL LETTER G WITH STROKE] + case '\u01E5': + // Ç¥ [LATIN SMALL LETTER G WITH STROKE] + case '\u01E6': + // Ǧ [LATIN CAPITAL LETTER G WITH CARON] + case '\u01E7': + // ǧ [LATIN SMALL LETTER G WITH CARON] + case '\u01F4': + // Ç´ [LATIN CAPITAL LETTER G WITH ACUTE] + case '\u0262': + // É¢ [LATIN LETTER SMALL CAPITAL G] + case '\u029B': + // Ê› [LATIN LETTER SMALL CAPITAL G WITH HOOK] + case '\u1E20': + // Ḡ [LATIN CAPITAL LETTER G WITH MACRON] + case '\u24BC': + // â’¼ [CIRCLED LATIN CAPITAL LETTER G] + case '\uA77D': + // � [LATIN CAPITAL LETTER INSULAR G] + case '\uA77E': + // � [LATIN CAPITAL LETTER TURNED INSULAR G] + case '\uFF27': // ï¼§ [FULLWIDTH LATIN CAPITAL LETTER G] + output[opos++] = 'G'; + break; + + case '\u011D': + // � [LATIN SMALL LETTER G WITH CIRCUMFLEX] + case '\u011F': + // ÄŸ [LATIN SMALL LETTER G WITH BREVE] + case '\u0121': + // Ä¡ [LATIN SMALL LETTER G WITH DOT ABOVE] + case '\u0123': + // Ä£ [LATIN SMALL LETTER G WITH CEDILLA] + case '\u01F5': + // ǵ [LATIN SMALL LETTER G WITH ACUTE] + case '\u0260': + // É  [LATIN SMALL LETTER G WITH HOOK] + case '\u0261': + // É¡ [LATIN SMALL LETTER SCRIPT G] + case '\u1D77': + // áµ· [LATIN SMALL LETTER TURNED G] + case '\u1D79': + // áµ¹ [LATIN SMALL LETTER INSULAR G] + case '\u1D83': + // ᶃ [LATIN SMALL LETTER G WITH PALATAL HOOK] + case '\u1E21': + // ḡ [LATIN SMALL LETTER G WITH MACRON] + case '\u24D6': + // â“– [CIRCLED LATIN SMALL LETTER G] + case '\uA77F': + // � [LATIN SMALL LETTER TURNED INSULAR G] + case '\uFF47': // g [FULLWIDTH LATIN SMALL LETTER G] + output[opos++] = 'g'; + break; + + case '\u24A2': // â’¢ [PARENTHESIZED LATIN SMALL LETTER G] + output[opos++] = '('; + output[opos++] = 'g'; + output[opos++] = ')'; + break; + + case '\u0124': + // Ĥ [LATIN CAPITAL LETTER H WITH CIRCUMFLEX] + case '\u0126': + // Ħ [LATIN CAPITAL LETTER H WITH STROKE] + case '\u021E': + // Èž [LATIN CAPITAL LETTER H WITH CARON] + case '\u029C': + // Êœ [LATIN LETTER SMALL CAPITAL H] + case '\u1E22': + // Ḣ [LATIN CAPITAL LETTER H WITH DOT ABOVE] + case '\u1E24': + // Ḥ [LATIN CAPITAL LETTER H WITH DOT BELOW] + case '\u1E26': + // Ḧ [LATIN CAPITAL LETTER H WITH DIAERESIS] + case '\u1E28': + // Ḩ [LATIN CAPITAL LETTER H WITH CEDILLA] + case '\u1E2A': + // Ḫ [LATIN CAPITAL LETTER H WITH BREVE BELOW] + case '\u24BD': + // â’½ [CIRCLED LATIN CAPITAL LETTER H] + case '\u2C67': + // â±§ [LATIN CAPITAL LETTER H WITH DESCENDER] + case '\u2C75': + // â±µ [LATIN CAPITAL LETTER HALF H] + case '\uFF28': // H [FULLWIDTH LATIN CAPITAL LETTER H] + output[opos++] = 'H'; + break; + + case '\u0125': + // Ä¥ [LATIN SMALL LETTER H WITH CIRCUMFLEX] + case '\u0127': + // ħ [LATIN SMALL LETTER H WITH STROKE] + case '\u021F': + // ÈŸ [LATIN SMALL LETTER H WITH CARON] + case '\u0265': + // É¥ [LATIN SMALL LETTER TURNED H] + case '\u0266': + // ɦ [LATIN SMALL LETTER H WITH HOOK] + case '\u02AE': + // Ê® [LATIN SMALL LETTER TURNED H WITH FISHHOOK] + case '\u02AF': + // ʯ [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL] + case '\u1E23': + // ḣ [LATIN SMALL LETTER H WITH DOT ABOVE] + case '\u1E25': + // ḥ [LATIN SMALL LETTER H WITH DOT BELOW] + case '\u1E27': + // ḧ [LATIN SMALL LETTER H WITH DIAERESIS] + case '\u1E29': + // ḩ [LATIN SMALL LETTER H WITH CEDILLA] + case '\u1E2B': + // ḫ [LATIN SMALL LETTER H WITH BREVE BELOW] + case '\u1E96': + // ẖ [LATIN SMALL LETTER H WITH LINE BELOW] + case '\u24D7': + // â“— [CIRCLED LATIN SMALL LETTER H] + case '\u2C68': + // ⱨ [LATIN SMALL LETTER H WITH DESCENDER] + case '\u2C76': + // â±¶ [LATIN SMALL LETTER HALF H] + case '\uFF48': // h [FULLWIDTH LATIN SMALL LETTER H] + output[opos++] = 'h'; + break; + + case '\u01F6': // Ƕ http://en.wikipedia.org/wiki/Hwair [LATIN CAPITAL LETTER HWAIR] + output[opos++] = 'H'; + output[opos++] = 'V'; + break; + + case '\u24A3': // â’£ [PARENTHESIZED LATIN SMALL LETTER H] + output[opos++] = '('; + output[opos++] = 'h'; + output[opos++] = ')'; + break; + + case '\u0195': // Æ• [LATIN SMALL LETTER HV] + output[opos++] = 'h'; + output[opos++] = 'v'; + break; + + case '\u00CC': + // ÃŒ [LATIN CAPITAL LETTER I WITH GRAVE] + case '\u00CD': + // � [LATIN CAPITAL LETTER I WITH ACUTE] + case '\u00CE': + // ÃŽ [LATIN CAPITAL LETTER I WITH CIRCUMFLEX] + case '\u00CF': + // � [LATIN CAPITAL LETTER I WITH DIAERESIS] + case '\u0128': + // Ĩ [LATIN CAPITAL LETTER I WITH TILDE] + case '\u012A': + // Ī [LATIN CAPITAL LETTER I WITH MACRON] + case '\u012C': + // Ĭ [LATIN CAPITAL LETTER I WITH BREVE] + case '\u012E': + // Ä® [LATIN CAPITAL LETTER I WITH OGONEK] + case '\u0130': + // İ [LATIN CAPITAL LETTER I WITH DOT ABOVE] + case '\u0196': + // Æ– [LATIN CAPITAL LETTER IOTA] + case '\u0197': + // Æ— [LATIN CAPITAL LETTER I WITH STROKE] + case '\u01CF': + // � [LATIN CAPITAL LETTER I WITH CARON] + case '\u0208': + // Ȉ [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE] + case '\u020A': + // ÈŠ [LATIN CAPITAL LETTER I WITH INVERTED BREVE] + case '\u026A': + // ɪ [LATIN LETTER SMALL CAPITAL I] + case '\u1D7B': + // áµ» [LATIN SMALL CAPITAL LETTER I WITH STROKE] + case '\u1E2C': + // Ḭ [LATIN CAPITAL LETTER I WITH TILDE BELOW] + case '\u1E2E': + // Ḯ [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE] + case '\u1EC8': + // Ỉ [LATIN CAPITAL LETTER I WITH HOOK ABOVE] + case '\u1ECA': + // Ị [LATIN CAPITAL LETTER I WITH DOT BELOW] + case '\u24BE': + // â’¾ [CIRCLED LATIN CAPITAL LETTER I] + case '\uA7FE': + // ꟾ [LATIN EPIGRAPHIC LETTER I LONGA] + case '\uFF29': // I [FULLWIDTH LATIN CAPITAL LETTER I] + output[opos++] = 'I'; + break; + + case '\u00EC': + // ì [LATIN SMALL LETTER I WITH GRAVE] + case '\u00ED': + // í [LATIN SMALL LETTER I WITH ACUTE] + case '\u00EE': + // î [LATIN SMALL LETTER I WITH CIRCUMFLEX] + case '\u00EF': + // ï [LATIN SMALL LETTER I WITH DIAERESIS] + case '\u0129': + // Ä© [LATIN SMALL LETTER I WITH TILDE] + case '\u012B': + // Ä« [LATIN SMALL LETTER I WITH MACRON] + case '\u012D': + // Ä­ [LATIN SMALL LETTER I WITH BREVE] + case '\u012F': + // į [LATIN SMALL LETTER I WITH OGONEK] + case '\u0131': + // ı [LATIN SMALL LETTER DOTLESS I] + case '\u01D0': + // � [LATIN SMALL LETTER I WITH CARON] + case '\u0209': + // ȉ [LATIN SMALL LETTER I WITH DOUBLE GRAVE] + case '\u020B': + // È‹ [LATIN SMALL LETTER I WITH INVERTED BREVE] + case '\u0268': + // ɨ [LATIN SMALL LETTER I WITH STROKE] + case '\u1D09': + // á´‰ [LATIN SMALL LETTER TURNED I] + case '\u1D62': + // áµ¢ [LATIN SUBSCRIPT SMALL LETTER I] + case '\u1D7C': + // áµ¼ [LATIN SMALL LETTER IOTA WITH STROKE] + case '\u1D96': + // á¶– [LATIN SMALL LETTER I WITH RETROFLEX HOOK] + case '\u1E2D': + // ḭ [LATIN SMALL LETTER I WITH TILDE BELOW] + case '\u1E2F': + // ḯ [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE] + case '\u1EC9': + // ỉ [LATIN SMALL LETTER I WITH HOOK ABOVE] + case '\u1ECB': + // ị [LATIN SMALL LETTER I WITH DOT BELOW] + case '\u2071': + // � [SUPERSCRIPT LATIN SMALL LETTER I] + case '\u24D8': + // ⓘ [CIRCLED LATIN SMALL LETTER I] + case '\uFF49': // i [FULLWIDTH LATIN SMALL LETTER I] + output[opos++] = 'i'; + break; + + case '\u0132': // IJ [LATIN CAPITAL LIGATURE IJ] + output[opos++] = 'I'; + output[opos++] = 'J'; + break; + + case '\u24A4': // â’¤ [PARENTHESIZED LATIN SMALL LETTER I] + output[opos++] = '('; + output[opos++] = 'i'; + output[opos++] = ')'; + break; + + case '\u0133': // ij [LATIN SMALL LIGATURE IJ] + output[opos++] = 'i'; + output[opos++] = 'j'; + break; + + case '\u0134': + // Ä´ [LATIN CAPITAL LETTER J WITH CIRCUMFLEX] + case '\u0248': + // Ɉ [LATIN CAPITAL LETTER J WITH STROKE] + case '\u1D0A': + // á´Š [LATIN LETTER SMALL CAPITAL J] + case '\u24BF': + // â’¿ [CIRCLED LATIN CAPITAL LETTER J] + case '\uFF2A': // J [FULLWIDTH LATIN CAPITAL LETTER J] + output[opos++] = 'J'; + break; + + case '\u0135': + // ĵ [LATIN SMALL LETTER J WITH CIRCUMFLEX] + case '\u01F0': + // ǰ [LATIN SMALL LETTER J WITH CARON] + case '\u0237': + // È· [LATIN SMALL LETTER DOTLESS J] + case '\u0249': + // ɉ [LATIN SMALL LETTER J WITH STROKE] + case '\u025F': + // ÉŸ [LATIN SMALL LETTER DOTLESS J WITH STROKE] + case '\u0284': + // Ê„ [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK] + case '\u029D': + // � [LATIN SMALL LETTER J WITH CROSSED-TAIL] + case '\u24D9': + // â“™ [CIRCLED LATIN SMALL LETTER J] + case '\u2C7C': + // â±¼ [LATIN SUBSCRIPT SMALL LETTER J] + case '\uFF4A': // j [FULLWIDTH LATIN SMALL LETTER J] + output[opos++] = 'j'; + break; + + case '\u24A5': // â’¥ [PARENTHESIZED LATIN SMALL LETTER J] + output[opos++] = '('; + output[opos++] = 'j'; + output[opos++] = ')'; + break; + + case '\u0136': + // Ķ [LATIN CAPITAL LETTER K WITH CEDILLA] + case '\u0198': + // Ƙ [LATIN CAPITAL LETTER K WITH HOOK] + case '\u01E8': + // Ǩ [LATIN CAPITAL LETTER K WITH CARON] + case '\u1D0B': + // á´‹ [LATIN LETTER SMALL CAPITAL K] + case '\u1E30': + // Ḱ [LATIN CAPITAL LETTER K WITH ACUTE] + case '\u1E32': + // Ḳ [LATIN CAPITAL LETTER K WITH DOT BELOW] + case '\u1E34': + // Ḵ [LATIN CAPITAL LETTER K WITH LINE BELOW] + case '\u24C0': + // â“€ [CIRCLED LATIN CAPITAL LETTER K] + case '\u2C69': + // Ⱪ [LATIN CAPITAL LETTER K WITH DESCENDER] + case '\uA740': + // � [LATIN CAPITAL LETTER K WITH STROKE] + case '\uA742': + // � [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE] + case '\uA744': + // � [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE] + case '\uFF2B': // K [FULLWIDTH LATIN CAPITAL LETTER K] + output[opos++] = 'K'; + break; + + case '\u0137': + // Ä· [LATIN SMALL LETTER K WITH CEDILLA] + case '\u0199': + // Æ™ [LATIN SMALL LETTER K WITH HOOK] + case '\u01E9': + // Ç© [LATIN SMALL LETTER K WITH CARON] + case '\u029E': + // Êž [LATIN SMALL LETTER TURNED K] + case '\u1D84': + // á¶„ [LATIN SMALL LETTER K WITH PALATAL HOOK] + case '\u1E31': + // ḱ [LATIN SMALL LETTER K WITH ACUTE] + case '\u1E33': + // ḳ [LATIN SMALL LETTER K WITH DOT BELOW] + case '\u1E35': + // ḵ [LATIN SMALL LETTER K WITH LINE BELOW] + case '\u24DA': + // ⓚ [CIRCLED LATIN SMALL LETTER K] + case '\u2C6A': + // ⱪ [LATIN SMALL LETTER K WITH DESCENDER] + case '\uA741': + // � [LATIN SMALL LETTER K WITH STROKE] + case '\uA743': + // � [LATIN SMALL LETTER K WITH DIAGONAL STROKE] + case '\uA745': + // � [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE] + case '\uFF4B': // k [FULLWIDTH LATIN SMALL LETTER K] + output[opos++] = 'k'; + break; + + case '\u24A6': // â’¦ [PARENTHESIZED LATIN SMALL LETTER K] + output[opos++] = '('; + output[opos++] = 'k'; + output[opos++] = ')'; + break; + + case '\u0139': + // Ĺ [LATIN CAPITAL LETTER L WITH ACUTE] + case '\u013B': + // Ä» [LATIN CAPITAL LETTER L WITH CEDILLA] + case '\u013D': + // Ľ [LATIN CAPITAL LETTER L WITH CARON] + case '\u013F': + // Ä¿ [LATIN CAPITAL LETTER L WITH MIDDLE DOT] + case '\u0141': + // � [LATIN CAPITAL LETTER L WITH STROKE] + case '\u023D': + // Ƚ [LATIN CAPITAL LETTER L WITH BAR] + case '\u029F': + // ÊŸ [LATIN LETTER SMALL CAPITAL L] + case '\u1D0C': + // á´Œ [LATIN LETTER SMALL CAPITAL L WITH STROKE] + case '\u1E36': + // Ḷ [LATIN CAPITAL LETTER L WITH DOT BELOW] + case '\u1E38': + // Ḹ [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON] + case '\u1E3A': + // Ḻ [LATIN CAPITAL LETTER L WITH LINE BELOW] + case '\u1E3C': + // Ḽ [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW] + case '\u24C1': + // � [CIRCLED LATIN CAPITAL LETTER L] + case '\u2C60': + // â±  [LATIN CAPITAL LETTER L WITH DOUBLE BAR] + case '\u2C62': + // â±¢ [LATIN CAPITAL LETTER L WITH MIDDLE TILDE] + case '\uA746': + // � [LATIN CAPITAL LETTER BROKEN L] + case '\uA748': + // � [LATIN CAPITAL LETTER L WITH HIGH STROKE] + case '\uA780': + // Ꞁ [LATIN CAPITAL LETTER TURNED L] + case '\uFF2C': // L [FULLWIDTH LATIN CAPITAL LETTER L] + output[opos++] = 'L'; + break; + + case '\u013A': + // ĺ [LATIN SMALL LETTER L WITH ACUTE] + case '\u013C': + // ļ [LATIN SMALL LETTER L WITH CEDILLA] + case '\u013E': + // ľ [LATIN SMALL LETTER L WITH CARON] + case '\u0140': + // Å€ [LATIN SMALL LETTER L WITH MIDDLE DOT] + case '\u0142': + // Å‚ [LATIN SMALL LETTER L WITH STROKE] + case '\u019A': + // Æš [LATIN SMALL LETTER L WITH BAR] + case '\u0234': + // È´ [LATIN SMALL LETTER L WITH CURL] + case '\u026B': + // É« [LATIN SMALL LETTER L WITH MIDDLE TILDE] + case '\u026C': + // ɬ [LATIN SMALL LETTER L WITH BELT] + case '\u026D': + // É­ [LATIN SMALL LETTER L WITH RETROFLEX HOOK] + case '\u1D85': + // á¶… [LATIN SMALL LETTER L WITH PALATAL HOOK] + case '\u1E37': + // ḷ [LATIN SMALL LETTER L WITH DOT BELOW] + case '\u1E39': + // ḹ [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON] + case '\u1E3B': + // ḻ [LATIN SMALL LETTER L WITH LINE BELOW] + case '\u1E3D': + // ḽ [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW] + case '\u24DB': + // â“› [CIRCLED LATIN SMALL LETTER L] + case '\u2C61': + // ⱡ [LATIN SMALL LETTER L WITH DOUBLE BAR] + case '\uA747': + // � [LATIN SMALL LETTER BROKEN L] + case '\uA749': + // � [LATIN SMALL LETTER L WITH HIGH STROKE] + case '\uA781': + // � [LATIN SMALL LETTER TURNED L] + case '\uFF4C': // l [FULLWIDTH LATIN SMALL LETTER L] + output[opos++] = 'l'; + break; + + case '\u01C7': // LJ [LATIN CAPITAL LETTER LJ] + output[opos++] = 'L'; + output[opos++] = 'J'; + break; + + case '\u1EFA': // Ỻ [LATIN CAPITAL LETTER MIDDLE-WELSH LL] + output[opos++] = 'L'; + output[opos++] = 'L'; + break; + + case '\u01C8': // Lj [LATIN CAPITAL LETTER L WITH SMALL LETTER J] + output[opos++] = 'L'; + output[opos++] = 'j'; + break; + + case '\u24A7': // â’§ [PARENTHESIZED LATIN SMALL LETTER L] + output[opos++] = '('; + output[opos++] = 'l'; + output[opos++] = ')'; + break; + + case '\u01C9': // lj [LATIN SMALL LETTER LJ] + output[opos++] = 'l'; + output[opos++] = 'j'; + break; + + case '\u1EFB': // á»» [LATIN SMALL LETTER MIDDLE-WELSH LL] + output[opos++] = 'l'; + output[opos++] = 'l'; + break; + + case '\u02AA': // ʪ [LATIN SMALL LETTER LS DIGRAPH] + output[opos++] = 'l'; + output[opos++] = 's'; + break; + + case '\u02AB': // Ê« [LATIN SMALL LETTER LZ DIGRAPH] + output[opos++] = 'l'; + output[opos++] = 'z'; + break; + + case '\u019C': + // Æœ [LATIN CAPITAL LETTER TURNED M] + case '\u1D0D': + // á´� [LATIN LETTER SMALL CAPITAL M] + case '\u1E3E': + // Ḿ [LATIN CAPITAL LETTER M WITH ACUTE] + case '\u1E40': + // á¹€ [LATIN CAPITAL LETTER M WITH DOT ABOVE] + case '\u1E42': + // Ṃ [LATIN CAPITAL LETTER M WITH DOT BELOW] + case '\u24C2': + // â“‚ [CIRCLED LATIN CAPITAL LETTER M] + case '\u2C6E': + // â±® [LATIN CAPITAL LETTER M WITH HOOK] + case '\uA7FD': + // ꟽ [LATIN EPIGRAPHIC LETTER INVERTED M] + case '\uA7FF': + // ꟿ [LATIN EPIGRAPHIC LETTER ARCHAIC M] + case '\uFF2D': // ï¼­ [FULLWIDTH LATIN CAPITAL LETTER M] + output[opos++] = 'M'; + break; + + case '\u026F': + // ɯ [LATIN SMALL LETTER TURNED M] + case '\u0270': + // ɰ [LATIN SMALL LETTER TURNED M WITH LONG LEG] + case '\u0271': + // ɱ [LATIN SMALL LETTER M WITH HOOK] + case '\u1D6F': + // ᵯ [LATIN SMALL LETTER M WITH MIDDLE TILDE] + case '\u1D86': + // ᶆ [LATIN SMALL LETTER M WITH PALATAL HOOK] + case '\u1E3F': + // ḿ [LATIN SMALL LETTER M WITH ACUTE] + case '\u1E41': + // � [LATIN SMALL LETTER M WITH DOT ABOVE] + case '\u1E43': + // ṃ [LATIN SMALL LETTER M WITH DOT BELOW] + case '\u24DC': + // ⓜ [CIRCLED LATIN SMALL LETTER M] + case '\uFF4D': // � [FULLWIDTH LATIN SMALL LETTER M] + output[opos++] = 'm'; + break; + + case '\u24A8': // â’¨ [PARENTHESIZED LATIN SMALL LETTER M] + output[opos++] = '('; + output[opos++] = 'm'; + output[opos++] = ')'; + break; + + case '\u00D1': + // Ñ [LATIN CAPITAL LETTER N WITH TILDE] + case '\u0143': + // Ã…Æ’ [LATIN CAPITAL LETTER N WITH ACUTE] + case '\u0145': + // Å… [LATIN CAPITAL LETTER N WITH CEDILLA] + case '\u0147': + // Ň [LATIN CAPITAL LETTER N WITH CARON] + case '\u014A': + // Ã…Å  http://en.wikipedia.org/wiki/Eng_(letter) [LATIN CAPITAL LETTER ENG] + case '\u019D': + // � [LATIN CAPITAL LETTER N WITH LEFT HOOK] + case '\u01F8': + // Ǹ [LATIN CAPITAL LETTER N WITH GRAVE] + case '\u0220': + // È  [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG] + case '\u0274': + // É´ [LATIN LETTER SMALL CAPITAL N] + case '\u1D0E': + // á´Ž [LATIN LETTER SMALL CAPITAL REVERSED N] + case '\u1E44': + // Ṅ [LATIN CAPITAL LETTER N WITH DOT ABOVE] + case '\u1E46': + // Ṇ [LATIN CAPITAL LETTER N WITH DOT BELOW] + case '\u1E48': + // Ṉ [LATIN CAPITAL LETTER N WITH LINE BELOW] + case '\u1E4A': + // Ṋ [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW] + case '\u24C3': + // Ⓝ [CIRCLED LATIN CAPITAL LETTER N] + case '\uFF2E': // ï¼® [FULLWIDTH LATIN CAPITAL LETTER N] + output[opos++] = 'N'; + break; + + case '\u00F1': + // ñ [LATIN SMALL LETTER N WITH TILDE] + case '\u0144': + // Å„ [LATIN SMALL LETTER N WITH ACUTE] + case '\u0146': + // ņ [LATIN SMALL LETTER N WITH CEDILLA] + case '\u0148': + // ň [LATIN SMALL LETTER N WITH CARON] + case '\u0149': + // ʼn [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE] + case '\u014B': + // Å‹ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN SMALL LETTER ENG] + case '\u019E': + // Æž [LATIN SMALL LETTER N WITH LONG RIGHT LEG] + case '\u01F9': + // ǹ [LATIN SMALL LETTER N WITH GRAVE] + case '\u0235': + // ȵ [LATIN SMALL LETTER N WITH CURL] + case '\u0272': + // ɲ [LATIN SMALL LETTER N WITH LEFT HOOK] + case '\u0273': + // ɳ [LATIN SMALL LETTER N WITH RETROFLEX HOOK] + case '\u1D70': + // áµ° [LATIN SMALL LETTER N WITH MIDDLE TILDE] + case '\u1D87': + // ᶇ [LATIN SMALL LETTER N WITH PALATAL HOOK] + case '\u1E45': + // á¹… [LATIN SMALL LETTER N WITH DOT ABOVE] + case '\u1E47': + // ṇ [LATIN SMALL LETTER N WITH DOT BELOW] + case '\u1E49': + // ṉ [LATIN SMALL LETTER N WITH LINE BELOW] + case '\u1E4B': + // ṋ [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW] + case '\u207F': + // � [SUPERSCRIPT LATIN SMALL LETTER N] + case '\u24DD': + // � [CIRCLED LATIN SMALL LETTER N] + case '\uFF4E': // n [FULLWIDTH LATIN SMALL LETTER N] + output[opos++] = 'n'; + break; + + case '\u01CA': // ÇŠ [LATIN CAPITAL LETTER NJ] + output[opos++] = 'N'; + output[opos++] = 'J'; + break; + + case '\u01CB': // Ç‹ [LATIN CAPITAL LETTER N WITH SMALL LETTER J] + output[opos++] = 'N'; + output[opos++] = 'j'; + break; + + case '\u24A9': // â’© [PARENTHESIZED LATIN SMALL LETTER N] + output[opos++] = '('; + output[opos++] = 'n'; + output[opos++] = ')'; + break; + + case '\u01CC': // ÇŒ [LATIN SMALL LETTER NJ] + output[opos++] = 'n'; + output[opos++] = 'j'; + break; + + case '\u00D2': + // Ã’ [LATIN CAPITAL LETTER O WITH GRAVE] + case '\u00D3': + // Ó [LATIN CAPITAL LETTER O WITH ACUTE] + case '\u00D4': + // �? [LATIN CAPITAL LETTER O WITH CIRCUMFLEX] + case '\u00D5': + // Õ [LATIN CAPITAL LETTER O WITH TILDE] + case '\u00D6': + // Ö [LATIN CAPITAL LETTER O WITH DIAERESIS] + case '\u00D8': + // Ø [LATIN CAPITAL LETTER O WITH STROKE] + case '\u014C': + // Ã…Å’ [LATIN CAPITAL LETTER O WITH MACRON] + case '\u014E': + // ÅŽ [LATIN CAPITAL LETTER O WITH BREVE] + case '\u0150': + // � [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE] + case '\u0186': + // Ɔ [LATIN CAPITAL LETTER OPEN O] + case '\u019F': + // ÆŸ [LATIN CAPITAL LETTER O WITH MIDDLE TILDE] + case '\u01A0': + // Æ  [LATIN CAPITAL LETTER O WITH HORN] + case '\u01D1': + // Ç‘ [LATIN CAPITAL LETTER O WITH CARON] + case '\u01EA': + // Ǫ [LATIN CAPITAL LETTER O WITH OGONEK] + case '\u01EC': + // Ǭ [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON] + case '\u01FE': + // Ǿ [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE] + case '\u020C': + // ÈŒ [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE] + case '\u020E': + // ÈŽ [LATIN CAPITAL LETTER O WITH INVERTED BREVE] + case '\u022A': + // Ȫ [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON] + case '\u022C': + // Ȭ [LATIN CAPITAL LETTER O WITH TILDE AND MACRON] + case '\u022E': + // È® [LATIN CAPITAL LETTER O WITH DOT ABOVE] + case '\u0230': + // Ȱ [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON] + case '\u1D0F': + // á´� [LATIN LETTER SMALL CAPITAL O] + case '\u1D10': + // á´� [LATIN LETTER SMALL CAPITAL OPEN O] + case '\u1E4C': + // Ṍ [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE] + case '\u1E4E': + // Ṏ [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS] + case '\u1E50': + // � [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE] + case '\u1E52': + // á¹’ [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE] + case '\u1ECC': + // Ọ [LATIN CAPITAL LETTER O WITH DOT BELOW] + case '\u1ECE': + // Ỏ [LATIN CAPITAL LETTER O WITH HOOK ABOVE] + case '\u1ED0': + // � [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE] + case '\u1ED2': + // á»’ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE] + case '\u1ED4': + // �? [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE] + case '\u1ED6': + // á»– [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE] + case '\u1ED8': + // Ộ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW] + case '\u1EDA': + // Ớ [LATIN CAPITAL LETTER O WITH HORN AND ACUTE] + case '\u1EDC': + // Ờ [LATIN CAPITAL LETTER O WITH HORN AND GRAVE] + case '\u1EDE': + // Ở [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE] + case '\u1EE0': + // á»  [LATIN CAPITAL LETTER O WITH HORN AND TILDE] + case '\u1EE2': + // Ợ [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW] + case '\u24C4': + // â“„ [CIRCLED LATIN CAPITAL LETTER O] + case '\uA74A': + // � [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY] + case '\uA74C': + // � [LATIN CAPITAL LETTER O WITH LOOP] + case '\uFF2F': // O [FULLWIDTH LATIN CAPITAL LETTER O] + output[opos++] = 'O'; + break; + + case '\u00F2': + // ò [LATIN SMALL LETTER O WITH GRAVE] + case '\u00F3': + // ó [LATIN SMALL LETTER O WITH ACUTE] + case '\u00F4': + // ô [LATIN SMALL LETTER O WITH CIRCUMFLEX] + case '\u00F5': + // õ [LATIN SMALL LETTER O WITH TILDE] + case '\u00F6': + // ö [LATIN SMALL LETTER O WITH DIAERESIS] + case '\u00F8': + // ø [LATIN SMALL LETTER O WITH STROKE] + case '\u014D': + // � [LATIN SMALL LETTER O WITH MACRON] + case '\u014F': + // � [LATIN SMALL LETTER O WITH BREVE] + case '\u0151': + // Å‘ [LATIN SMALL LETTER O WITH DOUBLE ACUTE] + case '\u01A1': + // Æ¡ [LATIN SMALL LETTER O WITH HORN] + case '\u01D2': + // Ç’ [LATIN SMALL LETTER O WITH CARON] + case '\u01EB': + // Ç« [LATIN SMALL LETTER O WITH OGONEK] + case '\u01ED': + // Ç­ [LATIN SMALL LETTER O WITH OGONEK AND MACRON] + case '\u01FF': + // Ç¿ [LATIN SMALL LETTER O WITH STROKE AND ACUTE] + case '\u020D': + // � [LATIN SMALL LETTER O WITH DOUBLE GRAVE] + case '\u020F': + // � [LATIN SMALL LETTER O WITH INVERTED BREVE] + case '\u022B': + // È« [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON] + case '\u022D': + // È­ [LATIN SMALL LETTER O WITH TILDE AND MACRON] + case '\u022F': + // ȯ [LATIN SMALL LETTER O WITH DOT ABOVE] + case '\u0231': + // ȱ [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON] + case '\u0254': + // �? [LATIN SMALL LETTER OPEN O] + case '\u0275': + // ɵ [LATIN SMALL LETTER BARRED O] + case '\u1D16': + // á´– [LATIN SMALL LETTER TOP HALF O] + case '\u1D17': + // á´— [LATIN SMALL LETTER BOTTOM HALF O] + case '\u1D97': + // á¶— [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK] + case '\u1E4D': + // � [LATIN SMALL LETTER O WITH TILDE AND ACUTE] + case '\u1E4F': + // � [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS] + case '\u1E51': + // ṑ [LATIN SMALL LETTER O WITH MACRON AND GRAVE] + case '\u1E53': + // ṓ [LATIN SMALL LETTER O WITH MACRON AND ACUTE] + case '\u1ECD': + // � [LATIN SMALL LETTER O WITH DOT BELOW] + case '\u1ECF': + // � [LATIN SMALL LETTER O WITH HOOK ABOVE] + case '\u1ED1': + // ố [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE] + case '\u1ED3': + // ồ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE] + case '\u1ED5': + // ổ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE] + case '\u1ED7': + // á»— [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE] + case '\u1ED9': + // á»™ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW] + case '\u1EDB': + // á»› [LATIN SMALL LETTER O WITH HORN AND ACUTE] + case '\u1EDD': + // � [LATIN SMALL LETTER O WITH HORN AND GRAVE] + case '\u1EDF': + // ở [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE] + case '\u1EE1': + // ỡ [LATIN SMALL LETTER O WITH HORN AND TILDE] + case '\u1EE3': + // ợ [LATIN SMALL LETTER O WITH HORN AND DOT BELOW] + case '\u2092': + // â‚’ [LATIN SUBSCRIPT SMALL LETTER O] + case '\u24DE': + // ⓞ [CIRCLED LATIN SMALL LETTER O] + case '\u2C7A': + // ⱺ [LATIN SMALL LETTER O WITH LOW RING INSIDE] + case '\uA74B': + // � [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY] + case '\uA74D': + // � [LATIN SMALL LETTER O WITH LOOP] + case '\uFF4F': // � [FULLWIDTH LATIN SMALL LETTER O] + output[opos++] = 'o'; + break; + + case '\u0152': + // Å’ [LATIN CAPITAL LIGATURE OE] + case '\u0276': // ɶ [LATIN LETTER SMALL CAPITAL OE] + output[opos++] = 'O'; + output[opos++] = 'E'; + break; + + case '\uA74E': // � [LATIN CAPITAL LETTER OO] + output[opos++] = 'O'; + output[opos++] = 'O'; + break; + + case '\u0222': + // È¢ http://en.wikipedia.org/wiki/OU [LATIN CAPITAL LETTER OU] + case '\u1D15': // á´• [LATIN LETTER SMALL CAPITAL OU] + output[opos++] = 'O'; + output[opos++] = 'U'; + break; + + case '\u24AA': // â’ª [PARENTHESIZED LATIN SMALL LETTER O] + output[opos++] = '('; + output[opos++] = 'o'; + output[opos++] = ')'; + break; + + case '\u0153': + // Å“ [LATIN SMALL LIGATURE OE] + case '\u1D14': // á´�? [LATIN SMALL LETTER TURNED OE] + output[opos++] = 'o'; + output[opos++] = 'e'; + break; + + case '\uA74F': // � [LATIN SMALL LETTER OO] + output[opos++] = 'o'; + output[opos++] = 'o'; + break; + + case '\u0223': // È£ http://en.wikipedia.org/wiki/OU [LATIN SMALL LETTER OU] + output[opos++] = 'o'; + output[opos++] = 'u'; + break; + + case '\u01A4': + // Ƥ [LATIN CAPITAL LETTER P WITH HOOK] + case '\u1D18': + // á´˜ [LATIN LETTER SMALL CAPITAL P] + case '\u1E54': + // �? [LATIN CAPITAL LETTER P WITH ACUTE] + case '\u1E56': + // á¹– [LATIN CAPITAL LETTER P WITH DOT ABOVE] + case '\u24C5': + // â“… [CIRCLED LATIN CAPITAL LETTER P] + case '\u2C63': + // â±£ [LATIN CAPITAL LETTER P WITH STROKE] + case '\uA750': + // � [LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER] + case '\uA752': + // � [LATIN CAPITAL LETTER P WITH FLOURISH] + case '\uA754': + // �? [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL] + case '\uFF30': // ï¼° [FULLWIDTH LATIN CAPITAL LETTER P] + output[opos++] = 'P'; + break; + + case '\u01A5': + // Æ¥ [LATIN SMALL LETTER P WITH HOOK] + case '\u1D71': + // áµ± [LATIN SMALL LETTER P WITH MIDDLE TILDE] + case '\u1D7D': + // áµ½ [LATIN SMALL LETTER P WITH STROKE] + case '\u1D88': + // ᶈ [LATIN SMALL LETTER P WITH PALATAL HOOK] + case '\u1E55': + // ṕ [LATIN SMALL LETTER P WITH ACUTE] + case '\u1E57': + // á¹— [LATIN SMALL LETTER P WITH DOT ABOVE] + case '\u24DF': + // ⓟ [CIRCLED LATIN SMALL LETTER P] + case '\uA751': + // � [LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER] + case '\uA753': + // � [LATIN SMALL LETTER P WITH FLOURISH] + case '\uA755': + // � [LATIN SMALL LETTER P WITH SQUIRREL TAIL] + case '\uA7FC': + // ꟼ [LATIN EPIGRAPHIC LETTER REVERSED P] + case '\uFF50': // � [FULLWIDTH LATIN SMALL LETTER P] + output[opos++] = 'p'; + break; + + case '\u24AB': // â’« [PARENTHESIZED LATIN SMALL LETTER P] + output[opos++] = '('; + output[opos++] = 'p'; + output[opos++] = ')'; + break; + + case '\u024A': + // ÉŠ [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL] + case '\u24C6': + // Ⓠ [CIRCLED LATIN CAPITAL LETTER Q] + case '\uA756': + // � [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER] + case '\uA758': + // � [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE] + case '\uFF31': // ï¼± [FULLWIDTH LATIN CAPITAL LETTER Q] + output[opos++] = 'Q'; + break; + + case '\u0138': + // ĸ http://en.wikipedia.org/wiki/Kra_(letter) [LATIN SMALL LETTER KRA] + case '\u024B': + // É‹ [LATIN SMALL LETTER Q WITH HOOK TAIL] + case '\u02A0': + // Ê  [LATIN SMALL LETTER Q WITH HOOK] + case '\u24E0': + // â“  [CIRCLED LATIN SMALL LETTER Q] + case '\uA757': + // � [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER] + case '\uA759': + // � [LATIN SMALL LETTER Q WITH DIAGONAL STROKE] + case '\uFF51': // q [FULLWIDTH LATIN SMALL LETTER Q] + output[opos++] = 'q'; + break; + + case '\u24AC': // â’¬ [PARENTHESIZED LATIN SMALL LETTER Q] + output[opos++] = '('; + output[opos++] = 'q'; + output[opos++] = ')'; + break; + + case '\u0239': // ȹ [LATIN SMALL LETTER QP DIGRAPH] + output[opos++] = 'q'; + output[opos++] = 'p'; + break; + + case '\u0154': + // �? [LATIN CAPITAL LETTER R WITH ACUTE] + case '\u0156': + // Å– [LATIN CAPITAL LETTER R WITH CEDILLA] + case '\u0158': + // Ã…Ëœ [LATIN CAPITAL LETTER R WITH CARON] + case '\u0210': + // È’ [LATIN CAPITAL LETTER R WITH DOUBLE GRAVE] + case '\u0212': + // È’ [LATIN CAPITAL LETTER R WITH INVERTED BREVE] + case '\u024C': + // ÉŒ [LATIN CAPITAL LETTER R WITH STROKE] + case '\u0280': + // Ê€ [LATIN LETTER SMALL CAPITAL R] + case '\u0281': + // � [LATIN LETTER SMALL CAPITAL INVERTED R] + case '\u1D19': + // á´™ [LATIN LETTER SMALL CAPITAL REVERSED R] + case '\u1D1A': + // á´š [LATIN LETTER SMALL CAPITAL TURNED R] + case '\u1E58': + // Ṙ [LATIN CAPITAL LETTER R WITH DOT ABOVE] + case '\u1E5A': + // Ṛ [LATIN CAPITAL LETTER R WITH DOT BELOW] + case '\u1E5C': + // Ṝ [LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON] + case '\u1E5E': + // Ṟ [LATIN CAPITAL LETTER R WITH LINE BELOW] + case '\u24C7': + // Ⓡ [CIRCLED LATIN CAPITAL LETTER R] + case '\u2C64': + // Ɽ [LATIN CAPITAL LETTER R WITH TAIL] + case '\uA75A': + // � [LATIN CAPITAL LETTER R ROTUNDA] + case '\uA782': + // êž‚ [LATIN CAPITAL LETTER INSULAR R] + case '\uFF32': // ï¼² [FULLWIDTH LATIN CAPITAL LETTER R] + output[opos++] = 'R'; + break; + + case '\u0155': + // Å• [LATIN SMALL LETTER R WITH ACUTE] + case '\u0157': + // Å— [LATIN SMALL LETTER R WITH CEDILLA] + case '\u0159': + // Ã…â„¢ [LATIN SMALL LETTER R WITH CARON] + case '\u0211': + // È‘ [LATIN SMALL LETTER R WITH DOUBLE GRAVE] + case '\u0213': + // È“ [LATIN SMALL LETTER R WITH INVERTED BREVE] + case '\u024D': + // � [LATIN SMALL LETTER R WITH STROKE] + case '\u027C': + // ɼ [LATIN SMALL LETTER R WITH LONG LEG] + case '\u027D': + // ɽ [LATIN SMALL LETTER R WITH TAIL] + case '\u027E': + // ɾ [LATIN SMALL LETTER R WITH FISHHOOK] + case '\u027F': + // É¿ [LATIN SMALL LETTER REVERSED R WITH FISHHOOK] + case '\u1D63': + // áµ£ [LATIN SUBSCRIPT SMALL LETTER R] + case '\u1D72': + // áµ² [LATIN SMALL LETTER R WITH MIDDLE TILDE] + case '\u1D73': + // áµ³ [LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE] + case '\u1D89': + // ᶉ [LATIN SMALL LETTER R WITH PALATAL HOOK] + case '\u1E59': + // á¹™ [LATIN SMALL LETTER R WITH DOT ABOVE] + case '\u1E5B': + // á¹› [LATIN SMALL LETTER R WITH DOT BELOW] + case '\u1E5D': + // � [LATIN SMALL LETTER R WITH DOT BELOW AND MACRON] + case '\u1E5F': + // ṟ [LATIN SMALL LETTER R WITH LINE BELOW] + case '\u24E1': + // â“¡ [CIRCLED LATIN SMALL LETTER R] + case '\uA75B': + // � [LATIN SMALL LETTER R ROTUNDA] + case '\uA783': + // ꞃ [LATIN SMALL LETTER INSULAR R] + case '\uFF52': // ï½’ [FULLWIDTH LATIN SMALL LETTER R] + output[opos++] = 'r'; + break; + + case '\u24AD': // â’­ [PARENTHESIZED LATIN SMALL LETTER R] + output[opos++] = '('; + output[opos++] = 'r'; + output[opos++] = ')'; + break; + + case '\u015A': + // Ã…Å¡ [LATIN CAPITAL LETTER S WITH ACUTE] + case '\u015C': + // Ã…Å“ [LATIN CAPITAL LETTER S WITH CIRCUMFLEX] + case '\u015E': + // Åž [LATIN CAPITAL LETTER S WITH CEDILLA] + case '\u0160': + // Å  [LATIN CAPITAL LETTER S WITH CARON] + case '\u0218': + // Ș [LATIN CAPITAL LETTER S WITH COMMA BELOW] + case '\u1E60': + // á¹  [LATIN CAPITAL LETTER S WITH DOT ABOVE] + case '\u1E62': + // á¹¢ [LATIN CAPITAL LETTER S WITH DOT BELOW] + case '\u1E64': + // Ṥ [LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE] + case '\u1E66': + // Ṧ [LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE] + case '\u1E68': + // Ṩ [LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE] + case '\u24C8': + // Ⓢ [CIRCLED LATIN CAPITAL LETTER S] + case '\uA731': + // ꜱ [LATIN LETTER SMALL CAPITAL S] + case '\uA785': + // êž… [LATIN SMALL LETTER INSULAR S] + case '\uFF33': // ï¼³ [FULLWIDTH LATIN CAPITAL LETTER S] + output[opos++] = 'S'; + break; + + case '\u015B': + // Å› [LATIN SMALL LETTER S WITH ACUTE] + case '\u015D': + // � [LATIN SMALL LETTER S WITH CIRCUMFLEX] + case '\u015F': + // ÅŸ [LATIN SMALL LETTER S WITH CEDILLA] + case '\u0161': + // Å¡ [LATIN SMALL LETTER S WITH CARON] + case '\u017F': + // Å¿ http://en.wikipedia.org/wiki/Long_S [LATIN SMALL LETTER LONG S] + case '\u0219': + // È™ [LATIN SMALL LETTER S WITH COMMA BELOW] + case '\u023F': + // È¿ [LATIN SMALL LETTER S WITH SWASH TAIL] + case '\u0282': + // Ê‚ [LATIN SMALL LETTER S WITH HOOK] + case '\u1D74': + // áµ´ [LATIN SMALL LETTER S WITH MIDDLE TILDE] + case '\u1D8A': + // á¶Š [LATIN SMALL LETTER S WITH PALATAL HOOK] + case '\u1E61': + // ṡ [LATIN SMALL LETTER S WITH DOT ABOVE] + case '\u1E63': + // á¹£ [LATIN SMALL LETTER S WITH DOT BELOW] + case '\u1E65': + // á¹¥ [LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE] + case '\u1E67': + // á¹§ [LATIN SMALL LETTER S WITH CARON AND DOT ABOVE] + case '\u1E69': + // ṩ [LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE] + case '\u1E9C': + // ẜ [LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE] + case '\u1E9D': + // � [LATIN SMALL LETTER LONG S WITH HIGH STROKE] + case '\u24E2': + // â“¢ [CIRCLED LATIN SMALL LETTER S] + case '\uA784': + // êž„ [LATIN CAPITAL LETTER INSULAR S] + case '\uFF53': // s [FULLWIDTH LATIN SMALL LETTER S] + output[opos++] = 's'; + break; + + case '\u1E9E': // ẞ [LATIN CAPITAL LETTER SHARP S] + output[opos++] = 'S'; + output[opos++] = 'S'; + break; + + case '\u24AE': // â’® [PARENTHESIZED LATIN SMALL LETTER S] + output[opos++] = '('; + output[opos++] = 's'; + output[opos++] = ')'; + break; + + case '\u00DF': // ß [LATIN SMALL LETTER SHARP S] + output[opos++] = 's'; + output[opos++] = 's'; + break; + + case '\uFB06': // st [LATIN SMALL LIGATURE ST] + output[opos++] = 's'; + output[opos++] = 't'; + break; + + case '\u0162': + // Å¢ [LATIN CAPITAL LETTER T WITH CEDILLA] + case '\u0164': + // Ť [LATIN CAPITAL LETTER T WITH CARON] + case '\u0166': + // Ŧ [LATIN CAPITAL LETTER T WITH STROKE] + case '\u01AC': + // Ƭ [LATIN CAPITAL LETTER T WITH HOOK] + case '\u01AE': + // Æ® [LATIN CAPITAL LETTER T WITH RETROFLEX HOOK] + case '\u021A': + // Èš [LATIN CAPITAL LETTER T WITH COMMA BELOW] + case '\u023E': + // Ⱦ [LATIN CAPITAL LETTER T WITH DIAGONAL STROKE] + case '\u1D1B': + // á´› [LATIN LETTER SMALL CAPITAL T] + case '\u1E6A': + // Ṫ [LATIN CAPITAL LETTER T WITH DOT ABOVE] + case '\u1E6C': + // Ṭ [LATIN CAPITAL LETTER T WITH DOT BELOW] + case '\u1E6E': + // á¹® [LATIN CAPITAL LETTER T WITH LINE BELOW] + case '\u1E70': + // á¹° [LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW] + case '\u24C9': + // Ⓣ [CIRCLED LATIN CAPITAL LETTER T] + case '\uA786': + // Ꞇ [LATIN CAPITAL LETTER INSULAR T] + case '\uFF34': // ï¼´ [FULLWIDTH LATIN CAPITAL LETTER T] + output[opos++] = 'T'; + break; + + case '\u0163': + // Å£ [LATIN SMALL LETTER T WITH CEDILLA] + case '\u0165': + // Ã…Â¥ [LATIN SMALL LETTER T WITH CARON] + case '\u0167': + // ŧ [LATIN SMALL LETTER T WITH STROKE] + case '\u01AB': + // Æ« [LATIN SMALL LETTER T WITH PALATAL HOOK] + case '\u01AD': + // Æ­ [LATIN SMALL LETTER T WITH HOOK] + case '\u021B': + // È› [LATIN SMALL LETTER T WITH COMMA BELOW] + case '\u0236': + // ȶ [LATIN SMALL LETTER T WITH CURL] + case '\u0287': + // ʇ [LATIN SMALL LETTER TURNED T] + case '\u0288': + // ʈ [LATIN SMALL LETTER T WITH RETROFLEX HOOK] + case '\u1D75': + // áµµ [LATIN SMALL LETTER T WITH MIDDLE TILDE] + case '\u1E6B': + // ṫ [LATIN SMALL LETTER T WITH DOT ABOVE] + case '\u1E6D': + // á¹­ [LATIN SMALL LETTER T WITH DOT BELOW] + case '\u1E6F': + // ṯ [LATIN SMALL LETTER T WITH LINE BELOW] + case '\u1E71': + // á¹± [LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW] + case '\u1E97': + // ẗ [LATIN SMALL LETTER T WITH DIAERESIS] + case '\u24E3': + // â“£ [CIRCLED LATIN SMALL LETTER T] + case '\u2C66': + // ⱦ [LATIN SMALL LETTER T WITH DIAGONAL STROKE] + case '\uFF54': // �? [FULLWIDTH LATIN SMALL LETTER T] + output[opos++] = 't'; + break; + + case '\u00DE': + // Þ [LATIN CAPITAL LETTER THORN] + case '\uA766': // � [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER] + output[opos++] = 'T'; + output[opos++] = 'H'; + break; + + case '\uA728': // Ꜩ [LATIN CAPITAL LETTER TZ] + output[opos++] = 'T'; + output[opos++] = 'Z'; + break; + + case '\u24AF': // â’¯ [PARENTHESIZED LATIN SMALL LETTER T] + output[opos++] = '('; + output[opos++] = 't'; + output[opos++] = ')'; + break; + + case '\u02A8': // ʨ [LATIN SMALL LETTER TC DIGRAPH WITH CURL] + output[opos++] = 't'; + output[opos++] = 'c'; + break; + + case '\u00FE': + // þ [LATIN SMALL LETTER THORN] + case '\u1D7A': + // ᵺ [LATIN SMALL LETTER TH WITH STRIKETHROUGH] + case '\uA767': // � [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER] + output[opos++] = 't'; + output[opos++] = 'h'; + break; + + case '\u02A6': // ʦ [LATIN SMALL LETTER TS DIGRAPH] + output[opos++] = 't'; + output[opos++] = 's'; + break; + + case '\uA729': // ꜩ [LATIN SMALL LETTER TZ] + output[opos++] = 't'; + output[opos++] = 'z'; + break; + + case '\u00D9': + // Ù [LATIN CAPITAL LETTER U WITH GRAVE] + case '\u00DA': + // Ú [LATIN CAPITAL LETTER U WITH ACUTE] + case '\u00DB': + // Û [LATIN CAPITAL LETTER U WITH CIRCUMFLEX] + case '\u00DC': + // Ü [LATIN CAPITAL LETTER U WITH DIAERESIS] + case '\u0168': + // Ũ [LATIN CAPITAL LETTER U WITH TILDE] + case '\u016A': + // Ū [LATIN CAPITAL LETTER U WITH MACRON] + case '\u016C': + // Ŭ [LATIN CAPITAL LETTER U WITH BREVE] + case '\u016E': + // Å® [LATIN CAPITAL LETTER U WITH RING ABOVE] + case '\u0170': + // Ű [LATIN CAPITAL LETTER U WITH DOUBLE ACUTE] + case '\u0172': + // Ų [LATIN CAPITAL LETTER U WITH OGONEK] + case '\u01AF': + // Ư [LATIN CAPITAL LETTER U WITH HORN] + case '\u01D3': + // Ç“ [LATIN CAPITAL LETTER U WITH CARON] + case '\u01D5': + // Ç• [LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON] + case '\u01D7': + // Ç— [LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE] + case '\u01D9': + // Ç™ [LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON] + case '\u01DB': + // Ç› [LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE] + case '\u0214': + // �? [LATIN CAPITAL LETTER U WITH DOUBLE GRAVE] + case '\u0216': + // È– [LATIN CAPITAL LETTER U WITH INVERTED BREVE] + case '\u0244': + // É„ [LATIN CAPITAL LETTER U BAR] + case '\u1D1C': + // á´œ [LATIN LETTER SMALL CAPITAL U] + case '\u1D7E': + // áµ¾ [LATIN SMALL CAPITAL LETTER U WITH STROKE] + case '\u1E72': + // á¹² [LATIN CAPITAL LETTER U WITH DIAERESIS BELOW] + case '\u1E74': + // á¹´ [LATIN CAPITAL LETTER U WITH TILDE BELOW] + case '\u1E76': + // á¹¶ [LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW] + case '\u1E78': + // Ṹ [LATIN CAPITAL LETTER U WITH TILDE AND ACUTE] + case '\u1E7A': + // Ṻ [LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS] + case '\u1EE4': + // Ụ [LATIN CAPITAL LETTER U WITH DOT BELOW] + case '\u1EE6': + // Ủ [LATIN CAPITAL LETTER U WITH HOOK ABOVE] + case '\u1EE8': + // Ứ [LATIN CAPITAL LETTER U WITH HORN AND ACUTE] + case '\u1EEA': + // Ừ [LATIN CAPITAL LETTER U WITH HORN AND GRAVE] + case '\u1EEC': + // Ử [LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE] + case '\u1EEE': + // á»® [LATIN CAPITAL LETTER U WITH HORN AND TILDE] + case '\u1EF0': + // á»° [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW] + case '\u24CA': + // Ⓤ [CIRCLED LATIN CAPITAL LETTER U] + case '\uFF35': // ï¼µ [FULLWIDTH LATIN CAPITAL LETTER U] + output[opos++] = 'U'; + break; + + case '\u00F9': + // ù [LATIN SMALL LETTER U WITH GRAVE] + case '\u00FA': + // ú [LATIN SMALL LETTER U WITH ACUTE] + case '\u00FB': + // û [LATIN SMALL LETTER U WITH CIRCUMFLEX] + case '\u00FC': + // ü [LATIN SMALL LETTER U WITH DIAERESIS] + case '\u0169': + // Å© [LATIN SMALL LETTER U WITH TILDE] + case '\u016B': + // Å« [LATIN SMALL LETTER U WITH MACRON] + case '\u016D': + // Å­ [LATIN SMALL LETTER U WITH BREVE] + case '\u016F': + // ů [LATIN SMALL LETTER U WITH RING ABOVE] + case '\u0171': + // ű [LATIN SMALL LETTER U WITH DOUBLE ACUTE] + case '\u0173': + // ų [LATIN SMALL LETTER U WITH OGONEK] + case '\u01B0': + // ư [LATIN SMALL LETTER U WITH HORN] + case '\u01D4': + // �? [LATIN SMALL LETTER U WITH CARON] + case '\u01D6': + // Ç– [LATIN SMALL LETTER U WITH DIAERESIS AND MACRON] + case '\u01D8': + // ǘ [LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE] + case '\u01DA': + // Çš [LATIN SMALL LETTER U WITH DIAERESIS AND CARON] + case '\u01DC': + // Çœ [LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE] + case '\u0215': + // È• [LATIN SMALL LETTER U WITH DOUBLE GRAVE] + case '\u0217': + // È— [LATIN SMALL LETTER U WITH INVERTED BREVE] + case '\u0289': + // ʉ [LATIN SMALL LETTER U BAR] + case '\u1D64': + // ᵤ [LATIN SUBSCRIPT SMALL LETTER U] + case '\u1D99': + // á¶™ [LATIN SMALL LETTER U WITH RETROFLEX HOOK] + case '\u1E73': + // á¹³ [LATIN SMALL LETTER U WITH DIAERESIS BELOW] + case '\u1E75': + // á¹µ [LATIN SMALL LETTER U WITH TILDE BELOW] + case '\u1E77': + // á¹· [LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW] + case '\u1E79': + // á¹¹ [LATIN SMALL LETTER U WITH TILDE AND ACUTE] + case '\u1E7B': + // á¹» [LATIN SMALL LETTER U WITH MACRON AND DIAERESIS] + case '\u1EE5': + // ụ [LATIN SMALL LETTER U WITH DOT BELOW] + case '\u1EE7': + // á»§ [LATIN SMALL LETTER U WITH HOOK ABOVE] + case '\u1EE9': + // ứ [LATIN SMALL LETTER U WITH HORN AND ACUTE] + case '\u1EEB': + // ừ [LATIN SMALL LETTER U WITH HORN AND GRAVE] + case '\u1EED': + // á»­ [LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE] + case '\u1EEF': + // ữ [LATIN SMALL LETTER U WITH HORN AND TILDE] + case '\u1EF1': + // á»± [LATIN SMALL LETTER U WITH HORN AND DOT BELOW] + case '\u24E4': + // ⓤ [CIRCLED LATIN SMALL LETTER U] + case '\uFF55': // u [FULLWIDTH LATIN SMALL LETTER U] + output[opos++] = 'u'; + break; + + case '\u24B0': // â’° [PARENTHESIZED LATIN SMALL LETTER U] + output[opos++] = '('; + output[opos++] = 'u'; + output[opos++] = ')'; + break; + + case '\u1D6B': // ᵫ [LATIN SMALL LETTER UE] + output[opos++] = 'u'; + output[opos++] = 'e'; + break; + + case '\u01B2': + // Ʋ [LATIN CAPITAL LETTER V WITH HOOK] + case '\u0245': + // É… [LATIN CAPITAL LETTER TURNED V] + case '\u1D20': + // á´  [LATIN LETTER SMALL CAPITAL V] + case '\u1E7C': + // á¹¼ [LATIN CAPITAL LETTER V WITH TILDE] + case '\u1E7E': + // á¹¾ [LATIN CAPITAL LETTER V WITH DOT BELOW] + case '\u1EFC': + // Ỽ [LATIN CAPITAL LETTER MIDDLE-WELSH V] + case '\u24CB': + // â“‹ [CIRCLED LATIN CAPITAL LETTER V] + case '\uA75E': + // � [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE] + case '\uA768': + // � [LATIN CAPITAL LETTER VEND] + case '\uFF36': // ï¼¶ [FULLWIDTH LATIN CAPITAL LETTER V] + output[opos++] = 'V'; + break; + + case '\u028B': + // Ê‹ [LATIN SMALL LETTER V WITH HOOK] + case '\u028C': + // ÊŒ [LATIN SMALL LETTER TURNED V] + case '\u1D65': + // áµ¥ [LATIN SUBSCRIPT SMALL LETTER V] + case '\u1D8C': + // á¶Œ [LATIN SMALL LETTER V WITH PALATAL HOOK] + case '\u1E7D': + // á¹½ [LATIN SMALL LETTER V WITH TILDE] + case '\u1E7F': + // ṿ [LATIN SMALL LETTER V WITH DOT BELOW] + case '\u24E5': + // â“¥ [CIRCLED LATIN SMALL LETTER V] + case '\u2C71': + // â±± [LATIN SMALL LETTER V WITH RIGHT HOOK] + case '\u2C74': + // â±´ [LATIN SMALL LETTER V WITH CURL] + case '\uA75F': + // � [LATIN SMALL LETTER V WITH DIAGONAL STROKE] + case '\uFF56': // ï½– [FULLWIDTH LATIN SMALL LETTER V] + output[opos++] = 'v'; + break; + + case '\uA760': // � [LATIN CAPITAL LETTER VY] + output[opos++] = 'V'; + output[opos++] = 'Y'; + break; + + case '\u24B1': // â’± [PARENTHESIZED LATIN SMALL LETTER V] + output[opos++] = '('; + output[opos++] = 'v'; + output[opos++] = ')'; + break; + + case '\uA761': // � [LATIN SMALL LETTER VY] + output[opos++] = 'v'; + output[opos++] = 'y'; + break; + + case '\u0174': + // Å´ [LATIN CAPITAL LETTER W WITH CIRCUMFLEX] + case '\u01F7': + // Ç· http://en.wikipedia.org/wiki/Wynn [LATIN CAPITAL LETTER WYNN] + case '\u1D21': + // á´¡ [LATIN LETTER SMALL CAPITAL W] + case '\u1E80': + // Ẁ [LATIN CAPITAL LETTER W WITH GRAVE] + case '\u1E82': + // Ẃ [LATIN CAPITAL LETTER W WITH ACUTE] + case '\u1E84': + // Ẅ [LATIN CAPITAL LETTER W WITH DIAERESIS] + case '\u1E86': + // Ẇ [LATIN CAPITAL LETTER W WITH DOT ABOVE] + case '\u1E88': + // Ẉ [LATIN CAPITAL LETTER W WITH DOT BELOW] + case '\u24CC': + // Ⓦ [CIRCLED LATIN CAPITAL LETTER W] + case '\u2C72': + // â±² [LATIN CAPITAL LETTER W WITH HOOK] + case '\uFF37': // ï¼· [FULLWIDTH LATIN CAPITAL LETTER W] + output[opos++] = 'W'; + break; + + case '\u0175': + // ŵ [LATIN SMALL LETTER W WITH CIRCUMFLEX] + case '\u01BF': + // Æ¿ http://en.wikipedia.org/wiki/Wynn [LATIN LETTER WYNN] + case '\u028D': + // � [LATIN SMALL LETTER TURNED W] + case '\u1E81': + // � [LATIN SMALL LETTER W WITH GRAVE] + case '\u1E83': + // ẃ [LATIN SMALL LETTER W WITH ACUTE] + case '\u1E85': + // ẅ [LATIN SMALL LETTER W WITH DIAERESIS] + case '\u1E87': + // ẇ [LATIN SMALL LETTER W WITH DOT ABOVE] + case '\u1E89': + // ẉ [LATIN SMALL LETTER W WITH DOT BELOW] + case '\u1E98': + // ẘ [LATIN SMALL LETTER W WITH RING ABOVE] + case '\u24E6': + // ⓦ [CIRCLED LATIN SMALL LETTER W] + case '\u2C73': + // â±³ [LATIN SMALL LETTER W WITH HOOK] + case '\uFF57': // ï½— [FULLWIDTH LATIN SMALL LETTER W] + output[opos++] = 'w'; + break; + + case '\u24B2': // â’² [PARENTHESIZED LATIN SMALL LETTER W] + output[opos++] = '('; + output[opos++] = 'w'; + output[opos++] = ')'; + break; + + case '\u1E8A': + // Ẋ [LATIN CAPITAL LETTER X WITH DOT ABOVE] + case '\u1E8C': + // Ẍ [LATIN CAPITAL LETTER X WITH DIAERESIS] + case '\u24CD': + // � [CIRCLED LATIN CAPITAL LETTER X] + case '\uFF38': // X [FULLWIDTH LATIN CAPITAL LETTER X] + output[opos++] = 'X'; + break; + + case '\u1D8D': + // � [LATIN SMALL LETTER X WITH PALATAL HOOK] + case '\u1E8B': + // ẋ [LATIN SMALL LETTER X WITH DOT ABOVE] + case '\u1E8D': + // � [LATIN SMALL LETTER X WITH DIAERESIS] + case '\u2093': + // â‚“ [LATIN SUBSCRIPT SMALL LETTER X] + case '\u24E7': + // â“§ [CIRCLED LATIN SMALL LETTER X] + case '\uFF58': // x [FULLWIDTH LATIN SMALL LETTER X] + output[opos++] = 'x'; + break; + + case '\u24B3': // â’³ [PARENTHESIZED LATIN SMALL LETTER X] + output[opos++] = '('; + output[opos++] = 'x'; + output[opos++] = ')'; + break; + + case '\u00DD': + // � [LATIN CAPITAL LETTER Y WITH ACUTE] + case '\u0176': + // Ŷ [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX] + case '\u0178': + // Ÿ [LATIN CAPITAL LETTER Y WITH DIAERESIS] + case '\u01B3': + // Ƴ [LATIN CAPITAL LETTER Y WITH HOOK] + case '\u0232': + // Ȳ [LATIN CAPITAL LETTER Y WITH MACRON] + case '\u024E': + // ÉŽ [LATIN CAPITAL LETTER Y WITH STROKE] + case '\u028F': + // � [LATIN LETTER SMALL CAPITAL Y] + case '\u1E8E': + // Ẏ [LATIN CAPITAL LETTER Y WITH DOT ABOVE] + case '\u1EF2': + // Ỳ [LATIN CAPITAL LETTER Y WITH GRAVE] + case '\u1EF4': + // á»´ [LATIN CAPITAL LETTER Y WITH DOT BELOW] + case '\u1EF6': + // á»¶ [LATIN CAPITAL LETTER Y WITH HOOK ABOVE] + case '\u1EF8': + // Ỹ [LATIN CAPITAL LETTER Y WITH TILDE] + case '\u1EFE': + // Ỿ [LATIN CAPITAL LETTER Y WITH LOOP] + case '\u24CE': + // Ⓨ [CIRCLED LATIN CAPITAL LETTER Y] + case '\uFF39': // ï¼¹ [FULLWIDTH LATIN CAPITAL LETTER Y] + output[opos++] = 'Y'; + break; + + case '\u00FD': + // ý [LATIN SMALL LETTER Y WITH ACUTE] + case '\u00FF': + // ÿ [LATIN SMALL LETTER Y WITH DIAERESIS] + case '\u0177': + // Å· [LATIN SMALL LETTER Y WITH CIRCUMFLEX] + case '\u01B4': + // Æ´ [LATIN SMALL LETTER Y WITH HOOK] + case '\u0233': + // ȳ [LATIN SMALL LETTER Y WITH MACRON] + case '\u024F': + // � [LATIN SMALL LETTER Y WITH STROKE] + case '\u028E': + // ÊŽ [LATIN SMALL LETTER TURNED Y] + case '\u1E8F': + // � [LATIN SMALL LETTER Y WITH DOT ABOVE] + case '\u1E99': + // ẙ [LATIN SMALL LETTER Y WITH RING ABOVE] + case '\u1EF3': + // ỳ [LATIN SMALL LETTER Y WITH GRAVE] + case '\u1EF5': + // ỵ [LATIN SMALL LETTER Y WITH DOT BELOW] + case '\u1EF7': + // á»· [LATIN SMALL LETTER Y WITH HOOK ABOVE] + case '\u1EF9': + // ỹ [LATIN SMALL LETTER Y WITH TILDE] + case '\u1EFF': + // ỿ [LATIN SMALL LETTER Y WITH LOOP] + case '\u24E8': + // ⓨ [CIRCLED LATIN SMALL LETTER Y] + case '\uFF59': // ï½™ [FULLWIDTH LATIN SMALL LETTER Y] + output[opos++] = 'y'; + break; + + case '\u24B4': // â’´ [PARENTHESIZED LATIN SMALL LETTER Y] + output[opos++] = '('; + output[opos++] = 'y'; + output[opos++] = ')'; + break; + + case '\u0179': + // Ź [LATIN CAPITAL LETTER Z WITH ACUTE] + case '\u017B': + // Å» [LATIN CAPITAL LETTER Z WITH DOT ABOVE] + case '\u017D': + // Ž [LATIN CAPITAL LETTER Z WITH CARON] + case '\u01B5': + // Ƶ [LATIN CAPITAL LETTER Z WITH STROKE] + case '\u021C': + // Èœ http://en.wikipedia.org/wiki/Yogh [LATIN CAPITAL LETTER YOGH] + case '\u0224': + // Ȥ [LATIN CAPITAL LETTER Z WITH HOOK] + case '\u1D22': + // á´¢ [LATIN LETTER SMALL CAPITAL Z] + case '\u1E90': + // � [LATIN CAPITAL LETTER Z WITH CIRCUMFLEX] + case '\u1E92': + // Ẓ [LATIN CAPITAL LETTER Z WITH DOT BELOW] + case '\u1E94': + // �? [LATIN CAPITAL LETTER Z WITH LINE BELOW] + case '\u24CF': + // � [CIRCLED LATIN CAPITAL LETTER Z] + case '\u2C6B': + // Ⱬ [LATIN CAPITAL LETTER Z WITH DESCENDER] + case '\uA762': + // � [LATIN CAPITAL LETTER VISIGOTHIC Z] + case '\uFF3A': // Z [FULLWIDTH LATIN CAPITAL LETTER Z] + output[opos++] = 'Z'; + break; + + case '\u017A': + // ź [LATIN SMALL LETTER Z WITH ACUTE] + case '\u017C': + // ż [LATIN SMALL LETTER Z WITH DOT ABOVE] + case '\u017E': + // ž [LATIN SMALL LETTER Z WITH CARON] + case '\u01B6': + // ƶ [LATIN SMALL LETTER Z WITH STROKE] + case '\u021D': + // � http://en.wikipedia.org/wiki/Yogh [LATIN SMALL LETTER YOGH] + case '\u0225': + // È¥ [LATIN SMALL LETTER Z WITH HOOK] + case '\u0240': + // É€ [LATIN SMALL LETTER Z WITH SWASH TAIL] + case '\u0290': + // � [LATIN SMALL LETTER Z WITH RETROFLEX HOOK] + case '\u0291': + // Ê‘ [LATIN SMALL LETTER Z WITH CURL] + case '\u1D76': + // áµ¶ [LATIN SMALL LETTER Z WITH MIDDLE TILDE] + case '\u1D8E': + // á¶Ž [LATIN SMALL LETTER Z WITH PALATAL HOOK] + case '\u1E91': + // ẑ [LATIN SMALL LETTER Z WITH CIRCUMFLEX] + case '\u1E93': + // ẓ [LATIN SMALL LETTER Z WITH DOT BELOW] + case '\u1E95': + // ẕ [LATIN SMALL LETTER Z WITH LINE BELOW] + case '\u24E9': + // â“© [CIRCLED LATIN SMALL LETTER Z] + case '\u2C6C': + // ⱬ [LATIN SMALL LETTER Z WITH DESCENDER] + case '\uA763': + // � [LATIN SMALL LETTER VISIGOTHIC Z] + case '\uFF5A': // z [FULLWIDTH LATIN SMALL LETTER Z] + output[opos++] = 'z'; + break; + + case '\u24B5': // â’µ [PARENTHESIZED LATIN SMALL LETTER Z] + output[opos++] = '('; + output[opos++] = 'z'; + output[opos++] = ')'; + break; + + case '\u2070': + // � [SUPERSCRIPT ZERO] + case '\u2080': + // â‚€ [SUBSCRIPT ZERO] + case '\u24EA': + // ⓪ [CIRCLED DIGIT ZERO] + case '\u24FF': + // â“¿ [NEGATIVE CIRCLED DIGIT ZERO] + case '\uFF10': // � [FULLWIDTH DIGIT ZERO] + output[opos++] = '0'; + break; + + case '\u00B9': + // ¹ [SUPERSCRIPT ONE] + case '\u2081': + // � [SUBSCRIPT ONE] + case '\u2460': + // â‘  [CIRCLED DIGIT ONE] + case '\u24F5': + // ⓵ [DOUBLE CIRCLED DIGIT ONE] + case '\u2776': + // � [DINGBAT NEGATIVE CIRCLED DIGIT ONE] + case '\u2780': + // ➀ [DINGBAT CIRCLED SANS-SERIF DIGIT ONE] + case '\u278A': + // ➊ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE] + case '\uFF11': // 1 [FULLWIDTH DIGIT ONE] + output[opos++] = '1'; + break; + + case '\u2488': // â’ˆ [DIGIT ONE FULL STOP] + output[opos++] = '1'; + output[opos++] = '.'; + break; + + case '\u2474': // â‘´ [PARENTHESIZED DIGIT ONE] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = ')'; + break; + + case '\u00B2': + // ² [SUPERSCRIPT TWO] + case '\u2082': + // â‚‚ [SUBSCRIPT TWO] + case '\u2461': + // â‘¡ [CIRCLED DIGIT TWO] + case '\u24F6': + // â“¶ [DOUBLE CIRCLED DIGIT TWO] + case '\u2777': + // � [DINGBAT NEGATIVE CIRCLED DIGIT TWO] + case '\u2781': + // � [DINGBAT CIRCLED SANS-SERIF DIGIT TWO] + case '\u278B': + // âž‹ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO] + case '\uFF12': // ï¼’ [FULLWIDTH DIGIT TWO] + output[opos++] = '2'; + break; + + case '\u2489': // â’‰ [DIGIT TWO FULL STOP] + output[opos++] = '2'; + output[opos++] = '.'; + break; + + case '\u2475': // ⑵ [PARENTHESIZED DIGIT TWO] + output[opos++] = '('; + output[opos++] = '2'; + output[opos++] = ')'; + break; + + case '\u00B3': + // ³ [SUPERSCRIPT THREE] + case '\u2083': + // ₃ [SUBSCRIPT THREE] + case '\u2462': + // â‘¢ [CIRCLED DIGIT THREE] + case '\u24F7': + // â“· [DOUBLE CIRCLED DIGIT THREE] + case '\u2778': + // � [DINGBAT NEGATIVE CIRCLED DIGIT THREE] + case '\u2782': + // âž‚ [DINGBAT CIRCLED SANS-SERIF DIGIT THREE] + case '\u278C': + // ➌ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE] + case '\uFF13': // 3 [FULLWIDTH DIGIT THREE] + output[opos++] = '3'; + break; + + case '\u248A': // â’Š [DIGIT THREE FULL STOP] + output[opos++] = '3'; + output[opos++] = '.'; + break; + + case '\u2476': // â‘¶ [PARENTHESIZED DIGIT THREE] + output[opos++] = '('; + output[opos++] = '3'; + output[opos++] = ')'; + break; + + case '\u2074': + // � [SUPERSCRIPT FOUR] + case '\u2084': + // â‚„ [SUBSCRIPT FOUR] + case '\u2463': + // â‘£ [CIRCLED DIGIT FOUR] + case '\u24F8': + // ⓸ [DOUBLE CIRCLED DIGIT FOUR] + case '\u2779': + // � [DINGBAT NEGATIVE CIRCLED DIGIT FOUR] + case '\u2783': + // ➃ [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR] + case '\u278D': + // � [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR] + case '\uFF14': // �? [FULLWIDTH DIGIT FOUR] + output[opos++] = '4'; + break; + + case '\u248B': // â’‹ [DIGIT FOUR FULL STOP] + output[opos++] = '4'; + output[opos++] = '.'; + break; + + case '\u2477': // â‘· [PARENTHESIZED DIGIT FOUR] + output[opos++] = '('; + output[opos++] = '4'; + output[opos++] = ')'; + break; + + case '\u2075': + // � [SUPERSCRIPT FIVE] + case '\u2085': + // â‚… [SUBSCRIPT FIVE] + case '\u2464': + // ⑤ [CIRCLED DIGIT FIVE] + case '\u24F9': + // ⓹ [DOUBLE CIRCLED DIGIT FIVE] + case '\u277A': + // � [DINGBAT NEGATIVE CIRCLED DIGIT FIVE] + case '\u2784': + // âž„ [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE] + case '\u278E': + // ➎ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE] + case '\uFF15': // 5 [FULLWIDTH DIGIT FIVE] + output[opos++] = '5'; + break; + + case '\u248C': // â’Œ [DIGIT FIVE FULL STOP] + output[opos++] = '5'; + output[opos++] = '.'; + break; + + case '\u2478': // ⑸ [PARENTHESIZED DIGIT FIVE] + output[opos++] = '('; + output[opos++] = '5'; + output[opos++] = ')'; + break; + + case '\u2076': + // � [SUPERSCRIPT SIX] + case '\u2086': + // ₆ [SUBSCRIPT SIX] + case '\u2465': + // â‘¥ [CIRCLED DIGIT SIX] + case '\u24FA': + // ⓺ [DOUBLE CIRCLED DIGIT SIX] + case '\u277B': + // � [DINGBAT NEGATIVE CIRCLED DIGIT SIX] + case '\u2785': + // âž… [DINGBAT CIRCLED SANS-SERIF DIGIT SIX] + case '\u278F': + // � [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX] + case '\uFF16': // ï¼– [FULLWIDTH DIGIT SIX] + output[opos++] = '6'; + break; + + case '\u248D': // â’� [DIGIT SIX FULL STOP] + output[opos++] = '6'; + output[opos++] = '.'; + break; + + case '\u2479': // ⑹ [PARENTHESIZED DIGIT SIX] + output[opos++] = '('; + output[opos++] = '6'; + output[opos++] = ')'; + break; + + case '\u2077': + // � [SUPERSCRIPT SEVEN] + case '\u2087': + // ₇ [SUBSCRIPT SEVEN] + case '\u2466': + // ⑦ [CIRCLED DIGIT SEVEN] + case '\u24FB': + // â“» [DOUBLE CIRCLED DIGIT SEVEN] + case '\u277C': + // � [DINGBAT NEGATIVE CIRCLED DIGIT SEVEN] + case '\u2786': + // ➆ [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN] + case '\u2790': + // � [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN] + case '\uFF17': // ï¼— [FULLWIDTH DIGIT SEVEN] + output[opos++] = '7'; + break; + + case '\u248E': // â’Ž [DIGIT SEVEN FULL STOP] + output[opos++] = '7'; + output[opos++] = '.'; + break; + + case '\u247A': // ⑺ [PARENTHESIZED DIGIT SEVEN] + output[opos++] = '('; + output[opos++] = '7'; + output[opos++] = ')'; + break; + + case '\u2078': + // � [SUPERSCRIPT EIGHT] + case '\u2088': + // ₈ [SUBSCRIPT EIGHT] + case '\u2467': + // â‘§ [CIRCLED DIGIT EIGHT] + case '\u24FC': + // ⓼ [DOUBLE CIRCLED DIGIT EIGHT] + case '\u277D': + // � [DINGBAT NEGATIVE CIRCLED DIGIT EIGHT] + case '\u2787': + // ➇ [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT] + case '\u2791': + // âž‘ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT] + case '\uFF18': // 8 [FULLWIDTH DIGIT EIGHT] + output[opos++] = '8'; + break; + + case '\u248F': // â’� [DIGIT EIGHT FULL STOP] + output[opos++] = '8'; + output[opos++] = '.'; + break; + + case '\u247B': // â‘» [PARENTHESIZED DIGIT EIGHT] + output[opos++] = '('; + output[opos++] = '8'; + output[opos++] = ')'; + break; + + case '\u2079': + // � [SUPERSCRIPT NINE] + case '\u2089': + // ₉ [SUBSCRIPT NINE] + case '\u2468': + // ⑨ [CIRCLED DIGIT NINE] + case '\u24FD': + // ⓽ [DOUBLE CIRCLED DIGIT NINE] + case '\u277E': + // � [DINGBAT NEGATIVE CIRCLED DIGIT NINE] + case '\u2788': + // ➈ [DINGBAT CIRCLED SANS-SERIF DIGIT NINE] + case '\u2792': + // âž’ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE] + case '\uFF19': // ï¼™ [FULLWIDTH DIGIT NINE] + output[opos++] = '9'; + break; + + case '\u2490': // â’� [DIGIT NINE FULL STOP] + output[opos++] = '9'; + output[opos++] = '.'; + break; + + case '\u247C': // ⑼ [PARENTHESIZED DIGIT NINE] + output[opos++] = '('; + output[opos++] = '9'; + output[opos++] = ')'; + break; + + case '\u2469': + // â‘© [CIRCLED NUMBER TEN] + case '\u24FE': + // ⓾ [DOUBLE CIRCLED NUMBER TEN] + case '\u277F': + // � [DINGBAT NEGATIVE CIRCLED NUMBER TEN] + case '\u2789': + // ➉ [DINGBAT CIRCLED SANS-SERIF NUMBER TEN] + case '\u2793': // âž“ [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN] + output[opos++] = '1'; + output[opos++] = '0'; + break; + + case '\u2491': // â’‘ [NUMBER TEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '0'; + output[opos++] = '.'; + break; + + case '\u247D': // ⑽ [PARENTHESIZED NUMBER TEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '0'; + output[opos++] = ')'; + break; + + case '\u246A': + // ⑪ [CIRCLED NUMBER ELEVEN] + case '\u24EB': // â“« [NEGATIVE CIRCLED NUMBER ELEVEN] + output[opos++] = '1'; + output[opos++] = '1'; + break; + + case '\u2492': // â’’ [NUMBER ELEVEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '1'; + output[opos++] = '.'; + break; + + case '\u247E': // ⑾ [PARENTHESIZED NUMBER ELEVEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '1'; + output[opos++] = ')'; + break; + + case '\u246B': + // â‘« [CIRCLED NUMBER TWELVE] + case '\u24EC': // ⓬ [NEGATIVE CIRCLED NUMBER TWELVE] + output[opos++] = '1'; + output[opos++] = '2'; + break; + + case '\u2493': // â’“ [NUMBER TWELVE FULL STOP] + output[opos++] = '1'; + output[opos++] = '2'; + output[opos++] = '.'; + break; + + case '\u247F': // â‘¿ [PARENTHESIZED NUMBER TWELVE] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '2'; + output[opos++] = ')'; + break; + + case '\u246C': + // ⑬ [CIRCLED NUMBER THIRTEEN] + case '\u24ED': // â“­ [NEGATIVE CIRCLED NUMBER THIRTEEN] + output[opos++] = '1'; + output[opos++] = '3'; + break; + + case '\u2494': // â’�? [NUMBER THIRTEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '3'; + output[opos++] = '.'; + break; + + case '\u2480': // â’€ [PARENTHESIZED NUMBER THIRTEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '3'; + output[opos++] = ')'; + break; + + case '\u246D': + // â‘­ [CIRCLED NUMBER FOURTEEN] + case '\u24EE': // â“® [NEGATIVE CIRCLED NUMBER FOURTEEN] + output[opos++] = '1'; + output[opos++] = '4'; + break; + + case '\u2495': // â’• [NUMBER FOURTEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '4'; + output[opos++] = '.'; + break; + + case '\u2481': // â’� [PARENTHESIZED NUMBER FOURTEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '4'; + output[opos++] = ')'; + break; + + case '\u246E': + // â‘® [CIRCLED NUMBER FIFTEEN] + case '\u24EF': // ⓯ [NEGATIVE CIRCLED NUMBER FIFTEEN] + output[opos++] = '1'; + output[opos++] = '5'; + break; + + case '\u2496': // â’– [NUMBER FIFTEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '5'; + output[opos++] = '.'; + break; + + case '\u2482': // â’‚ [PARENTHESIZED NUMBER FIFTEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '5'; + output[opos++] = ')'; + break; + + case '\u246F': + // ⑯ [CIRCLED NUMBER SIXTEEN] + case '\u24F0': // â“° [NEGATIVE CIRCLED NUMBER SIXTEEN] + output[opos++] = '1'; + output[opos++] = '6'; + break; + + case '\u2497': // â’— [NUMBER SIXTEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '6'; + output[opos++] = '.'; + break; + + case '\u2483': // â’ƒ [PARENTHESIZED NUMBER SIXTEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '6'; + output[opos++] = ')'; + break; + + case '\u2470': + // â‘° [CIRCLED NUMBER SEVENTEEN] + case '\u24F1': // ⓱ [NEGATIVE CIRCLED NUMBER SEVENTEEN] + output[opos++] = '1'; + output[opos++] = '7'; + break; + + case '\u2498': // â’˜ [NUMBER SEVENTEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '7'; + output[opos++] = '.'; + break; + + case '\u2484': // â’„ [PARENTHESIZED NUMBER SEVENTEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '7'; + output[opos++] = ')'; + break; + + case '\u2471': + // ⑱ [CIRCLED NUMBER EIGHTEEN] + case '\u24F2': // ⓲ [NEGATIVE CIRCLED NUMBER EIGHTEEN] + output[opos++] = '1'; + output[opos++] = '8'; + break; + + case '\u2499': // â’™ [NUMBER EIGHTEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '8'; + output[opos++] = '.'; + break; + + case '\u2485': // â’… [PARENTHESIZED NUMBER EIGHTEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '8'; + output[opos++] = ')'; + break; + + case '\u2472': + // ⑲ [CIRCLED NUMBER NINETEEN] + case '\u24F3': // ⓳ [NEGATIVE CIRCLED NUMBER NINETEEN] + output[opos++] = '1'; + output[opos++] = '9'; + break; + + case '\u249A': // â’š [NUMBER NINETEEN FULL STOP] + output[opos++] = '1'; + output[opos++] = '9'; + output[opos++] = '.'; + break; + + case '\u2486': // â’† [PARENTHESIZED NUMBER NINETEEN] + output[opos++] = '('; + output[opos++] = '1'; + output[opos++] = '9'; + output[opos++] = ')'; + break; + + case '\u2473': + // ⑳ [CIRCLED NUMBER TWENTY] + case '\u24F4': // â“´ [NEGATIVE CIRCLED NUMBER TWENTY] + output[opos++] = '2'; + output[opos++] = '0'; + break; + + case '\u249B': // â’› [NUMBER TWENTY FULL STOP] + output[opos++] = '2'; + output[opos++] = '0'; + output[opos++] = '.'; + break; + + case '\u2487': // â’‡ [PARENTHESIZED NUMBER TWENTY] + output[opos++] = '('; + output[opos++] = '2'; + output[opos++] = '0'; + output[opos++] = ')'; + break; + + case '\u00AB': + // « [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK] + case '\u00BB': + // » [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK] + case '\u201C': + // “ [LEFT DOUBLE QUOTATION MARK] + case '\u201D': + // � [RIGHT DOUBLE QUOTATION MARK] + case '\u201E': + // „ [DOUBLE LOW-9 QUOTATION MARK] + case '\u2033': + // ″ [DOUBLE PRIME] + case '\u2036': + // ‶ [REVERSED DOUBLE PRIME] + case '\u275D': + // � [HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT] + case '\u275E': + // � [HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT] + case '\u276E': + // � [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT] + case '\u276F': + // � [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT] + case '\uFF02': // " [FULLWIDTH QUOTATION MARK] + output[opos++] = '"'; + break; + + case '\u2018': + // ‘ [LEFT SINGLE QUOTATION MARK] + case '\u2019': + // ’ [RIGHT SINGLE QUOTATION MARK] + case '\u201A': + // ‚ [SINGLE LOW-9 QUOTATION MARK] + case '\u201B': + // ‛ [SINGLE HIGH-REVERSED-9 QUOTATION MARK] + case '\u2032': + // ′ [PRIME] + case '\u2035': + // ‵ [REVERSED PRIME] + case '\u2039': + // ‹ [SINGLE LEFT-POINTING ANGLE QUOTATION MARK] + case '\u203A': + // › [SINGLE RIGHT-POINTING ANGLE QUOTATION MARK] + case '\u275B': + // � [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT] + case '\u275C': + // � [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT] + case '\uFF07': // ' [FULLWIDTH APOSTROPHE] + output[opos++] = '\''; + break; + + case '\u2010': + // � [HYPHEN] + case '\u2011': + // ‑ [NON-BREAKING HYPHEN] + case '\u2012': + // ‒ [FIGURE DASH] + case '\u2013': + // – [EN DASH] + case '\u2014': + // �? [EM DASH] + case '\u207B': + // � [SUPERSCRIPT MINUS] + case '\u208B': + // â‚‹ [SUBSCRIPT MINUS] + case '\uFF0D': // � [FULLWIDTH HYPHEN-MINUS] + output[opos++] = '-'; + break; + + case '\u2045': + // � [LEFT SQUARE BRACKET WITH QUILL] + case '\u2772': + // � [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT] + case '\uFF3B': // ï¼» [FULLWIDTH LEFT SQUARE BRACKET] + output[opos++] = '['; + break; + + case '\u2046': + // � [RIGHT SQUARE BRACKET WITH QUILL] + case '\u2773': + // � [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT] + case '\uFF3D': // ï¼½ [FULLWIDTH RIGHT SQUARE BRACKET] + output[opos++] = ']'; + break; + + case '\u207D': + // � [SUPERSCRIPT LEFT PARENTHESIS] + case '\u208D': + // � [SUBSCRIPT LEFT PARENTHESIS] + case '\u2768': + // � [MEDIUM LEFT PARENTHESIS ORNAMENT] + case '\u276A': + // � [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT] + case '\uFF08': // ( [FULLWIDTH LEFT PARENTHESIS] + output[opos++] = '('; + break; + + case '\u2E28': // ⸨ [LEFT DOUBLE PARENTHESIS] + output[opos++] = '('; + output[opos++] = '('; + break; + + case '\u207E': + // � [SUPERSCRIPT RIGHT PARENTHESIS] + case '\u208E': + // ₎ [SUBSCRIPT RIGHT PARENTHESIS] + case '\u2769': + // � [MEDIUM RIGHT PARENTHESIS ORNAMENT] + case '\u276B': + // � [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT] + case '\uFF09': // ) [FULLWIDTH RIGHT PARENTHESIS] + output[opos++] = ')'; + break; + + case '\u2E29': // ⸩ [RIGHT DOUBLE PARENTHESIS] + output[opos++] = ')'; + output[opos++] = ')'; + break; + + case '\u276C': + // � [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT] + case '\u2770': + // � [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT] + case '\uFF1C': // < [FULLWIDTH LESS-THAN SIGN] + output[opos++] = '<'; + break; + + case '\u276D': + // � [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT] + case '\u2771': + // � [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT] + case '\uFF1E': // > [FULLWIDTH GREATER-THAN SIGN] + output[opos++] = '>'; + break; + + case '\u2774': + // � [MEDIUM LEFT CURLY BRACKET ORNAMENT] + case '\uFF5B': // ï½› [FULLWIDTH LEFT CURLY BRACKET] + output[opos++] = '{'; + break; + + case '\u2775': + // � [MEDIUM RIGHT CURLY BRACKET ORNAMENT] + case '\uFF5D': // � [FULLWIDTH RIGHT CURLY BRACKET] + output[opos++] = '}'; + break; + + case '\u207A': + // � [SUPERSCRIPT PLUS SIGN] + case '\u208A': + // ₊ [SUBSCRIPT PLUS SIGN] + case '\uFF0B': // + [FULLWIDTH PLUS SIGN] + output[opos++] = '+'; + break; + + case '\u207C': + // � [SUPERSCRIPT EQUALS SIGN] + case '\u208C': + // ₌ [SUBSCRIPT EQUALS SIGN] + case '\uFF1D': // � [FULLWIDTH EQUALS SIGN] + output[opos++] = '='; + break; + + case '\uFF01': // � [FULLWIDTH EXCLAMATION MARK] + output[opos++] = '!'; + break; + + case '\u203C': // ‼ [DOUBLE EXCLAMATION MARK] + output[opos++] = '!'; + output[opos++] = '!'; + break; + + case '\u2049': // � [EXCLAMATION QUESTION MARK] + output[opos++] = '!'; + output[opos++] = '?'; + break; + + case '\uFF03': // # [FULLWIDTH NUMBER SIGN] + output[opos++] = '#'; + break; + + case '\uFF04': // $ [FULLWIDTH DOLLAR SIGN] + output[opos++] = '$'; + break; + + case '\u2052': + // � [COMMERCIAL MINUS SIGN] + case '\uFF05': // ï¼… [FULLWIDTH PERCENT SIGN] + output[opos++] = '%'; + break; + + case '\uFF06': // & [FULLWIDTH AMPERSAND] + output[opos++] = '&'; + break; + + case '\u204E': + // � [LOW ASTERISK] + case '\uFF0A': // * [FULLWIDTH ASTERISK] + output[opos++] = '*'; + break; + + case '\uFF0C': // , [FULLWIDTH COMMA] + output[opos++] = ','; + break; + + case '\uFF0E': // . [FULLWIDTH FULL STOP] + output[opos++] = '.'; + break; + + case '\u2044': + // � [FRACTION SLASH] + case '\uFF0F': // � [FULLWIDTH SOLIDUS] + output[opos++] = '/'; + break; + + case '\uFF1A': // : [FULLWIDTH COLON] + output[opos++] = ':'; + break; + + case '\u204F': + // � [REVERSED SEMICOLON] + case '\uFF1B': // ï¼› [FULLWIDTH SEMICOLON] + output[opos++] = ';'; + break; + + case '\uFF1F': // ? [FULLWIDTH QUESTION MARK] + output[opos++] = '?'; + break; + + case '\u2047': // � [DOUBLE QUESTION MARK] + output[opos++] = '?'; + output[opos++] = '?'; + break; + + case '\u2048': // � [QUESTION EXCLAMATION MARK] + output[opos++] = '?'; + output[opos++] = '!'; + break; + + case '\uFF20': // ï¼  [FULLWIDTH COMMERCIAL AT] + output[opos++] = '@'; + break; + + case '\uFF3C': // ï¼¼ [FULLWIDTH REVERSE SOLIDUS] + output[opos++] = '\\'; + break; + + case '\u2038': + // ‸ [CARET] + case '\uFF3E': // ï¼¾ [FULLWIDTH CIRCUMFLEX ACCENT] + output[opos++] = '^'; + break; + + case '\uFF3F': // _ [FULLWIDTH LOW LINE] + output[opos++] = '_'; + break; + + case '\u2053': + // � [SWUNG DASH] + case '\uFF5E': // ~ [FULLWIDTH TILDE] + output[opos++] = '~'; + break; + + // BEGIN CUSTOM TRANSLITERATION OF CYRILIC CHARS + + #region Cyrilic chars + + // russian uppercase "А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я" + // russian lowercase "а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я" + + // notes + // read http://www.vesic.org/english/blog/c-sharp/transliteration-easy-way-microsoft-transliteration-utility/ + // should we look into MS Transliteration Utility (http://msdn.microsoft.com/en-US/goglobal/bb688104.aspx) + // also UnicodeSharpFork https://bitbucket.org/DimaStefantsov/unidecodesharpfork + // also Transliterator http://transliterator.codeplex.com/ + // + // in any case it would be good to generate all those "case" statements instead of writing them by hand + // time for a T4 template? + // also we should support extensibility so ppl can register more cases in external code + + // fixme + // transliterates Анастасия as Anastasiya, and not Anastasia + // Ольга --> Ol'ga, Татьяна --> Tat'yana -- that's bad (?) + // Note: should ä (german umlaut) become a or ae ? + + case '\u0410': // А + output[opos++] = 'A'; + break; + case '\u0430': // а + output[opos++] = 'a'; + break; + case '\u0411': // Б + output[opos++] = 'B'; + break; + case '\u0431': // б + output[opos++] = 'b'; + break; + case '\u0412': // В + output[opos++] = 'V'; + break; + case '\u0432': // в + output[opos++] = 'v'; + break; + case '\u0413': // Г + output[opos++] = 'G'; + break; + case '\u0433': // г + output[opos++] = 'g'; + break; + case '\u0414': // Д + output[opos++] = 'D'; + break; + case '\u0434': // д + output[opos++] = 'd'; + break; + case '\u0415': // Е + output[opos++] = 'E'; + break; + case '\u0435': // е + output[opos++] = 'e'; + break; + case '\u0401': // Ё + output[opos++] = 'E'; // alt. Yo + break; + case '\u0451': // ё + output[opos++] = 'e'; // alt. yo + break; + case '\u0416': // Ж + output[opos++] = 'Z'; + output[opos++] = 'h'; + break; + case '\u0436': // ж + output[opos++] = 'z'; + output[opos++] = 'h'; + break; + case '\u0417': // З + output[opos++] = 'Z'; + break; + case '\u0437': // з + output[opos++] = 'z'; + break; + case '\u0418': // И + output[opos++] = 'I'; + break; + case '\u0438': // и + output[opos++] = 'i'; + break; + case '\u0419': // Й + output[opos++] = 'I'; // alt. Y, J + break; + case '\u0439': // й + output[opos++] = 'i'; // alt. y, j + break; + case '\u041A': // К + output[opos++] = 'K'; + break; + case '\u043A': // к + output[opos++] = 'k'; + break; + case '\u041B': // Л + output[opos++] = 'L'; + break; + case '\u043B': // л + output[opos++] = 'l'; + break; + case '\u041C': // М + output[opos++] = 'M'; + break; + case '\u043C': // м + output[opos++] = 'm'; + break; + case '\u041D': // Н + output[opos++] = 'N'; + break; + case '\u043D': // н + output[opos++] = 'n'; + break; + case '\u041E': // О + output[opos++] = 'O'; + break; + case '\u043E': // о + output[opos++] = 'o'; + break; + case '\u041F': // П + output[opos++] = 'P'; + break; + case '\u043F': // п + output[opos++] = 'p'; + break; + case '\u0420': // Р + output[opos++] = 'R'; + break; + case '\u0440': // р + output[opos++] = 'r'; + break; + case '\u0421': // С + output[opos++] = 'S'; + break; + case '\u0441': // с + output[opos++] = 's'; + break; + case '\u0422': // Т + output[opos++] = 'T'; + break; + case '\u0442': // т + output[opos++] = 't'; + break; + case '\u0423': // У + output[opos++] = 'U'; + break; + case '\u0443': // у + output[opos++] = 'u'; + break; + case '\u0424': // Ф + output[opos++] = 'F'; + break; + case '\u0444': // ф + output[opos++] = 'f'; + break; + case '\u0425': // Х + output[opos++] = 'K'; // alt. X + output[opos++] = 'h'; + break; + case '\u0445': // х + output[opos++] = 'k'; // alt. x + output[opos++] = 'h'; + break; + case '\u0426': // Ц + output[opos++] = 'F'; + break; + case '\u0446': // ц + output[opos++] = 'f'; + break; + case '\u0427': // Ч + output[opos++] = 'C'; // alt. Ts, C + output[opos++] = 'h'; + break; + case '\u0447': // ч + output[opos++] = 'c'; // alt. ts, c + output[opos++] = 'h'; + break; + case '\u0428': // Ш + output[opos++] = 'S'; // alt. Ch, S + output[opos++] = 'h'; + break; + case '\u0448': // ш + output[opos++] = 's'; // alt. ch, s + output[opos++] = 'h'; + break; + case '\u0429': // Щ + output[opos++] = 'S'; // alt. Shch, Sc + output[opos++] = 'h'; + break; + case '\u0449': // щ + output[opos++] = 's'; // alt. shch, sc + output[opos++] = 'h'; + break; + case '\u042A': // Ъ + output[opos++] = '"'; // " + break; + case '\u044A': // ъ + output[opos++] = '"'; // " + break; + case '\u042B': // Ы + output[opos++] = 'Y'; + break; + case '\u044B': // ы + output[opos++] = 'y'; + break; + case '\u042C': // Ь + output[opos++] = '\''; // ' + break; + case '\u044C': // ь + output[opos++] = '\''; // ' + break; + case '\u042D': // Э + output[opos++] = 'E'; + break; + case '\u044D': // э + output[opos++] = 'e'; + break; + case '\u042E': // Ю + output[opos++] = 'Y'; // alt. Ju + output[opos++] = 'u'; + break; + case '\u044E': // ю + output[opos++] = 'y'; // alt. ju + output[opos++] = 'u'; + break; + case '\u042F': // Я + output[opos++] = 'Y'; // alt. Ja + output[opos++] = 'a'; + break; + case '\u044F': // я + output[opos++] = 'y'; // alt. ja + output[opos++] = 'a'; + break; + + #endregion + + // BEGIN EXTRA + /* + case '£': + output[opos++] = 'G'; + output[opos++] = 'B'; + output[opos++] = 'P'; + break; + + case '€': + output[opos++] = 'E'; + output[opos++] = 'U'; + output[opos++] = 'R'; + break; + + case '©': + output[opos++] = '('; + output[opos++] = 'C'; + output[opos++] = ')'; + break; + */ + default: + //if (ToMoreAscii(input, ipos, output, ref opos)) + // break; + + //if (!char.IsLetterOrDigit(c)) // that would not catch eg 汉 unfortunately + // output[opos++] = '?'; + //else + // output[opos++] = c; + + // strict ASCII + output[opos++] = '?'; + + break; + } + } + } + + //private static bool ToMoreAscii(char[] input, int ipos, char[] output, ref int opos) + //{ + // var c = input[ipos]; + + // switch (c) + // { + // case '£': + // output[opos++] = 'G'; + // output[opos++] = 'B'; + // output[opos++] = 'P'; + // break; + + // case '€': + // output[opos++] = 'E'; + // output[opos++] = 'U'; + // output[opos++] = 'R'; + // break; + + // case '©': + // output[opos++] = '('; + // output[opos++] = 'C'; + // output[opos++] = ')'; + // break; + + // default: + // return false; + // } + + // return true; + //} + } +} diff --git a/elFinder.Net/elFinder.Net.csproj b/elFinder.Net/elFinder.Net.csproj index 0ad3981..a426b1c 100644 --- a/elFinder.Net/elFinder.Net.csproj +++ b/elFinder.Net/elFinder.Net.csproj @@ -38,6 +38,10 @@ 4 + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + ..\packages\Newtonsoft.Json.4.5.7\lib\net35\Newtonsoft.Json.dll @@ -46,7 +50,30 @@ - + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll + + + True + ..\packages\Microsoft.AspNet.Mvc.4.0.40804.0\lib\net40\System.Web.Mvc.dll + + + True + ..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll + @@ -56,11 +83,13 @@ + + diff --git a/elFinder.Net/packages.config b/elFinder.Net/packages.config index 9c53c9a..7302312 100644 --- a/elFinder.Net/packages.config +++ b/elFinder.Net/packages.config @@ -1,4 +1,8 @@  + + + + \ No newline at end of file