diff --git a/DEPS b/DEPS index 3a28417..6d1cdbce 100644 --- a/DEPS +++ b/DEPS
@@ -310,7 +310,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '3b3f3ab87a3a84935f60e6ddbc8f5058ddac4cd6', + 'skia_revision': '210a0e6efb9f4da9ea8286315348b17bc5cb8429', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -337,7 +337,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:9.20220918.3.1', + 'fuchsia_version': 'version:9.20220919.1.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -389,7 +389,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '907a5427e901cdb255a4fd2e153c085b287d3d59', + 'devtools_frontend_revision': 'c76b2603c0878a54e216e3b3cac019f760d6ba77', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -796,7 +796,7 @@ Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248', 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'f78cdb4fc477a97ad9c991c9f8c0a0bb70697a0e', + 'url': Var('chromium_git') + '/website.git' + '@' + 'e1e47abc01e36d3fcf7c3c01a8d13ac5c931cf89', }, 'src/ios/third_party/earl_grey2/src': { @@ -885,7 +885,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'Ujrea1gzpxsElKLIT14Y-vfmzCzTePS2R4vGCd2uh_UC', + 'version': 'z2bYSfygNpoqL3jNgDUvAeoTJNZlb9jNCndfGYRNdEYC', }, ], 'dep_type': 'cipd', @@ -896,7 +896,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'hhTZRHafH_Ta4ERI2OuOa6XJoCoS26L_0WkNmypanmoC', + 'version': 'WRaObXk1GaVFzOjlbAOWop0u9_0vhKYryfBkYVm8gAYC', }, ], 'dep_type': 'cipd', @@ -907,7 +907,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'UxIae36D9P9CXnRXWWaVAK-0wyFWXvG0_ccCjQc4PhUC', + 'version': 'BZIlCIggodhpege5YvFQ7gysrQwAO65q0mQSDAxjMcwC', }, ], 'dep_type': 'cipd', @@ -975,7 +975,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'AYvQ0esaflIAo3TIi1RiQRaC6dRKgb43RQH8A-6feBEC', + 'version': '57GvG50OUQda15ok8arvlweTpZAfD2QHyBuSpD1-LY0C', }, ], 'condition': 'checkout_android', @@ -1190,7 +1190,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'cb8e8ce40cb4f3957bd0b70a2c2e5e6f620dd590', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ffa2fbdfd476ff4be76916868764d6a966afc92c', 'condition': 'checkout_chromeos', }, @@ -1224,7 +1224,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '6ca98a436f4f01470974e55a2feffeacaf8de8f9', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'ca61f1ddfe0cc68e721520db2ed9496231ebf6a2', 'condition': 'checkout_src_internal', }, @@ -1796,7 +1796,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0fee76f32e7bf08d5799ea2b073bc70e313f6d06', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1306ad4bd79779f14f833174f91653a54eb0be00', + Var('webrtc_git') + '/src.git' + '@' + '44161f542b9115eb58f4d7949d88a23c82af179c', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1869,7 +1869,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b4f0c4ba4da22f01f3bae0651da2171007d01ba9', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3dcef454b1d1bde0d01889a3275830302ac7df66', 'condition': 'checkout_src_internal', }, @@ -1899,7 +1899,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'ygI4kwky2OvnVpuHCyhh33VRhd2Mq3GE3Y-BHsWWHFQC', + 'version': '7ago_T4m4VlIxt_jm0P5kN2BQ6gJV4hexa6TKZqJo7YC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1910,7 +1910,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': '_TGZCGNQEFSlBmZlsRVeU-HBBwp0djZ6q30V4a89cTkC', + 'version': 'AWeeqX9EeQugGwZBRRX5GQ05cQaNh_3O_MFCwDmclqEC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/accelerators/accelerator_commands.cc b/ash/accelerators/accelerator_commands.cc index 61feb9b..cecdd7a 100644 --- a/ash/accelerators/accelerator_commands.cc +++ b/ash/accelerators/accelerator_commands.cc
@@ -9,6 +9,7 @@ #include "ash/accessibility/accessibility_controller_impl.h" #include "ash/accessibility/magnifier/docked_magnifier_controller.h" #include "ash/accessibility/magnifier/fullscreen_magnifier_controller.h" +#include "ash/ambient/ambient_controller.h" #include "ash/capture_mode/capture_mode_camera_controller.h" #include "ash/capture_mode/capture_mode_controller.h" #include "ash/clipboard/clipboard_history_controller_impl.h" @@ -342,6 +343,20 @@ } // namespace +void ActivateDesk(bool activate_left) { + auto* desks_controller = DesksController::Get(); + const bool success = desks_controller->ActivateAdjacentDesk( + activate_left, DesksSwitchSource::kDeskSwitchShortcut); + if (!success) + return; + + if (activate_left) { + base::RecordAction(base::UserMetricsAction("Accel_Desks_ActivateLeft")); + } else { + base::RecordAction(base::UserMetricsAction("Accel_Desks_ActivateRight")); + } +} + void ActivateDeskAtIndex(AcceleratorAction action) { DCHECK_GE(action, DESKS_ACTIVATE_0); DCHECK_LE(action, DESKS_ACTIVATE_7); @@ -531,6 +546,54 @@ audio_handler->SetInputMute(mute); } +void MoveActiveItem(bool going_left) { + auto* desks_controller = DesksController::Get(); + if (desks_controller->AreDesksBeingModified()) + return; + + aura::Window* window_to_move = nullptr; + auto* overview_controller = Shell::Get()->overview_controller(); + const bool in_overview = overview_controller->InOverviewSession(); + if (in_overview) { + window_to_move = + overview_controller->overview_session()->GetHighlightedWindow(); + } else { + window_to_move = window_util::GetActiveWindow(); + } + + if (!window_to_move || !desks_util::BelongsToActiveDesk(window_to_move)) + return; + + Desk* target_desk = nullptr; + if (going_left) { + target_desk = desks_controller->GetPreviousDesk(); + base::RecordAction(base::UserMetricsAction("Accel_Desks_MoveWindowLeft")); + } else { + target_desk = desks_controller->GetNextDesk(); + base::RecordAction(base::UserMetricsAction("Accel_Desks_MoveWindowRight")); + } + + if (!target_desk) + return; + + if (!in_overview) { + desks_animations::PerformWindowMoveToDeskAnimation(window_to_move, + going_left); + } + + if (!desks_controller->MoveWindowFromActiveDeskTo( + window_to_move, target_desk, window_to_move->GetRootWindow(), + DesksMoveWindowFromActiveDeskSource::kShortcut)) { + return; + } + + if (in_overview) { + // We should not exit overview as a result of this shortcut. + DCHECK(overview_controller->InOverviewSession()); + overview_controller->overview_session()->PositionWindows(/*animate=*/true); + } +} + void NewDesk() { auto* desks_controller = DesksController::Get(); if (!desks_controller->CanCreateDesks()) { @@ -556,6 +619,10 @@ /*should_trigger_session_restore=*/false); } +void NewTab() { + NewWindowDelegate::GetPrimary()->NewTab(); +} + void NewWindow() { NewWindowDelegate::GetPrimary()->NewWindow( /*is_incognito=*/false, @@ -709,6 +776,10 @@ chromeos::PowerManagerClient::Get()->RequestSuspend(); } +void ToggleAmbientMode() { + Shell::Get()->ambient_controller()->ToggleInSessionUi(); +} + void ToggleAssignToAllDesk() { auto* active_window = window_util::GetActiveWindow(); if (!active_window)
diff --git a/ash/accelerators/accelerator_commands.h b/ash/accelerators/accelerator_commands.h index 359090e8..84c7079 100644 --- a/ash/accelerators/accelerator_commands.h +++ b/ash/accelerators/accelerator_commands.h
@@ -17,6 +17,9 @@ namespace ash { namespace accelerators { +// Activate desk on the left/right. +ASH_EXPORT void ActivateDesk(bool activate_left); + // Activate desk 1 to 8. ASH_EXPORT void ActivateDeskAtIndex(AcceleratorAction action); @@ -101,12 +104,18 @@ // Toggle microphone mute. ASH_EXPORT void MicrophoneMuteToggle(); +// Move active window to the desk on the left/right. +ASH_EXPORT void MoveActiveItem(bool going_left); + // Create a new desk. ASH_EXPORT void NewDesk(); // Open a new incognito browser window. ASH_EXPORT void NewIncognitoWindow(); +// Open a new tab. +ASH_EXPORT void NewTab(); + // Open a new browser window. ASH_EXPORT void NewWindow(); @@ -165,6 +174,9 @@ // Put device in sleep mode(suspend). ASH_EXPORT void Suspend(); +// Turn the ambient mode on or off. +ASH_EXPORT void ToggleAmbientMode(); + // Assign active window to all desks. ASH_EXPORT void ToggleAssignToAllDesk();
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc index 0ccccb5..651dd4c 100644 --- a/ash/accelerators/accelerator_controller_impl.cc +++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -202,67 +202,9 @@ base::RecordAction(UserMetricsAction("Accel_Fullscreen_F4")); } -void HandleActivateDesk(const ui::Accelerator& accelerator, - bool activate_left) { - auto* desks_controller = DesksController::Get(); - const bool success = desks_controller->ActivateAdjacentDesk( - activate_left, DesksSwitchSource::kDeskSwitchShortcut); - if (!success) - return; - - if (activate_left) { - base::RecordAction(base::UserMetricsAction("Accel_Desks_ActivateLeft")); - } else { - base::RecordAction(base::UserMetricsAction("Accel_Desks_ActivateRight")); - } -} - -void HandleMoveActiveItem(const ui::Accelerator& accelerator, bool going_left) { - auto* desks_controller = DesksController::Get(); - if (desks_controller->AreDesksBeingModified()) - return; - - aura::Window* window_to_move = nullptr; - auto* overview_controller = Shell::Get()->overview_controller(); - const bool in_overview = overview_controller->InOverviewSession(); - if (in_overview) { - window_to_move = - overview_controller->overview_session()->GetHighlightedWindow(); - } else { - window_to_move = window_util::GetActiveWindow(); - } - - if (!window_to_move || !desks_util::BelongsToActiveDesk(window_to_move)) - return; - - Desk* target_desk = nullptr; - if (going_left) { - target_desk = desks_controller->GetPreviousDesk(); - base::RecordAction(base::UserMetricsAction("Accel_Desks_MoveWindowLeft")); - } else { - target_desk = desks_controller->GetNextDesk(); - base::RecordAction(base::UserMetricsAction("Accel_Desks_MoveWindowRight")); - } - - if (!target_desk) - return; - - if (!in_overview) { - desks_animations::PerformWindowMoveToDeskAnimation(window_to_move, - going_left); - } - - if (!desks_controller->MoveWindowFromActiveDeskTo( - window_to_move, target_desk, window_to_move->GetRootWindow(), - DesksMoveWindowFromActiveDeskSource::kShortcut)) { - return; - } - - if (in_overview) { - // We should not exit overview as a result of this shortcut. - DCHECK(overview_controller->InOverviewSession()); - overview_controller->overview_session()->PositionWindows(/*animate=*/true); - } +void RecordNewTab(const ui::Accelerator& accelerator) { + if (accelerator.key_code() == ui::VKEY_T) + base::RecordAction(UserMetricsAction("Accel_NewTab_T")); } // TODO(zentaro): This is duplicated in accelerator_commands.cc. Remove @@ -297,12 +239,6 @@ return user_type && *user_type != user_manager::USER_TYPE_GUEST; } -void HandleNewTab(const ui::Accelerator& accelerator) { - if (accelerator.key_code() == ui::VKEY_T) - base::RecordAction(UserMetricsAction("Accel_NewTab_T")); - NewWindowDelegate::GetPrimary()->NewTab(); -} - bool CanCycleInputMethod() { return Shell::Get()->ime_controller()->CanSwitchIme(); } @@ -470,10 +406,6 @@ return chromeos::features::IsAmbientModeEnabled(); } -void HandleToggleAmbientMode(const ui::Accelerator& accelerator) { - Shell::Get()->ambient_controller()->ToggleInSessionUi(); -} - void HandleToggleAssistant(const ui::Accelerator& accelerator) { if (accelerator.IsCmdDown() && accelerator.key_code() == ui::VKEY_SPACE) { base::RecordAction( @@ -1230,16 +1162,20 @@ accelerators::CycleForwardMru(); break; case DESKS_ACTIVATE_DESK_LEFT: - HandleActivateDesk(accelerator, /*activate_left=*/true); + // UMA metrics are recorded in the function. + accelerators::ActivateDesk(/*activate_left=*/true); break; case DESKS_ACTIVATE_DESK_RIGHT: - HandleActivateDesk(accelerator, /*activate_left=*/false); + // UMA metrics are recorded in the function. + accelerators::ActivateDesk(/*activate_left=*/false); break; case DESKS_MOVE_ACTIVE_ITEM_LEFT: - HandleMoveActiveItem(accelerator, /*going_left=*/true); + // UMA metrics are recorded in the function. + accelerators::MoveActiveItem(/*going_left=*/true); break; case DESKS_MOVE_ACTIVE_ITEM_RIGHT: - HandleMoveActiveItem(accelerator, /*going_left=*/false); + // UMA metrics are recorded in the function. + accelerators::MoveActiveItem(/*going_left=*/false); break; case DESKS_NEW_DESK: // UMA metrics are recorded in the function. @@ -1438,7 +1374,8 @@ accelerators::NewIncognitoWindow(); break; case NEW_TAB: - HandleNewTab(accelerator); + RecordNewTab(accelerator); + accelerators::NewTab(); break; case NEW_WINDOW: base::RecordAction(base::UserMetricsAction("Accel_New_Window")); @@ -1530,7 +1467,7 @@ accelerators::ShowTaskManager(); break; case START_AMBIENT_MODE: - HandleToggleAmbientMode(accelerator); + accelerators::ToggleAmbientMode(); break; case START_ASSISTANT: HandleToggleAssistant(accelerator);
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb index 2f11ae88..63b62cc8 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb
@@ -93,6 +93,7 @@ <translation id="3949671998904569433">მძიმე</translation> <translation id="3976863468609830880">თაროზე ბოლო ხატულაზე დაწკაპუნება</translation> <translation id="3994783594793697310">ეკრანის მასშტაბის დონის გადაყენება</translation> +<translation id="4026837045671473537">ფერთა ინვერსიის რეჟიმის ჩართვა</translation> <translation id="4026843240379844265">აქტიური ფანჯრის გადატანა ეკრანებს შორის</translation> <translation id="4035482366624727273">გვერდზე ყველაფრის არჩევა</translation> <translation id="4060703249685950734">თქვენ მიერ დახურული ბოლო ჩანართის ან ფანჯრის ხელახლა გახსნა</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb index e24eb0af..aeeffbb 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb
@@ -93,6 +93,7 @@ <translation id="3949671998904569433">čiarka</translation> <translation id="3976863468609830880">Kliknutie na poslednú ikonu na poličke</translation> <translation id="3994783594793697310">Resetovať na obrazovke úroveň lupy</translation> +<translation id="4026837045671473537">Zapnutie režimu inverzie farieb</translation> <translation id="4026843240379844265">Presun aktívneho okna medzi obrazovkami</translation> <translation id="4035482366624727273">Výber celého obsahu stránky</translation> <translation id="4060703249685950734">Opätovné otvorenie poslednej zatvorenej karty alebo okna</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb index 110d839e..f853705 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb
@@ -93,6 +93,7 @@ <translation id="3949671998904569433">కామా గుర్తు</translation> <translation id="3976863468609830880">మీ అరలోని చివరి చిహ్నాన్ని క్లిక్ చేయండి</translation> <translation id="3994783594793697310">డిస్ప్లే జూమ్ స్థాయిని రీసెట్ చేస్తుంది</translation> +<translation id="4026837045671473537">కలర్ మార్పిడి మోడ్ను ఆన్ చేయండి</translation> <translation id="4026843240379844265">యాక్టివ్ విండోను డిస్ప్లేల మధ్య తరల్చండి</translation> <translation id="4035482366624727273">పేజీలోని ప్రతిదాన్ని ఎంచుకోండి</translation> <translation id="4060703249685950734">మీరు చివరిసారి మూసివేసిన ట్యాబ్ లేదా విండోను తిరిగి తెరవండి</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb index 1a7840f9..13fc0478 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb
@@ -93,6 +93,7 @@ <translation id="3949671998904569433">จุลภาค</translation> <translation id="3976863468609830880">คลิกไอคอนสุดท้ายบนชั้นวาง</translation> <translation id="3994783594793697310">รีเซ็ตระดับการซูมหน้าจอ</translation> +<translation id="4026837045671473537">เปิดโหมดการกลับสี</translation> <translation id="4026843240379844265">ย้ายหน้าต่างที่ใช้งานไปยังหน้าจอต่างๆ</translation> <translation id="4035482366624727273">เลือกทุกอย่างในหน้าเว็บ</translation> <translation id="4060703249685950734">เปิดแท็บหรือหน้าต่างที่คุณปิดล่าสุดขึ้นมาอีกครั้ง</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb index de3a7bf8..fe08321 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb
@@ -93,6 +93,7 @@ <translation id="3949671998904569433">逗號</translation> <translation id="3976863468609830880">按一下捷徑列中的最後一個圖示</translation> <translation id="3994783594793697310">重設顯示縮放比例</translation> +<translation id="4026837045671473537">啟用色彩反轉模式</translation> <translation id="4026843240379844265">在顯示屏之間移動使用中的視窗</translation> <translation id="4035482366624727273">選取網頁上的所有項目</translation> <translation id="4060703249685950734">重新開啟最近關閉的分頁或視窗</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 5013dc3..f2ad6f55 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">ሙሉ ማያ ገጽን ቅረጽ</translation> <translation id="2135456203358955318">የተተከለ ማጉያ</translation> <translation id="2148716181193084225">ዛሬ</translation> +<translation id="2161132820593978283">የቪድዮ ጥሪዎች ላይ በማያ ገጹ መሃል ላይ እንዲሆኑ የካሜራ ክፈፍ መስራትን ይሞክሩ። በፈጣን ቅንብሮች ውስጥ ያብሩት።</translation> <translation id="2170530631236737939">ከአጠቃላይ ዕይታ ለመውጣት በሦስት ጣቶች ወደ ታች ያንሸራትቱ</translation> <translation id="219905428774326614">ማስጀመሪያ፣ ሁሉም መተግበሪያዎች</translation> <translation id="2201071101391734388">የቅርብ ጊዜ ፎቶ <ph name="INDEX" /> ከ<ph name="TOTAL_COUNT" />።</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">አልተገናኘም</translation> <translation id="2408955596600435184">የእርስዎን ፒን ያስገቡ</translation> <translation id="2412593942846481727">ዝማኔ ይገኛል</translation> +<translation id="2426051945783024481">የካሜራ ክፈፍ በራስ-ሰር መሃል ላይ ሆኗል</translation> <translation id="2427507373259914951">የግራ ጠቅታ</translation> <translation id="2429753432712299108">የብሉቱዝ መሣሪያ «<ph name="DEVICE_NAME" />» ለመጣመር ፍቃድ ይፈልጋል። ከመቀበልዎ በፊት እባክዎ ይህ የይለፍ ቃል በዚያ መሣሪያ ላይ የሚታይ መሆኑን ያረጋግጡ፦ <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">የይለፍ ቃል አሳይ</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">አልገበረም። የአገልግሎት አቅራቢዎን ያነጋግሩ።</translation> <translation id="6961121602502368900">በሥራ መገለጫ ላይ የስልክ ድምጽን ማጥፋት አይገኝም</translation> <translation id="6961840794482373852">የAlt + የላይ ቀስት ቁልፍ ሰሌዳ አቋራጭ ተለውጧል። የገጽ የላይ ቁልፍ ለመጠቀም የ<ph name="LAUNCHER_KEY_NAME" /> ቁልፍ + የላይ ቀስት ይጫኑ።</translation> +<translation id="696267987219125751">የካሜራ ክፈፍ መስራት ጠፍቷል።</translation> <translation id="6965382102122355670">እሺ</translation> <translation id="6972754398087986839">አስጀማሪ መመሪያ</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">ቀን መቁጠሪያ፣ የ<ph name="DATE" /> ሳምንት፣ <ph name="SELECTED_DATE" /> በአሁኑ ጊዜ ተመርጧል።</translation> <translation id="7514365320538308">አውርድ</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">የካሜራ ክፈፍ መስራት በርቷል።</translation> <translation id="7526573455193969409">አውታረ መረብ ክትትል የሚደረግበት ሊሆን ይችላል</translation> <translation id="7536035074519304529">የአይፒ አድራሻ፦ <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">የሊኑክስ መተግበሪያዎች እና ማንነት የማያሳውቁ መስኮቶች በአሁኑ ጊዜ አይደገፉም። ሌሎች መተግበሪያዎች ይቀመጣሉ።</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">ለአፍታ ቆሟል</translation> <translation id="7609951632080598826">የቀን መቁጠሪያ እይታ፣ <ph name="DATE" />፣ <ph name="TIME" /></translation> <translation id="7611213136657090146">ካሜራ እንደገና ተገናኝቷል።</translation> +<translation id="761736749114493194">የካሜራ ክፈፍን ይቀያይሩ። <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° ፋ</translation> <translation id="7633755430369750696">አቅራቢያ አጋራ ቅንብሮችን አሳይ።</translation> <translation id="7634648064048557203">ካሜራ ታችኛው ቀኝ ጥግ ላይ ገጥሟል</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">አሁን ካለ ዴስክ መስኮቶችን አሳይ፣ የራዲዮ አዝራር ተመርጧል</translation> <translation id="8517041960877371778">የእርሰዎ <ph name="DEVICE_TYPE" /> እንደበራ ኃይል መሙላት አይችሉ ይሆናል።</translation> <translation id="8535393432370007982">በቀለም የተደረደረበት ቅደም-ተከተል ቀልብስ</translation> +<translation id="8541078764854166027">የካሜራ ክፈፍ በመስራት ላይ</translation> <translation id="8542053257095774575">ምንም የተቀመጡ ዴስኮች ወይም ቅንብር ደንቦች የሉም</translation> <translation id="8546059259582788728">ድርደራም መቀልበስ ተሳክቷል</translation> <translation id="8551588720239073785">የቀን እና የጊዜ ቅንብሮች</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index a7bf3de..fe8b17bb 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -215,6 +215,7 @@ <translation id="2132302418721800944">تسجيل فيديو في وضع ملء الشاشة</translation> <translation id="2135456203358955318">المكبّر الذي تم إرساؤه</translation> <translation id="2148716181193084225">اليوم</translation> +<translation id="2161132820593978283">جرِّب استخدام ميزة "تكبير تلقائي" حتى تظهر صورة وجهك في وسط الشاشة أثناء مكالمات الفيديو. يمكنك تفعيل هذه الميزة من خلال قائمة "الإعدادات السريعة".</translation> <translation id="2170530631236737939">يمكنك التمرير سريعًا لأسفل الشاشة بثلاثة أصابع للخروج من وضع "النظرة العامة".</translation> <translation id="219905428774326614">Launcher، جميع التطبيقات</translation> <translation id="2201071101391734388">الصورة الحديثة رقم <ph name="INDEX" /> من إجمالي <ph name="TOTAL_COUNT" /></translation> @@ -253,6 +254,7 @@ <translation id="2405664212338326887">غير متصلة</translation> <translation id="2408955596600435184">إدخال رقم التعريف الشخصي</translation> <translation id="2412593942846481727">هناك تحديث جديد</translation> +<translation id="2426051945783024481">تم توسيط إطار الكاميرا تلقائيًا.</translation> <translation id="2427507373259914951">النقر بالزر الأيسر</translation> <translation id="2429753432712299108">يريد جهاز بلوتوث "<ph name="DEVICE_NAME" />" الحصول على إذن للإقران. قبل القبول، يُرجى التأكد أن مفتاح المرور هذا يظهر في هذا الجهاز: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">عرض كلمة المرور</translation> @@ -1040,6 +1042,7 @@ <translation id="6960565108681981554">لم يتم تفعيل الشبكة. يُرجى التواصل مع مشغّل شبكة الجوّال.</translation> <translation id="6961121602502368900">لا تتوفّر ميزة "كتم صوت الهاتف" على الملف الشخصي للعمل.</translation> <translation id="6961840794482373852">تم تغيير اختصارات لوحة المفاتيح "Alt + السهم المتّجه للأعلى". لاستخدام مفتاح Page Up، اضغط على المفتاحَين "<ph name="LAUNCHER_KEY_NAME" /> + السهم المتّجه للأعلى".</translation> +<translation id="696267987219125751">ميزة "تكبير تلقائي" غير مفعّلة.</translation> <translation id="6965382102122355670">حسنًا</translation> <translation id="6972754398087986839">البدء</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1130,6 +1133,7 @@ <translation id="7513922695575567867">التقويم، الأسبوع الذي يبدأ من <ph name="DATE" />، التاريخ المُحدّد حاليًا هو <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">تنزيل</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">ميزة "تكبير تلقائي" مفعّلة.</translation> <translation id="7526573455193969409">قد تكون الشبكة خاضعة للمراقبة</translation> <translation id="7536035074519304529">عنوان IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">تطبيقات Linux ونوافذ التصفّح المتخفي غير متوافقة حاليًا، ولكن سيتم حفظ التطبيقات الأخرى.</translation> @@ -1148,6 +1152,7 @@ <translation id="7607002721634913082">تعليق التحميل</translation> <translation id="7609951632080598826">عرض التقويم، <ph name="DATE" />، <ph name="TIME" /></translation> <translation id="7611213136657090146">تمت إعادة توصيل الكاميرا.</translation> +<translation id="761736749114493194">إيقاف/تفعيل ميزة "تكبير تلقائي". <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> درجة فهرنهايت</translation> <translation id="7633755430369750696">عرض إعدادات ميزة "المشاركة عن قرب"</translation> <translation id="7634648064048557203">تم توجيه الكاميرا إلى الزاوية السفلية اليمنى.</translation> @@ -1308,6 +1313,7 @@ <translation id="851458219935658693">عرض النوافذ المفتوحة في سطح المكتب الحالي، تم النقر على زر الاختيار.</translation> <translation id="8517041960877371778">قد يتعذر شحن <ph name="DEVICE_TYPE" /> أثناء التشغيل.</translation> <translation id="8535393432370007982">عكس نظام الترتيب حسب اللون</translation> +<translation id="8541078764854166027">تكبير تلقائي</translation> <translation id="8542053257095774575">ما مِن أسطح مكتب أو نماذج محفوظة.</translation> <translation id="8546059259582788728">تم بنجاح التراجع عن إجراء الترتيب.</translation> <translation id="8551588720239073785">إعدادات التاريخ والوقت</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 3a5314d..a02745e2 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">পূৰ্ণ স্ক্ৰীন ৰেকৰ্ড কৰক</translation> <translation id="2135456203358955318">ড’ক কৰা বিৱৰ্ধক</translation> <translation id="2148716181193084225">আজি</translation> +<translation id="2161132820593978283">কেমেৰা ফ্ৰে’মিং ব্যৱহাৰ কৰি চাওক যাতে ভিডিঅ’ কলৰ সময়ত আপুনি স্ক্ৰীনখনৰ মাজত থাকে। এইটো ক্ষিপ্ৰ ছেটিঙত অন কৰক।</translation> <translation id="2170530631236737939">অৱলোকনৰ পৰা বাহিৰ হ’বলৈ তিনিটা আঙুলিৰে তললৈ ছোৱাইপ কৰক</translation> <translation id="219905428774326614">লঞ্চাৰ, সকলো এপ্</translation> <translation id="2201071101391734388">শেহতীয়া ফট’ <ph name="TOTAL_COUNT" /> খনৰ ভিতৰত <ph name="INDEX" /> খন।</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">সংযুক্ত হৈ থকা নাই</translation> <translation id="2408955596600435184">আপোনাৰ পিন দিয়ক</translation> <translation id="2412593942846481727">আপডে’ট উপলব্ধ</translation> +<translation id="2426051945783024481">কেমেৰা ফ্ৰে’ম স্বয়ংক্ৰিয়ভাৱে সোঁমাজত ৰখা হ’ল</translation> <translation id="2427507373259914951">বাওঁফালে ক্লিক কৰা কার্য</translation> <translation id="2429753432712299108">ব্লুটুথ ডিভাইচ "<ph name="DEVICE_NAME" />"এ পেয়াৰ কৰিবলৈ অনুমতি বিচাৰে। গ্ৰহণ কৰাৰ আগতে অনুগ্ৰহ কৰি এই পাছকীটো যে সেই ডিভাইচটোত দেখুওৱা হৈছে সেইয়া নিশ্চিত কৰক: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">পাছৱৰ্ড দেখুৱাওক</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">সক্ৰিয় কৰা হোৱা নাই। আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰক।</translation> <translation id="6961121602502368900">কৰ্মস্থানৰ প্ৰ’ফাইলত নীৰৱ ফ’ন উপলব্ধ নহয়</translation> <translation id="6961840794482373852">কীব’ৰ্ডৰ শ্বৰ্টকাট অল্ট + আপ এৰ'টো সলনি হৈছে। পেজ আপ কীটো ব্যৱহাৰ কৰিবলৈ, <ph name="LAUNCHER_KEY_NAME" /> কীটো + আপ এৰ' টিপক।</translation> +<translation id="696267987219125751">কেমেৰা ফ্ৰে’মিং অফ হৈ আছে।</translation> <translation id="6965382102122355670">ঠিক আছে</translation> <translation id="6972754398087986839">আৰম্ভ কৰক</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">কেলেণ্ডাৰ, <ph name="DATE" />ৰ সপ্তাহ, <ph name="SELECTED_DATE" /> বৰ্তমান বাছনি কৰা হৈছে।</translation> <translation id="7514365320538308">ডাউনল'ড কৰক</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">কেমেৰা ফ্ৰে’মিং অফ হৈ আছে।</translation> <translation id="7526573455193969409">নেটৱৰ্ক নিৰীক্ষণ কৰা হ’ব পাৰে</translation> <translation id="7536035074519304529">আইপি ঠিকনা: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">বর্তমান Linux এপ্ আৰু ইনক'গনিট' ৱিণ্ড'সমূহ সমর্থন নকৰে। অন্য এপ্ ছেভ কৰা হ’ব।</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">পজ হৈ আছে</translation> <translation id="7609951632080598826">কেলেণ্ডাৰ ভিউ, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">কেমেৰা পুনৰ সংযুক্ত হৈছে।</translation> +<translation id="761736749114493194">কেমেৰা ফ্ৰে’মিং ট’গল কৰক। <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Nearby Shareৰ ছেটিং দেখুৱাওক।</translation> <translation id="7634648064048557203">কেমেৰা তলৰ সোঁফালৰ কোণলৈ স্নেপ কৰা হৈছে</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">বৰ্তমানৰ ডেস্ক ম'ডটোৰ পৰা ৱিণ্ড' দেখুৱাওক, ৰেডিঅ’ বুটাম বাছনি কৰা হ'ল</translation> <translation id="8517041960877371778">আপোনাৰ <ph name="DEVICE_TYPE" /> অন কৰি থোৱা অৱস্থাত চার্জ নহ'ব পাৰে।</translation> <translation id="8535393432370007982">ৰং অনুসৰি সজোৱাটো আনডু কৰক</translation> +<translation id="8541078764854166027">কেমেৰা ফ্ৰে’মিং</translation> <translation id="8542053257095774575">ছেভ কৰি থোৱা কোনো ডেস্ক অথবা টেম্পলে’ট নাই</translation> <translation id="8546059259582788728">সজোৱাটো আনডু কৰা হ'ল</translation> <translation id="8551588720239073785">তাৰিখ আৰু সময়ৰ ছেটিংসমূহ</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 24af029..cf6f848 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Записване на целия екран</translation> <translation id="2135456203358955318">Лупа в прикрепен режим</translation> <translation id="2148716181193084225">днес</translation> +<translation id="2161132820593978283">Изпробвайте функцията за центриране на камерата, така че да сте в средата на екрана по време на видеообаждания. Включете функцията от бързите настройки.</translation> <translation id="2170530631236737939">Прекарайте три пръста надолу, за да затворите общия преглед</translation> <translation id="219905428774326614">Стартов панел, всички приложения</translation> <translation id="2201071101391734388">Скорошна снимка <ph name="INDEX" /> от <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Няма връзка</translation> <translation id="2408955596600435184">Въведете своя ПИН</translation> <translation id="2412593942846481727">Налице е актуализация</translation> +<translation id="2426051945783024481">Рамката на камерата бе центрирана автоматично</translation> <translation id="2427507373259914951">Кликване с левия бутон</translation> <translation id="2429753432712299108">Устройството с Bluetooth „<ph name="DEVICE_NAME" />“ иска разрешение за сдвояване. Преди да приемете, моля, уверете се, че на него се показва следният ключ за достъп: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Показване на паролата</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Не е активирана. Свържете се с оператора си.</translation> <translation id="6961121602502368900">Функцията за заглушаване на телефона не е налице в служебни потребителски профили</translation> <translation id="6961840794482373852">Клавишната комбинация Alt + стрелка нагоре се промени. За да използвате клавиша Page Up, натиснете клавиша „<ph name="LAUNCHER_KEY_NAME" />“ + стрелката нагоре.</translation> +<translation id="696267987219125751">Функцията за центриране на камерата е изключена.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Първи стъпки</translation> <translation id="6979158407327259162">Google Диск</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Календар, седмицата на <ph name="DATE" />, понастоящем е избрана датата <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Изтегляне</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Функцията за центриране на камерата е включена.</translation> <translation id="7526573455193969409">Мрежата може да е под наблюдение</translation> <translation id="7536035074519304529">IP адрес: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Понастоящем не се поддържат приложения за Linux и прозорци в режим „инкогнито“. Другите приложения ще бъдат запазени.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">На пауза</translation> <translation id="7609951632080598826">Изглед на календара – <ph name="TIME" />, <ph name="DATE" /></translation> <translation id="7611213136657090146">Връзката с камерата е възстановена.</translation> +<translation id="761736749114493194">Превключване на функцията за центриране на камерата. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Показване на настройките на „Споделяне наблизо“.</translation> <translation id="7634648064048557203">Картината от камерата е прилепена към долния десен ъгъл</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Показват се прозорците от текущия работен кът, активиран е бутон за избор</translation> <translation id="8517041960877371778">Възможно е вашият <ph name="DEVICE_TYPE" /> да не се зарежда, докато е включен.</translation> <translation id="8535393432370007982">Отмяна на сортирането по цвят</translation> +<translation id="8541078764854166027">Центриране</translation> <translation id="8542053257095774575">Няма запазени работни кътове или шаблони</translation> <translation id="8546059259582788728">Отмяната на сортирането е успешна</translation> <translation id="8551588720239073785">Настройки за дата и час</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index 0115f6d8..2ea1158 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Recordio'r sgrîn lawn</translation> <translation id="2135456203358955318">Chwyddwr sydd wedi'i docio</translation> <translation id="2148716181193084225">Heddiw</translation> +<translation id="2161132820593978283">Rhowch gynnig ar fframio camera fel y byddwch yng nghanol y sgrîn ar alwadau fideo. Trowch ef ymlaen yn y Gosodiadau Cyflym.</translation> <translation id="2170530631236737939">Sweipiwch i lawr gyda thri bys i adael Trosolwg</translation> <translation id="219905428774326614">Lansiwr, pob ap</translation> <translation id="2201071101391734388">Llun diweddar <ph name="INDEX" /> o <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Ni chysylltir</translation> <translation id="2408955596600435184">Rhowch eich PIN</translation> <translation id="2412593942846481727">Mae diweddariad ar gael</translation> +<translation id="2426051945783024481">Mae fframio camera wedi'i ganoli yn awtomatig</translation> <translation id="2427507373259914951">Clic chwith</translation> <translation id="2429753432712299108">Hoffai'r ddyfais Bluetooth "<ph name="DEVICE_NAME" />" gael caniatâd i baru. Cyn derbyn, cadarnhewch fod y cod pass hwn yn cael ei ddangos ar y ddyfais honno: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Dangos y cyfrinair</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Heb ei weithredu. Cysylltwch â'ch cludydd.</translation> <translation id="6961121602502368900">Nid yw Distewi'r Ffôn ar gael ar broffil gwaith</translation> <translation id="6961840794482373852">Mae'r llwybr byr bysellfwrdd Alt + Saeth i fyny wedi newid. I ddefnyddio'r fysell Page Up, pwyswch y fysell <ph name="LAUNCHER_KEY_NAME" /> + Saeth i fyny.</translation> +<translation id="696267987219125751">Mae fframio'r camera wedi'i ddiffodd.</translation> <translation id="6965382102122355670">Iawn</translation> <translation id="6972754398087986839">Cychwyn arni</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Calendr, wythnos o <ph name="DATE" />, mae <ph name="SELECTED_DATE" /> wedi'i ddewis ar hyn o bryd.</translation> <translation id="7514365320538308">Lawrlwytho</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Mae fframio camera ymlaen.</translation> <translation id="7526573455193969409">Mae'n bosib bod y rhwydwaith yn cael ei fonitro</translation> <translation id="7536035074519304529">Cyfeiriad IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Ni chefnogir apiau Linux a ffenestri anhysbys ar hyn o bryd. Bydd apiau eraill yn cael eu cadw.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">Wedi seibio</translation> <translation id="7609951632080598826">Gwedd calendr, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Mae'r camera wedi'i ailgysylltu.</translation> +<translation id="761736749114493194">Toglo fframio camera. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Dangos gosodiadau Rhannu Gerllaw.</translation> <translation id="7634648064048557203">Mae'r camera wedi'i snapio i'r gornel dde isaf</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Dangos ffenestri o'r ddesg bresennol, botwm radio wedi'i ddewis</translation> <translation id="8517041960877371778">Mae'n bosib na fydd eich <ph name="DEVICE_TYPE" /> yn gwefru tra bydd ymlaen.</translation> <translation id="8535393432370007982">Dadwnued trefnu yn ôl lliw</translation> +<translation id="8541078764854166027">Fframio camera</translation> <translation id="8542053257095774575">Nid oes unrhyw ddesgiau neu dempledi wedi'u cadw</translation> <translation id="8546059259582788728">Wedi dadwneud trefnu yn llwyddiannus</translation> <translation id="8551588720239073785">Gosodiadau dyddiad ac amser</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 49ab59ea..2a2289fc 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Optag hele skærmen</translation> <translation id="2135456203358955318">Fastgjort lupvindue</translation> <translation id="2148716181193084225">I dag</translation> +<translation id="2161132820593978283">Prøv automatisk zoom, så du centreres på skærmen under videoopkald. Aktivér funktionen i kvikmenuen.</translation> <translation id="2170530631236737939">Stryg nedad med tre fingre for at lukke oversigten</translation> <translation id="219905428774326614">Starter. Alle apps</translation> <translation id="2201071101391734388">Seneste billede <ph name="INDEX" /> af <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Ikke forbundet</translation> <translation id="2408955596600435184">Angiv din pinkode</translation> <translation id="2412593942846481727">Der er en tilgængelig opdatering</translation> +<translation id="2426051945783024481">Kameraets fokus centreres automatisk</translation> <translation id="2427507373259914951">Venstreklik</translation> <translation id="2429753432712299108">Bluetooth-enheden "<ph name="DEVICE_NAME" />" vil gerne have parringstilladelse. Inden du accepterer, skal du bekræfte, at denne adgangsnøgle er vist på den pågældende enhed: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Vis adgangskode</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Ikke aktiveret. Kontakt dit mobilselskab.</translation> <translation id="6961121602502368900">Du kan ikke sætte din telefon på lydløs med en arbejdsprofil</translation> <translation id="6961840794482373852">Tastaturgenvejen Alt+pil op er blevet ændret. Hvis du vil bruge tasten Side op, skal du trykke på tasten <ph name="LAUNCHER_KEY_NAME" />+pil op.</translation> +<translation id="696267987219125751">Automatisk zoom er deaktiveret.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Kom godt i gang</translation> <translation id="6979158407327259162">Google Drev</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Kalender for ugen med <ph name="DATE" /> – <ph name="SELECTED_DATE" /> er valgt.</translation> <translation id="7514365320538308">Download</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Automatisk zoom er aktiveret.</translation> <translation id="7526573455193969409">Netværket kan være overvåget</translation> <translation id="7536035074519304529">IP-adresse: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Linux-apps og inkognitovinduer understøttes ikke i øjeblikket. Andre apps gemmes.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">Sat på pause</translation> <translation id="7609951632080598826">Kalendervisning, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Der blev oprettet forbindelse til kameraet igen.</translation> +<translation id="761736749114493194">Slå automatisk zoom til/fra. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Vis indstillinger for Deling tæt på.</translation> <translation id="7634648064048557203">Kameraet er fastgjort til hjørnet nederst til højre</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Vis vinduer fra det aktuelle skrivebord. Alternativknappen er valgt.</translation> <translation id="8517041960877371778">Din <ph name="DEVICE_TYPE" /> kan muligvis ikke oplades, mens den er tændt.</translation> <translation id="8535393432370007982">Fortryd sortering efter farve</translation> +<translation id="8541078764854166027">Automatisk zoom</translation> <translation id="8542053257095774575">Der er ingen gemte skriveborde eller skabeloner</translation> <translation id="8546059259582788728">Sorteringen blev fortrudt</translation> <translation id="8551588720239073785">Indstillinger for dato og tid</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 4efbd465..0d0fcf7db 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -235,6 +235,7 @@ <translation id="2298170939937364391">Full-screen Magnifier enabled. Press Ctrl+Search+M again to toggle it off.</translation> <translation id="2302092602801625023">This account is managed by Family Link</translation> <translation id="2303600792989757991">Toggle window overview</translation> +<translation id="2315005022200073389"><ph name="HOLDING_SPACE_TITLE" />: recent screen captures, downloads and pinned files</translation> <translation id="2318576281648121272">Today <ph name="TODAY_DATE" /></translation> <translation id="2322065293366551060"><ph name="CATEGORY" /> , search result category</translation> <translation id="2322173485024759474">Back by letter</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index d789a0c..f3fd621 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Grabar pantalla completa</translation> <translation id="2135456203358955318">Lupa fijada</translation> <translation id="2148716181193084225">Hoy</translation> +<translation id="2161132820593978283">Prueba el encuadre de cámara para aparecer en el centro de la pantalla durante las videollamadas. Actívalo en los ajustes rápidos.</translation> <translation id="2170530631236737939">Desliza tres dedos hacia abajo para salir de la vista general</translation> <translation id="219905428774326614">Menú de aplicaciones, todas las aplicaciones</translation> <translation id="2201071101391734388">Foto reciente <ph name="INDEX" /> de <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">No conectado</translation> <translation id="2408955596600435184">Introduce tu PIN</translation> <translation id="2412593942846481727">Actualización disponible</translation> +<translation id="2426051945783024481">Encuadre de cámara centrado automáticamente</translation> <translation id="2427507373259914951">Clic con el botón izquierdo</translation> <translation id="2429753432712299108">El dispositivo Bluetooth "<ph name="DEVICE_NAME" />" solicita permiso para emparejarse. Antes de aceptar, comprueba que la clave de contraseña <ph name="PASSKEY" /> aparezca en el dispositivo</translation> <translation id="2435457462613246316">Mostrar contraseña</translation> @@ -1039,6 +1041,7 @@ <translation id="6960565108681981554">No activada. Ponte en contacto con tu operador.</translation> <translation id="6961121602502368900">La función Silenciar teléfono no está disponible en el perfil de trabajo</translation> <translation id="6961840794482373852">La combinación de teclas Alt + tecla de flecha hacia arriba ha cambiado. Para usar la tecla Re Pág, pulsa la tecla <ph name="LAUNCHER_KEY_NAME" /> + tecla de flecha hacia arriba.</translation> +<translation id="696267987219125751">El encuadre de cámara está desactivado.</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="6972754398087986839">Empezar</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1129,6 +1132,7 @@ <translation id="7513922695575567867">Calendario, semana del <ph name="DATE" />, actualmente está seleccionado el <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Descargar</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">El encuadre de cámara está activado.</translation> <translation id="7526573455193969409">Es posible que la red esté supervisada</translation> <translation id="7536035074519304529">Dirección IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Las aplicaciones Linux y las ventanas de Incógnito no se admiten actualmente. Se guardarán las demás aplicaciones.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">En pausa</translation> <translation id="7609951632080598826">Vista de calendario, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">La cámara se ha vuelto a conectar.</translation> +<translation id="761736749114493194">Activar/Desactivar encuadre de cámara. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> °F</translation> <translation id="7633755430369750696">Muestra los ajustes de Compartir con Nearby.</translation> <translation id="7634648064048557203">Cámara ajustada a la esquina inferior derecha</translation> @@ -1307,6 +1312,7 @@ <translation id="851458219935658693">Mostrar ventanas del escritorio actual, botón seleccionado</translation> <translation id="8517041960877371778">Es posible que tu <ph name="DEVICE_TYPE" /> no se cargue mientras esté encendido.</translation> <translation id="8535393432370007982">Deshacer orden por color</translation> +<translation id="8541078764854166027">Encuadre</translation> <translation id="8542053257095774575">No hay escritorios ni plantillas guardados</translation> <translation id="8546059259582788728">Orden deshecho correctamente</translation> <translation id="8551588720239073785">Configuración de fecha y hora</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 5a4ed14..e0676ca 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Täisekraani salvestamine</translation> <translation id="2135456203358955318">Dokitud luup</translation> <translation id="2148716181193084225">Täna</translation> +<translation id="2161132820593978283">Proovige kaamera kadreerimist, et oleksite videokõnedes ekraanikuva keskel. Lülitage see sisse kiirseadete kaudu.</translation> <translation id="2170530631236737939">Ülevaatest lahkumiseks pühkige kolme sõrmega alla</translation> <translation id="219905428774326614">Käivitaja, kõik rakendused</translation> <translation id="2201071101391734388">Hiljutine foto <ph name="INDEX" />/<ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Ühendus puudub</translation> <translation id="2408955596600435184">Sisestage PIN-kood</translation> <translation id="2412593942846481727">Värskendus on saadaval</translation> +<translation id="2426051945783024481">Kaamera kaader on automaatselt keskel</translation> <translation id="2427507373259914951">Vasakklikk</translation> <translation id="2429753432712299108">Bluetoothi seade „<ph name="DEVICE_NAME" />” küsib luba sidumiseks. Enne nõustumist veenduge, et selles seadmes oleks kuvatud see parool: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Kuva parool</translation> @@ -1039,6 +1041,7 @@ <translation id="6960565108681981554">Aktiveerimata. Võtke oma operaatoriga ühendust.</translation> <translation id="6961121602502368900">Telefoni vaigistamine pole tööprofiilil saadaval</translation> <translation id="6961840794482373852">Klaviatuuri otseteed Alt + ülesnool on muudetud. Lehe võrra üles klahvi kasutamiseks vajutage klahvi <ph name="LAUNCHER_KEY_NAME" /> + ülesnoolt.</translation> +<translation id="696267987219125751">Kaamera kadreerimine on välja lülitatud.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Alustamine</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1129,6 +1132,7 @@ <translation id="7513922695575567867">Kalender, kuupäeva <ph name="DATE" /> nädal, <ph name="SELECTED_DATE" /> on praegu valitud.</translation> <translation id="7514365320538308">Laadi alla</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Kaamera kadreerimine on sisse lülitatud.</translation> <translation id="7526573455193969409">Võrku võidakse jälgida</translation> <translation id="7536035074519304529">IP-adress: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Linuxi rakendusi ja inkognito aknaid praegu ei toetata. Muud rakendused salvestatakse.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">Peatatud</translation> <translation id="7609951632080598826">Kalendrivaade, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Kaamera ühendati uuesti.</translation> +<translation id="761736749114493194">Kaamera kadreerimise lüliti. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> °F</translation> <translation id="7633755430369750696">Läheduses jagamise seadete kuvamine.</translation> <translation id="7634648064048557203">Kaamera kinnitati paremasse alanurka</translation> @@ -1307,6 +1312,7 @@ <translation id="851458219935658693">Valitud on raadionupp Näita praeguse töölaua aknaid</translation> <translation id="8517041960877371778">Kui seade <ph name="DEVICE_TYPE" /> on sisse lülitatud, ei pruugita seda laadida.</translation> <translation id="8535393432370007982">Võta värvi järgi sortimine tagasi</translation> +<translation id="8541078764854166027">Kadreerimine</translation> <translation id="8542053257095774575">Salvestatud töölaudu ega malle ei ole</translation> <translation id="8546059259582788728">Sortimise tagasivõtmine õnnestus</translation> <translation id="8551588720239073785">Kuupäeva ja kellaaja seaded</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 7348f41..69e7cf4 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">ضبط تمام صفحه</translation> <translation id="2135456203358955318">ذرهبین متصل</translation> <translation id="2148716181193084225">امروز</translation> +<translation id="2161132820593978283">برای اینکه درحین تماسهای ویدیویی در مرکز صفحه قرار داشته باشید، از قاببندی دوربین استفاده کنید. آن را در «تنظیمات فوری» روشن کنید.</translation> <translation id="2170530631236737939">برای خروج از «نمای کلی»، با سه انگشت تند به پایین بکشید</translation> <translation id="219905428774326614">راهانداز، همه برنامهها</translation> <translation id="2201071101391734388">عکس اخیر <ph name="INDEX" /> از <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">متصل نیست</translation> <translation id="2408955596600435184">پین را وارد کنید</translation> <translation id="2412593942846481727">بهروزرسانی دردسترس است</translation> +<translation id="2426051945783024481">قاب دوربین بهطور خودکار در مرکز قرار گرفت</translation> <translation id="2427507373259914951">کلیک چپ</translation> <translation id="2429753432712299108">دستگاه بلوتوث «<ph name="DEVICE_NAME" />» برای مرتبطسازی به مجوز نیاز دارد. قبل از پذیرش، لطفاً تأیید کنید که این گذرکلید در آن دستگاه نشان داده میشود: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">نمایش گذرواژه</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">فعال نیست. با شرکت مخابراتیتان تماس بگیرید.</translation> <translation id="6961121602502368900">«بیصدا کردن تلفن» در نمایه کاری دردسترس نیست</translation> <translation id="6961840794482373852">میانبر صفحهکلید «دگرساز + جهتنمای بالا» تغییر کرده است. برای استفاده از کلید «صفحه قبلی»، کلید «<ph name="LAUNCHER_KEY_NAME" /> + جهتنمای بالا» را فشار دهید.</translation> +<translation id="696267987219125751">قاببندی دوربین خاموش است.</translation> <translation id="6965382102122355670">قبول</translation> <translation id="6972754398087986839">شروع به کار</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">تقویم، هفته <ph name="DATE" />، درحالحاضر <ph name="SELECTED_DATE" /> انتخاب شده است.</translation> <translation id="7514365320538308">بارگیری</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">قاببندی دوربین روشن است.</translation> <translation id="7526573455193969409">ممکن است شبکه پایش شود</translation> <translation id="7536035074519304529">نشانی IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">درحالحاضر از برنامههای Linux و پنجرههای «ناشناس» پشتیبانی نمیشود. برنامههای دیگر ذخیره خواهد شد.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">متوقف</translation> <translation id="7609951632080598826">نمای «تقویم» ،<ph name="DATE" />، <ph name="TIME" /></translation> <translation id="7611213136657090146">دوربین دوباره متصل شد.</translation> +<translation id="761736749114493194">روشن/خاموش کردن قاببندی دوربین. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> درجه فارنهایت</translation> <translation id="7633755430369750696">نمایش تنظیمات «همرسانی با اطراف».</translation> <translation id="7634648064048557203">دوربین به گوشه پایین سمت راست چسبید</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">نمایش پنجرهها از میزکار فعلی، دکمه رادیو انتخاب شد</translation> <translation id="8517041960877371778">ممکن است وقتی <ph name="DEVICE_TYPE" /> شما خاموش است، شارژ نشود.</translation> <translation id="8535393432370007982">واگرد کردن مرتبسازی براساس رنگ</translation> +<translation id="8541078764854166027">قاببندی دوربین</translation> <translation id="8542053257095774575">میزکار یا الگوی ذخیرهشدهای ندارید</translation> <translation id="8546059259582788728">مرتبسازی واگرد شد</translation> <translation id="8551588720239073785">تنظیمات تاریخ و ساعت</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 1d04334..a7ca825 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">પૂર્ણ સ્ક્રીન રેકોર્ડ કરો</translation> <translation id="2135456203358955318">ડૉક કરેલ મૅગ્નિફાયર</translation> <translation id="2148716181193084225">આજે</translation> +<translation id="2161132820593978283">કૅમેરા ફ્રેમિંગ અજમાવી જુઓ, જેથી તમે વીડિયો કૉલમાં સ્ક્રીનની મધ્યમાં રહેશો. ઝડપી સેટિંગમાં જઈને તેને ચાલુ કરો.</translation> <translation id="2170530631236737939">ઓવરવ્યૂમાંથી બહાર નીકળવા માટે, ત્રણ આંગળી વડે નીચેની તરફ સ્વાઇપ કરો</translation> <translation id="219905428774326614">લૉન્ચર, બધી ઍપ</translation> <translation id="2201071101391734388">તાજેતરના <ph name="TOTAL_COUNT" /> ફોટામાંથી <ph name="INDEX" /> નંબરનો ફોટો.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">કનેક્ટ કરેલું નથી</translation> <translation id="2408955596600435184">તમારો PIN દાખલ કરો</translation> <translation id="2412593942846481727">અપડેટ ઉપલબ્ધ છે</translation> +<translation id="2426051945783024481">કૅમેરાની ફ્રેમને ઑટોમૅટિક રીતે મધ્યમાં ગોઠવવામાં આવે છે</translation> <translation id="2427507373259914951">લેફ્ટ ક્લિક કરો</translation> <translation id="2429753432712299108">Bluetooth ડિવાઇસ "<ph name="DEVICE_NAME" />" ને જોડી બનાવવા માટે પરવાનગી જોઈએ છે. સ્વીકારતાં પહેલાં, કૃપા કરીને તે ડિવાઇસ પર બતાવેલ આ પાસકીની પુષ્ટિ કરો: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">પાસવર્ડ બતાવો</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">સક્રિય કરેલું નથી. તમારા મોબાઇલ ઑપરેટરનો સંપર્ક કરો.</translation> <translation id="6961121602502368900">ઑફિસની પ્રોફાઇલમાં ફોન સાઇલન્ટ રાખવાની સુવિધા ઉપલબ્ધ નથી</translation> <translation id="6961840794482373852">Alt કી + ઉપરની ઍરો કી કીબોર્ડ શૉર્ટકટ બદલવામાં આવ્યો છે. Page Up કીનો ઉપયોગ કરવા માટે, <ph name="LAUNCHER_KEY_NAME" /> કી + ઉપરની ઍરો કી દબાવો.</translation> +<translation id="696267987219125751">કૅમેરા ફ્રેમિંગ બંધ છે.</translation> <translation id="6965382102122355670">બરાબર, સમજાઇ ગયું</translation> <translation id="6972754398087986839">પ્રારંભ કરો</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">કૅલેન્ડર, <ph name="DATE" />ની તારીખવાળું અઠવાડિયું, હાલમાં <ph name="SELECTED_DATE" /> પસંદ કરેલી છે.</translation> <translation id="7514365320538308">ડાઉનલોડ કરો</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">કૅમેરા ફ્રેમિંગ ચાલુ છે.</translation> <translation id="7526573455193969409">નેટવર્કને મોનિટર કરવામાં આવી શકે છે</translation> <translation id="7536035074519304529">IP સરનામું: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Linux ઍપ અને છૂપી વિન્ડોને હાલમાં સપોર્ટ કરવામાં આવતો નથી. અન્ય ઍપ સાચવવામાં આવશે.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">થોભાવેલું</translation> <translation id="7609951632080598826">કૅલેન્ડરનો વ્યૂ, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">કૅમેરા ફરી કનેક્ટ કર્યો.</translation> +<translation id="761736749114493194">કૅમેરા ફ્રેમિંગને ટૉગલ કરો. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">નજીકના શેર સેટિંગ બતાવો.</translation> <translation id="7634648064048557203">કૅમેરાને નીચેના જમણા ખૂણામાં સ્નેપ કર્યો</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">વર્તમાન ડેસ્કમાંની બધી વિન્ડો બતાવો, રેડિયો બટન પસંદ કર્યું</translation> <translation id="8517041960877371778">તમારું <ph name="DEVICE_TYPE" /> ચાલુ હોય ત્યારે તે ચાર્જ ન થાય તેવું બની શકે.</translation> <translation id="8535393432370007982">રંગ મુજબ સૉર્ટ કરવાના ક્રમનો છેલ્લો ફેરફાર રદ કરો</translation> +<translation id="8541078764854166027">કૅમેરા ફ્રેમ</translation> <translation id="8542053257095774575">કોઈ ડેસ્ક કે નમૂનો સાચવેલો નથી</translation> <translation id="8546059259582788728">સૉર્ટ કરવાનો છેલ્લો ફેરફાર રદ કરવાનું સફળ થયું</translation> <translation id="8551588720239073785">તારીખ અને સમયનાં સેટિંગ</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 5234136..a6fb1010 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">फ़ुल स्क्रीन रिकॉर्ड करें</translation> <translation id="2135456203358955318">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा</translation> <translation id="2148716181193084225">आज</translation> +<translation id="2161132820593978283">ऑटो फ़्रेमिंग की सुविधा आज़माएं, ताकि वीडियो कॉल के दौरान आप स्क्रीन के बीच में रहें. इसे 'फटाफट सेटिंग' में जाकर चालू करें.</translation> <translation id="2170530631236737939">खास जानकारी बंद करने के लिए, स्क्रीन पर तीन उंगलियों से नीचे की ओर स्वाइप करें</translation> <translation id="219905428774326614">लॉन्चर, सभी ऐप्लिकेशन</translation> <translation id="2201071101391734388"><ph name="TOTAL_COUNT" /> में से <ph name="INDEX" /> हाल ही की फ़ोटो.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">कनेक्ट नहीं है</translation> <translation id="2408955596600435184">अपना पिन डालें</translation> <translation id="2412593942846481727">अपडेट मौजूद है</translation> +<translation id="2426051945783024481">ऑटो फ़्रेमिंग ने कैमरे के फ़ोकस को अपने-आप बीच में कर दिया है</translation> <translation id="2427507373259914951">बायां क्लिक</translation> <translation id="2429753432712299108">ब्लूटूथ डिवाइस "<ph name="DEVICE_NAME" />" जोड़ने की अनुमति चाहता है. स्वीकार करने से पहले, कृपया पुष्टि करें कि यह पासकी उस डिवाइस पर दिखाई जा रही है: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">पासवर्ड दिखाएं</translation> @@ -1039,6 +1041,7 @@ <translation id="6960565108681981554">यह चालू नहीं है. मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</translation> <translation id="6961121602502368900">वर्क प्रोफ़ाइल में, फ़ोन को साइलेंट रखने की सुविधा उपलब्ध नहीं है</translation> <translation id="6961840794482373852">Alt + अप ऐरो कीबोर्ड शॉर्टकट बदल गया है. Page Up बटन का इस्तेमाल करने के लिए, <ph name="LAUNCHER_KEY_NAME" /> बटन + अप ऐरो दबाएं.</translation> +<translation id="696267987219125751">ऑटो फ़्रेमिंग की सुविधा बंद है.</translation> <translation id="6965382102122355670">ठीक है</translation> <translation id="6972754398087986839">शुरू करें</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1129,6 +1132,7 @@ <translation id="7513922695575567867"><ph name="DATE" /> वाले हफ़्ते के कैलेंडर में, फ़िलहाल<ph name="SELECTED_DATE" /> को चुना गया है.</translation> <translation id="7514365320538308">डाउनलोड करें</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">ऑटो फ़्रेमिंग की सुविधा चालू है.</translation> <translation id="7526573455193969409">नेटवर्क की निगरानी की जा सकती है</translation> <translation id="7536035074519304529">आईपी पता: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">फ़िलहाल, Linux ऐप्लिकेशन और गुप्त विंडो काम नहीं कर रही हैं. अन्य ऐप्लिकेशन सेव हो जाएंगे.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">रोका गया</translation> <translation id="7609951632080598826">कैलेंडर व्यू, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">कैमरा फिर से कनेक्ट हो गया है.</translation> +<translation id="761736749114493194">ऑटो फ़्रेमिंग की सुविधा टॉगल करें. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° फ़ैरनहाइट</translation> <translation id="7633755430369750696">आस-पास शेयर करने की सेटिंग दिखाएं.</translation> <translation id="7634648064048557203">कैमरा इनपुट की झलक, अब नीचे बाएं कोने में दिखेगी</translation> @@ -1307,6 +1312,7 @@ <translation id="851458219935658693">मौजूदा डेस्क से विंडो देखें, रेडियो बटन चुना गया</translation> <translation id="8517041960877371778">हो सकता है आपका <ph name="DEVICE_TYPE" /> चालू होने पर चार्ज नहीं होता हो.</translation> <translation id="8535393432370007982">रंग के हिसाब से लगाए गए क्रम को पहले जैसा करें</translation> +<translation id="8541078764854166027">ऑटो फ़्रेमिंग</translation> <translation id="8542053257095774575">कोई डेस्क या टेंप्लेट सेव नहीं किया गया है</translation> <translation id="8546059259582788728">लगाए गए क्रम को पहले जैसा कर दिया गया है</translation> <translation id="8551588720239073785">तारीख और समय की सेटिंग</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 99ee3c47..05e241b 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Teljes képernyő rögzítése</translation> <translation id="2135456203358955318">Dokkolt nagyító</translation> <translation id="2148716181193084225">Ma</translation> +<translation id="2161132820593978283">Próbálja ki a keretezést, hogy videohívás közben a képernyő közepére kerüljön. Ezt a funkciót a Gyorsbeállításokban kapcsolhatja be.</translation> <translation id="2170530631236737939">Ha szeretne kilépni az Áttekintés nézetből, csúsztasson lefelé három ujjával</translation> <translation id="219905428774326614">Indító, minden alkalmazás</translation> <translation id="2201071101391734388"><ph name="INDEX" />. fénykép a legutóbbi <ph name="TOTAL_COUNT" /> fénykép közül.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Nincs kapcsolat</translation> <translation id="2408955596600435184">PIN-kód megadása</translation> <translation id="2412593942846481727">Rendelkezésre áll frissítés</translation> +<translation id="2426051945783024481">Keret automatikusan középre igazítva</translation> <translation id="2427507373259914951">Kattintás bal egérgombbal</translation> <translation id="2429753432712299108">A(z) „<ph name="DEVICE_NAME" />” Bluetooth-eszköz engedélyt kér a párosításra. Mielőtt elfogadná, ellenőrizze, hogy ez a biztonsági kód látható-e azon az eszközön is: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Jelszó megjelenítése</translation> @@ -1039,6 +1041,7 @@ <translation id="6960565108681981554">Nincs aktiválva. Forduljon a szolgáltatójához.</translation> <translation id="6961121602502368900">A Telefon némítása funkció nem használható munkaprofillal</translation> <translation id="6961840794482373852">Az Alt + Felfelé nyíl billentyűparancs módosult. A Felfelé nyíl billentyű használatához nyomja le a következő billentyűparancsot: <ph name="LAUNCHER_KEY_NAME" /> + Felfelé nyíl.</translation> +<translation id="696267987219125751">A keretezés ki van kapcsolva.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Első lépések</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1129,6 +1132,7 @@ <translation id="7513922695575567867">Naptár, <ph name="DATE" />-i hét, jelenleg kijelölt dátum: <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Letöltés</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">A keretezés be van kapcsolva.</translation> <translation id="7526573455193969409">Elképzelhető, hogy figyelik a hálózatot</translation> <translation id="7536035074519304529">IP-cím: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">A Linux-alkalmazások és az inkognitó ablakok jelenleg nem támogatottak. Az egyéb alkalmazásokat menti a rendszer.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">Szünet</translation> <translation id="7609951632080598826">Naptárnézet, <ph name="DATE" /> <ph name="TIME" /></translation> <translation id="7611213136657090146">Helyreállt a kapcsolat a kamerával.</translation> +<translation id="761736749114493194">A keretezés be- vagy kikapcsolása. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />°F</translation> <translation id="7633755430369750696">A Közeli megosztás funkció beállításainak megjelenítése.</translation> <translation id="7634648064048557203">Kamera a jobb alsó sarokhoz igazítva</translation> @@ -1307,6 +1312,7 @@ <translation id="851458219935658693">A jelenlegi asztal ablakainak megjelenítésére vonatkozó kapcsológomb van kiválasztva</translation> <translation id="8517041960877371778">Előfordulhat, hogy a(z) <ph name="DEVICE_TYPE" /> nem töltődik, amíg be van kapcsolva.</translation> <translation id="8535393432370007982">Szín szerinti rendezés visszavonása</translation> +<translation id="8541078764854166027">Keretezés</translation> <translation id="8542053257095774575">Nincsenek mentett asztalok vagy sablonok</translation> <translation id="8546059259582788728">Rendezés visszavonása sikeres</translation> <translation id="8551588720239073785">Dátum- és időbeállítások</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index db5dd4d..1619e3f 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Registra schermo intero</translation> <translation id="2135456203358955318">Lente d'ingrandimento ancorata</translation> <translation id="2148716181193084225">Oggi</translation> +<translation id="2161132820593978283">Prova Zoom automatico per essere al centro dello schermo durante le videochiamate. Attiva la funzionalità nelle Impostazioni rapide.</translation> <translation id="2170530631236737939">Scorri con tre dita verso il basso per uscire dalla modalità Panoramica</translation> <translation id="219905428774326614">Avvio applicazioni, tutte le app</translation> <translation id="2201071101391734388">Foto recente <ph name="INDEX" /> di <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Non connessa</translation> <translation id="2408955596600435184">Inserisci il codice PIN</translation> <translation id="2412593942846481727">Aggiornamento disponibile</translation> +<translation id="2426051945783024481">Fotocamera centrata automaticamente da Zoom automatico</translation> <translation id="2427507373259914951">Clic con il pulsante sinistro</translation> <translation id="2429753432712299108">Il dispositivo Bluetooth "<ph name="DEVICE_NAME" />" chiede l'autorizzazione per essere accoppiato. Prima di accettare, conferma che questa passkey viene visualizzata sul dispositivo: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Mostra password</translation> @@ -1039,6 +1041,7 @@ <translation id="6960565108681981554">Non attiva. Contatta l'operatore.</translation> <translation id="6961121602502368900">La funzionalità Disattiva audio non è disponibile sul profilo di lavoro</translation> <translation id="6961840794482373852">La scorciatoia da tastiera Alt + Freccia su è cambiata. Per usare il tasto Pagina su, premi il tasto <ph name="LAUNCHER_KEY_NAME" /> + Freccia su.</translation> +<translation id="696267987219125751">Zoom automatico disattivato.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Inizia</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1129,6 +1132,7 @@ <translation id="7513922695575567867">Calendario, settimana del <ph name="DATE" />, è attualmente selezionata la data <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Scarica</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Zoom automatico attivato.</translation> <translation id="7526573455193969409">La rete potrebbe essere monitorata</translation> <translation id="7536035074519304529">Indirizzo IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Al momento le app Linux e le finestre di navigazione in incognito non sono supportate. Le altre app verranno salvate.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">In pausa</translation> <translation id="7609951632080598826">Visualizzazione Calendario, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Fotocamera riconnessa.</translation> +<translation id="761736749114493194">Attiva/disattiva Zoom automatico. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> °F</translation> <translation id="7633755430369750696">Mostra impostazioni di Condivisione nelle vicinanze.</translation> <translation id="7634648064048557203">Fotocamera allineata all'angolo in basso a destra</translation> @@ -1307,6 +1312,7 @@ <translation id="851458219935658693">Mostra finestre della scrivania corrente, pulsante di opzione selezionato</translation> <translation id="8517041960877371778">Il tuo dispositivo <ph name="DEVICE_TYPE" /> potrebbe non caricarsi mentre è acceso.</translation> <translation id="8535393432370007982">Annulla l'ordinamento per colore</translation> +<translation id="8541078764854166027">Zoom automat.</translation> <translation id="8542053257095774575">Nessuna scrivania o nessun modello salvati</translation> <translation id="8546059259582788728">Annullamento dell'ordinamento completato</translation> <translation id="8551588720239073785">Impostazioni di data e ora</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index d13f044..4c6db217 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">הקלטה של מסך מלא</translation> <translation id="2135456203358955318">מגדיל במצב מעוגן</translation> <translation id="2148716181193084225">היום</translation> +<translation id="2161132820593978283">אפשר להפעיל את הפריים האוטומטי במצלמה כדי למקם את עצמך במרכז המסך בשיחות וידאו. ניתן להפעיל אותו בהגדרות המהירות.</translation> <translation id="2170530631236737939">כדי לצאת מ'מסכים אחרונים', יש להחליק למטה בעזרת שלוש אצבעות</translation> <translation id="219905428774326614">מפעיל האפליקציות, כל האפליקציות</translation> <translation id="2201071101391734388">תמונה אחרונה: <ph name="INDEX" /> מתוך <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">לא מחובר</translation> <translation id="2408955596600435184">יש להזין את קוד האימות</translation> <translation id="2412593942846481727">יש עדכון זמין</translation> +<translation id="2426051945783024481">פריים המצלמה מורכז באופן אוטומטי</translation> <translation id="2427507373259914951">לחיצה שמאלית</translation> <translation id="2429753432712299108">מכשיר ה-Bluetooth "<ph name="DEVICE_NAME" />" מבקש הרשאה לבצע התאמה. לפני מתן אישור, יש לוודא שמפתח הסיסמה הבא מוצג במכשיר הזה: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">הצגת סיסמה</translation> @@ -1037,6 +1039,7 @@ <translation id="6960565108681981554">הרשת לא פעילה. עליך לפנות לספק חבילת הסלולר שלך.</translation> <translation id="6961121602502368900">השתקת הטלפון לא זמינה בפרופיל העבודה</translation> <translation id="6961840794482373852">מקשי הקיצור Alt + חץ למעלה הוחלפו. כדי לדמות את הפעולה של המקש Page Up, יש להקיש על <ph name="LAUNCHER_KEY_NAME" /> + החץ למעלה.</translation> +<translation id="696267987219125751">הפריים האוטומטי מושבת במצלמה.</translation> <translation id="6965382102122355670">אישור</translation> <translation id="6972754398087986839">תחילת העבודה</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1127,6 +1130,7 @@ <translation id="7513922695575567867">יומן, השבוע של <ph name="DATE" />, התאריך שנבחר הוא <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">הורדה</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">הפריים האוטומטי פועל במצלמה.</translation> <translation id="7526573455193969409">ייתכן שהרשת מנוטרת</translation> <translation id="7536035074519304529">כתובת IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">בשלב הזה, אין תמיכה באפליקציות Linux ובחלונות פרטיים. אפליקציות אחרות יישמרו.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">ההורדה בהשהיה</translation> <translation id="7609951632080598826">תצוגת היומן, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">המצלמה מחוברת שוב.</translation> +<translation id="761736749114493194">החלפת מצב של הפריים האוטומטי במצלמה. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">הצגה של הרשאות שיתוף בקרבת מקום.</translation> <translation id="7634648064048557203">המצלמה מוצמדת לפינה השמאלית התחתונה</translation> @@ -1307,6 +1312,7 @@ <translation id="851458219935658693">הצגת חלונות משולחן העבודה הווירטואלי הנוכחי, לחצן הבחירה נבחר</translation> <translation id="8517041960877371778">ייתכן שה-<ph name="DEVICE_TYPE" /> לא ייטען כשהוא פועל.</translation> <translation id="8535393432370007982">ביטול של סדר המיון לפי צבע</translation> +<translation id="8541078764854166027">הפריים במצלמה</translation> <translation id="8542053257095774575">אין תבניות או שולחנות עבודה וירטואליים שמורים</translation> <translation id="8546059259582788728">הביטול של המיון הצליח</translation> <translation id="8551588720239073785">הגדרות תאריך ושעה</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 3672607d..a0fc870 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -1150,6 +1150,7 @@ <translation id="7633755430369750696">მახლობლად გაზიარების პარამეტრების ჩვენება.</translation> <translation id="7634648064048557203">კამერა მიზიდულია ქვედა მარჯვენა კუთხეში</translation> <translation id="7641938616688887143">ჩაწერა</translation> +<translation id="7642106959537987271">ფერთა ინვერსიის რეჟიმი</translation> <translation id="7642647758716480637"><ph name="NETWORK_NAME" />-ის პარამეტრების გახსნა, <ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (მფლობელი)</translation> <translation id="7647488630410863958">შეტყობინებების სანახავად, განბლოკეთ მოწყობილობა</translation> @@ -1255,6 +1256,7 @@ <translation id="8209010265547628927">გადაყენება</translation> <translation id="8214996719228530800">Canary არხი</translation> <translation id="8219451629189078428">თქვენი Chromebook ამ დროის განმავლობაში ჩართული და კვების წყაროსთან მიერთებული უნდა იყოს. დარწმუნდით, რომ დამტენის ან ადაპტერის კაბელები კარგად არის შეერთებული როგორც Chromebook-ში, ისე როზეტში. არ გამორთოთ Chromebook.</translation> +<translation id="8230305195727960608">ფერთა ინვერსიის რეჟიმი</translation> <translation id="8236042855478648955">შესვენების დროა</translation> <translation id="8246282815785366524">კეთილი იყოს თქვენი დაბრუნება, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />, ტელეფონის ბატარეა: <ph name="BATTERY_STATUS" /></translation> @@ -1380,6 +1382,7 @@ <translation id="8982906748181120328">ახლომახლო ხილვადობა</translation> <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">გამოიყენება <ph name="IME_NAME" /></translation> +<translation id="8991617137207906966">ფერთა ინვერსიის რეჟიმი ჩაირთო. მის გამოსართავად ხელახლა დააჭირეთ კლავიშთა კომბინაციას Ctrl+Search+H.</translation> <translation id="899350903320462459">შეტყობინების ქმედების შესასრულებლად განბლოკეთ მოწყობილობა <ph name="LOGIN_ID" />-ის სახელით</translation> <translation id="9000771174482730261">მეხსიერების მართვა</translation> <translation id="9017320285115481645">შეიყვანეთ Family Link-ის წვდომის კოდი მშობლებისთვის.</translation> @@ -1428,6 +1431,7 @@ <translation id="921989828232331238">თქვენმა მშობელმა ჩაკეტა მოწყობილობა ერთი დღით</translation> <translation id="9220525904950070496">ანგარიშის წაშლა</translation> <translation id="923686485342484400">დააჭირეთ Control Shift Q ორჯერ, რათა გამოხვიდეთ.</translation> +<translation id="92580429198593979">თქვენ დააჭირეთ კლავიატურის მალსახმობს ფერთა ინვერსიისთვის. გსურთ მისი ჩართვა?</translation> <translation id="925832987464884575">გადახედვის გამორთვა</translation> <translation id="937214777182567951"><ph name="MANAGER" /> ითხოვს, დაუყოვნებლივ განაახლოთ ეს <ph name="DEVICE_TYPE" /></translation> <translation id="938963181863597773">რა მაქვს კალენდარში?</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 2f0f4ac..310f9c8e 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">화면 전체 녹화</translation> <translation id="2135456203358955318">고정 돋보기</translation> <translation id="2148716181193084225">오늘</translation> +<translation id="2161132820593978283">영상 통화에서 화면 중앙에 표시되도록 카메라 프레이밍을 사용해 보세요. 빠른 설정에서 사용 설정하면 됩니다.</translation> <translation id="2170530631236737939">최근 사용을 종료하려면 세 손가락을 사용해 아래로 스와이프하세요.</translation> <translation id="219905428774326614">런처, 모든 앱</translation> <translation id="2201071101391734388">최근 사진 총 <ph name="TOTAL_COUNT" />개 중 <ph name="INDEX" />번째입니다.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">연결되지 않음</translation> <translation id="2408955596600435184">PIN 입력</translation> <translation id="2412593942846481727">업데이트 가능</translation> +<translation id="2426051945783024481">카메라 프레임이 자동으로 중앙에 위치함</translation> <translation id="2427507373259914951">왼쪽 클릭</translation> <translation id="2429753432712299108">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다. 허가하기 전에 다음 패스키가 기기에 표시되는지 확인하세요. <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">비밀번호 표시</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">활성화되지 않았습니다. 이동통신사에 문의하세요.</translation> <translation id="6961121602502368900">직장 프로필에서는 휴대전화 무음 설정을 사용할 수 없음</translation> <translation id="6961840794482373852">Alt + 위쪽 화살표 단축키가 변경되었습니다. Page Up 키를 사용하려면 <ph name="LAUNCHER_KEY_NAME" /> 키 + 위쪽 화살표 키를 누르세요.</translation> +<translation id="696267987219125751">카메라 프레이밍이 사용 중지되어 있습니다.</translation> <translation id="6965382102122355670">확인</translation> <translation id="6972754398087986839">시작하기</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">현재 캘린더에서 <ph name="DATE" />이 속한 주를 표지 중이며 선택된 날짜는 <ph name="SELECTED_DATE" />입니다.</translation> <translation id="7514365320538308">다운로드</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">카메라 프레이밍이 사용 설정되어 있습니다.</translation> <translation id="7526573455193969409">네트워크가 모니터링될 수 있음</translation> <translation id="7536035074519304529">IP 주소: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Linux 앱 및 시크릿 창은 현재 지원되지 않습니다. 다른 앱은 저장됩니다.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">일시중지됨</translation> <translation id="7609951632080598826">캘린더 보기, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">카메라가 다시 연결되었습니다.</translation> +<translation id="761736749114493194">카메라 프레이밍을 전환합니다. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />°F</translation> <translation id="7633755430369750696">Nearby Share 설정 표시</translation> <translation id="7634648064048557203">카메라 미리보기가 오른쪽 하단으로 맞춰졌습니다</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">현재 데스크의 창 표시, 라디오 버튼 선택됨</translation> <translation id="8517041960877371778"><ph name="DEVICE_TYPE" />이(가) 켜져 있는 동안에는 충전되지 않을 수 있습니다.</translation> <translation id="8535393432370007982">색상별 정렬 순서 실행취소</translation> +<translation id="8541078764854166027">카메라 프레이밍</translation> <translation id="8542053257095774575">저장된 데스크 또는 템플릿 없음</translation> <translation id="8546059259582788728">정렬이 실행취소됨</translation> <translation id="8551588720239073785">날짜 및 시간 설정</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index c77bd4f..61e21dfd 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Įrašyti viso ekrano režimu</translation> <translation id="2135456203358955318">Prie doko prijungtas didintuvas</translation> <translation id="2148716181193084225">Šiandien</translation> +<translation id="2161132820593978283">Pabandykite naudoti fotoaparato kadravimo funkciją, kad būtumėte vaizdo skambučių ekrano centre. Įjunkite šią funkciją sparčiuosiuose nustatymuose.</translation> <translation id="2170530631236737939">Perbraukite žemyn trimis pirštais, kad išeitumėte iš „Apžvalgos“ skilties</translation> <translation id="219905428774326614">Paleidimo priemonė, visos programos</translation> <translation id="2201071101391734388">Naujausia <ph name="INDEX" /> nuotrauka iš <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Neprijungta</translation> <translation id="2408955596600435184">Įveskite PIN kodą</translation> <translation id="2412593942846481727">Pasiekiamas naujinys</translation> +<translation id="2426051945783024481">Fotoaparato kadras automatiškai centruojamas</translation> <translation id="2427507373259914951">Spustelėti kairiuoju klavišu</translation> <translation id="2429753432712299108">„Bluetooth“ įrenginys „<ph name="DEVICE_NAME" />“ prašo leidimo susieti. Prieš sutikdami, patvirtinkite, kad šiame įrenginyje rodomas šis slaptasis raktas: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Rodyti slaptažodį</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Nesuaktyvinta. Susisiekite su operatoriumi.</translation> <translation id="6961121602502368900">Telefono nutildymo funkcija nepasiekiama darbo profilyje</translation> <translation id="6961840794482373852">Pakeistas spartusis klavišas „Alt“ + rodyklė aukštyn. Jei norite naudoti klavišą „Page Up“, paspauskite <ph name="LAUNCHER_KEY_NAME" /> klavišą + rodyklę aukštyn.</translation> +<translation id="696267987219125751">Fotoaparato kadravimo funkcija išjungta.</translation> <translation id="6965382102122355670">Gerai</translation> <translation id="6972754398087986839">Darbo pradžia</translation> <translation id="6979158407327259162">„Google“ diskas</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Kalendorius, <ph name="DATE" /> savaitė, šiuo metu pasirinkta <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Atsisiųsti</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Fotoaparato kadravimo funkcija įjungta.</translation> <translation id="7526573455193969409">Tinklas gali būti stebimas</translation> <translation id="7536035074519304529">IP adresas: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">„Linux“ programos ir inkognito langai šiuo metu nepalaikomi. Kitos programos bus išsaugotos.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">Pristabdyta</translation> <translation id="7609951632080598826">Kalendoriaus rodinys, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Fotoaparatas prijungtas iš naujo.</translation> +<translation id="761736749114493194">Perjungti fotoaparato kadravimo funkciją. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> °F</translation> <translation id="7633755430369750696">Rodyti bendrinimo netoliese nustatymus.</translation> <translation id="7634648064048557203">Fotoaparato peržiūra pridėta apatiniame dešiniajame kampe</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Rodyti dabartinio darbalaukio langus, pasirinkta akutė</translation> <translation id="8517041960877371778">„<ph name="DEVICE_TYPE" />“ gali nebūti kraunamas, kai yra įjungtas.</translation> <translation id="8535393432370007982">Anuliuoti rūšiavimo tvarką pagal spalvą</translation> +<translation id="8541078764854166027">Fotoaparato kadravimas</translation> <translation id="8542053257095774575">Nėra jokių išsaugotų darbalaukių ar šablonų</translation> <translation id="8546059259582788728">Rūšiavimas sėkmingai anuliuotas</translation> <translation id="8551588720239073785">Datos ir laiko nustatymai</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index dd82e76a..77eb8d2 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Бүтэн дэлгэцийг бичих</translation> <translation id="2135456203358955318">Суурилуулсан томруулагч</translation> <translation id="2148716181193084225">Өнөөдөр</translation> +<translation id="2161132820593978283">Камерын хүрээлэх онцлогийг туршсанаар та видео дуудлагын дэлгэцийн голд байх болно. Үүнийг Шуурхай тохиргоо хэсэгт асаана уу.</translation> <translation id="2170530631236737939">Тоймоос гарахын тулд гурван хуруугаараа доош шударна уу</translation> <translation id="219905428774326614">Эхлүүлэгч, бүх апп</translation> <translation id="2201071101391734388">Саяхны <ph name="TOTAL_COUNT" />-с <ph name="INDEX" />-р зураг.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Холбогдоогүй</translation> <translation id="2408955596600435184">ПИН-ээ оруулна уу</translation> <translation id="2412593942846481727">Шинэчлэх боломжтой</translation> +<translation id="2426051945783024481">Камерын хүрээг автоматаар голлуулсан</translation> <translation id="2427507373259914951">Зүүн талыг товших</translation> <translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" Bluetooth төхөөрөмж нь холбогдох зөвшөөрөл хүсч байна. Хүлээж авахаасаа өмнө <ph name="PASSKEY" /> дамжуулах түлхүүр үг нь энэ төхөөрөмж дээр гарч ирсэн байгаа эсэхийг шалгана уу.</translation> <translation id="2435457462613246316">Нууц үг харуулах</translation> @@ -1039,6 +1041,7 @@ <translation id="6960565108681981554">Идэвхжүүлээгүй байна. Оператор компанитайгаа холбогдоно уу.</translation> <translation id="6961121602502368900">Ажлын профайл дээр утсыг чимээгүй болгох боломжгүй</translation> <translation id="6961840794482373852">Alt + Дээш сумны товчлуурын шууд холбоосыг өөрчилсөн байна. Page Up товчлуурыг ашиглахын тулд <ph name="LAUNCHER_KEY_NAME" /> товчлуур + Дээш сумыг дарна уу.</translation> +<translation id="696267987219125751">Камерын хүрээлэх онцлог унтраалттай байна.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Эхлүүлэх</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1129,6 +1132,7 @@ <translation id="7513922695575567867">Календарь, <ph name="DATE" />-н долоо хоног, <ph name="SELECTED_DATE" />-г одоогоор сонгосон.</translation> <translation id="7514365320538308">Татаж авах</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Камерын хүрээлэх онцлог асаалттай байна.</translation> <translation id="7526573455193969409">Сүлжээг хянаж байж болзошгүй</translation> <translation id="7536035074519304529">IP хаяг: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Linux аппууд болон Нууцлалтай цонхнуудыг одоогоор дэмждэггүй. Бусад аппыг хадгална.</translation> @@ -1147,6 +1151,7 @@ <translation id="7607002721634913082">зогссон</translation> <translation id="7609951632080598826">Календарийн харагдах байдал, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Камер дахин холбогдсон.</translation> +<translation id="761736749114493194">Камерын хүрээлэх онцлогийг асаана уу/унтраана уу. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Ойролцоо хуваалцах тохиргоог харуулна.</translation> <translation id="7634648064048557203">Камерыг баруун доод булан руу зэрэгцүүлсэн</translation> @@ -1308,6 +1313,7 @@ <translation id="851458219935658693">Одоогийн дэлгэцээс цонхыг харуулах, радио товчлуурыг сонгосон</translation> <translation id="8517041960877371778">Таны <ph name="DEVICE_TYPE" /> асаалттай үед цэнэглэхгүй.</translation> <translation id="8535393432370007982">Өнгөөр эрэмбэлэх дарааллыг болих</translation> +<translation id="8541078764854166027">Камерын хүрээлэх онцлог</translation> <translation id="8542053257095774575">Хадгалсан дэлгэц эсвэл загвар байхгүй</translation> <translation id="8546059259582788728">Эрэмбэлэхийг амжилттай болилоо</translation> <translation id="8551588720239073785">Огноо болон цагийн тохиргоо</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index fb2abb9..acb85bc1 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Nagraj cały ekran</translation> <translation id="2135456203358955318">Lupa zadokowana</translation> <translation id="2148716181193084225">Dzisiaj</translation> +<translation id="2161132820593978283">Spróbuj ustawić kadr, aby na obrazie z kamery podczas rozmów wideo znaleźć się pośrodku ekranu. Włącz tę funkcję w Szybkich ustawieniach.</translation> <translation id="2170530631236737939">Aby zamknąć Przegląd, przesuń 3 palcami w dół</translation> <translation id="219905428774326614">Menu ze wszystkimi aplikacjami</translation> <translation id="2201071101391734388">Najnowsze zdjęcie <ph name="INDEX" /> z <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Brak połączenia</translation> <translation id="2408955596600435184">Wpisz kod PIN</translation> <translation id="2412593942846481727">Dostępna aktualizacja</translation> +<translation id="2426051945783024481">Kadr kamery jest automatycznie wyśrodkowany</translation> <translation id="2427507373259914951">Kliknięcie lewym przyciskiem</translation> <translation id="2429753432712299108">Urządzenie Bluetooth „<ph name="DEVICE_NAME" />” chce się sparować. Zanim to zaakceptujesz, sprawdź, czy na tym urządzeniu wyświetla się klucz: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Pokaż hasło</translation> @@ -1037,6 +1039,7 @@ <translation id="6960565108681981554">Nie aktywowano. Skontaktuj się ze swoim operatorem.</translation> <translation id="6961121602502368900">Funkcja Wyciszenie telefonu jest niedostępna w profilu służbowym</translation> <translation id="6961840794482373852">Skrót klawiszowy Alt + strzałka w górę został zmieniony. Aby użyć klawisza Page Up, naciśnij klawisz <ph name="LAUNCHER_KEY_NAME" /> + strzałka w górę.</translation> +<translation id="696267987219125751">Kadrowanie jest wyłączone.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Rozpocznij</translation> <translation id="6979158407327259162">Dysk Google</translation> @@ -1127,6 +1130,7 @@ <translation id="7513922695575567867">Kalendarz, tydzień do <ph name="DATE" />, obecnie wybrana jest data <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Pobierz</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Kadrowanie jest włączone.</translation> <translation id="7526573455193969409">Sieć może być monitorowana</translation> <translation id="7536035074519304529">Adres IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Aplikacje na Linuksa ani okna incognito nie są obecnie obsługiwane. Inne aplikacje zostaną zapisane.</translation> @@ -1145,6 +1149,7 @@ <translation id="7607002721634913082">Wstrzymano</translation> <translation id="7609951632080598826">Widok kalendarza, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Kamera została ponownie połączona.</translation> +<translation id="761736749114493194">Przełącz kadrowanie. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Pokaż ustawienia Udostępniania w pobliżu.</translation> <translation id="7634648064048557203">Podgląd z kamery został przyciągnięty do prawego dolnego rogu</translation> @@ -1305,6 +1310,7 @@ <translation id="851458219935658693">Wybrano opcję Pokaż okna z bieżącego biurka</translation> <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> nie może się ładować, gdy jest włączony.</translation> <translation id="8535393432370007982">Cofnij sortowanie według koloru</translation> +<translation id="8541078764854166027">Kadrowanie</translation> <translation id="8542053257095774575">Nie ma zapisanych biurek ani szablonów</translation> <translation id="8546059259582788728">Sortowanie zostało cofnięte</translation> <translation id="8551588720239073785">Ustawienia daty i godziny</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 89419b3..f6687ad 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -1155,6 +1155,7 @@ <translation id="7633755430369750696">Zobraziť nastavenia Zdieľania nablízku</translation> <translation id="7634648064048557203">Kamera bola prichytená do pravého dolného rohu</translation> <translation id="7641938616688887143">Nahrať</translation> +<translation id="7642106959537987271">režim inverzie farieb</translation> <translation id="7642647758716480637">Otvoriť nastavenia siete <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (vlastník)</translation> <translation id="7647488630410863958">Ak si chcete zobraziť upozornenia, odomknite zariadenie</translation> @@ -1260,6 +1261,7 @@ <translation id="8209010265547628927">Resetovať</translation> <translation id="8214996719228530800">Kanál Canary</translation> <translation id="8219451629189078428">Chromebook musíte mať v tomto období zapnutý a pripojený k zásuvke. Uistite sa, či je kábel nabíjačky alebo adaptéra riadne pripojený do Chromebooku aj elektrickej zásuvky. Chromebook nevypínajte.</translation> +<translation id="8230305195727960608">Režim inverzie farieb</translation> <translation id="8236042855478648955">Čas na prestávku</translation> <translation id="8246282815785366524">Vitajte späť, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, sila signálu <ph name="SIGNAL_STRENGTH" />, batéria telefónu <ph name="BATTERY_STATUS" /></translation> @@ -1386,6 +1388,7 @@ <translation id="8982906748181120328">Viditeľnosť nablízku</translation> <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Práve sa používa <ph name="IME_NAME" /></translation> +<translation id="8991617137207906966">Režim inverzie farieb je zapnutý. Vypnete ho opätovným stlačením kombinácie klávesov Ctrl + Hľadať + H.</translation> <translation id="899350903320462459">Ak chcete vykonať akciu s upozornením, odomknite zariadenie ako <ph name="LOGIN_ID" /></translation> <translation id="9000771174482730261">SPRAVOVAŤ PRIESTOR</translation> <translation id="9017320285115481645">Zadajte prístupový kód rodiča Family Link.</translation> @@ -1434,6 +1437,7 @@ <translation id="921989828232331238">Rodič na dnes toto zariadenie uzamkol</translation> <translation id="9220525904950070496">Odstrániť účet</translation> <translation id="923686485342484400">Ak sa chcete odhlásiť, stlačte dvakrát kombináciu klávesov Ctrl, Shift a Q.</translation> +<translation id="92580429198593979">Stlačili ste klávesovú skratku inverzie farieb. Chcete ju zapnúť?</translation> <translation id="925832987464884575">Skryť ukážky</translation> <translation id="937214777182567951"><ph name="MANAGER" /> vyžaduje, aby ste ihneď aktualizovali zariadenie <ph name="DEVICE_TYPE" /></translation> <translation id="938963181863597773">Čo mám v kalendári?</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index e732df82..59d2a4e8 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Snemanje celotnega zaslona</translation> <translation id="2135456203358955318">Zasidrana lupa</translation> <translation id="2148716181193084225">Danes</translation> +<translation id="2161132820593978283">Preizkusite kadriranje fotoaparata, da boste v videoklicih prikazani na sredini zaslona. Vklopite ga v hitrih nastavitvah.</translation> <translation id="2170530631236737939">Če želite zapreti način pregleda, povlecite s tremi prsti navzdol.</translation> <translation id="219905428774326614">Zaganjalnik, vse aplikacije</translation> <translation id="2201071101391734388">Nedavna fotografija <ph name="INDEX" /> od <ph name="TOTAL_COUNT" />.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Ni povezano</translation> <translation id="2408955596600435184">Vnos kode PIN</translation> <translation id="2412593942846481727">Na voljo je posodobitev</translation> +<translation id="2426051945783024481">Okvir fotoaparata je samodejno na sredini.</translation> <translation id="2427507373259914951">Levi klik</translation> <translation id="2429753432712299108">Naprava Bluetooth »<ph name="DEVICE_NAME" />« želi dovoljenje za seznanjanje. Preden sprejmete, se prepričajte, da je na napravi prikazano to geslo: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Pokaži geslo</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Ni aktivirano. Obrnite se na operaterja.</translation> <translation id="6961121602502368900">Utišanje telefona ni na voljo v delovnem profilu</translation> <translation id="6961840794482373852">Bližnjica na tipkovnici alt + puščica gor je spremenjena. Če želite uporabiti tipko za stran navzgor, pritisnite tipko za <ph name="LAUNCHER_KEY_NAME" /> in puščico gor.</translation> +<translation id="696267987219125751">Kadriranje fotoaparata je izklopljeno.</translation> <translation id="6965382102122355670">V redu</translation> <translation id="6972754398087986839">Začnite</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Koledar, v tednu <ph name="DATE" />, trenutno izbran datum: <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Prenos</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Kadriranje fotoaparata je vklopljeno.</translation> <translation id="7526573455193969409">Omrežje je morda nadzorovano</translation> <translation id="7536035074519304529">Naslov IP: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Aplikacije za Linux in anonimna okna trenutno niso podprta. Druge aplikacije bodo shranjene.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">Začasno ustavljeno</translation> <translation id="7609951632080598826">Pogled koledarja, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Fotoaparat je znova povezan.</translation> +<translation id="761736749114493194">Preklop kadriranja fotoaparata. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> °F</translation> <translation id="7633755430369750696">Prikaz nastavitev deljenja v bližini.</translation> <translation id="7634648064048557203">Fotoaparat je pripet v spodnji desni kot</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Prikaz oken na trenutnem namizju, izbran je izbirni gumb</translation> <translation id="8517041960877371778">Akumulator naprave <ph name="DEVICE_TYPE" /> se morda ne bo polnil, medtem ko je naprava vklopljena.</translation> <translation id="8535393432370007982">Razveljavi način razvrščanja po barvi</translation> +<translation id="8541078764854166027">Kadriranje</translation> <translation id="8542053257095774575">Ni shranjenih namizij ali predlogov</translation> <translation id="8546059259582788728">Razveljavitev razvrščanja je uspela</translation> <translation id="8551588720239073785">Nastavitve datuma in ure</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index e4e8483..fffcf94 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -1156,6 +1156,7 @@ <translation id="7633755430369750696">సమీప షేరింగ్ సెట్టింగ్లను చూపించు.</translation> <translation id="7634648064048557203">కెమెరా దిగువ కుడి మూలకు స్నాప్ చేయబడింది</translation> <translation id="7641938616688887143">రికార్డ్</translation> +<translation id="7642106959537987271">కలర్ మార్పిడి మోడ్</translation> <translation id="7642647758716480637"><ph name="NETWORK_NAME" /> సెట్టింగ్లను తెరవండి, <ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (యజమాని)</translation> <translation id="7647488630410863958">మీ నోటిఫికేషన్లను చూడటానికి పరికరాన్ని అన్లాక్ చేయండి</translation> @@ -1261,6 +1262,7 @@ <translation id="8209010265547628927">రీసెట్ చేయండి</translation> <translation id="8214996719228530800">కెనరీ ఛానెల్</translation> <translation id="8219451629189078428">ఈ సమయంలో మీ Chromebook ఆన్లో ఉండాలి, పవర్కు కనెక్ట్ అయ్యి ఉండాలి. మీ Chromebook, పవర్ అవుట్లెట్ రెండింటికీ ఛార్జర్ లేదా అడాప్టర్ కేబుల్లు పూర్తిగా ప్లగ్-ఇన్ అయ్యాయని నిర్ధారించుకోండి. మీ Chromebookను ఆఫ్ చేయవద్దు.</translation> +<translation id="8230305195727960608">కలర్ మార్పిడి మోడ్</translation> <translation id="8236042855478648955">విరామ సమయం</translation> <translation id="8246282815785366524">పునఃస్వాగతం, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />, ఫోన్ బ్యాటరీ <ph name="BATTERY_STATUS" /></translation> @@ -1387,6 +1389,7 @@ <translation id="8982906748181120328">సమీప విజిబిలిటీ</translation> <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> ఉపయోగిస్తోంది</translation> +<translation id="8991617137207906966">కలర్ మార్పిడి మోడ్ ఎనేబుల్ చేయబడింది. Ctrl+Search+Hను నొక్కి, దాన్ని టోగుల్ ఆఫ్ చేయండి.</translation> <translation id="899350903320462459">నోటిఫికేషన్ చర్యను నిర్వహించడానికి <ph name="LOGIN_ID" />గా పరికరాన్ని అన్లాక్ చేయండి</translation> <translation id="9000771174482730261">స్టోరేజ్ను మేనేజ్ చేయండి</translation> <translation id="9017320285115481645">Family Link తల్లిదండ్రుల యాక్సెస్ కోడ్ను నమోదు చేయండి.</translation> @@ -1435,6 +1438,7 @@ <translation id="921989828232331238">మీ తల్లి/తండ్రి ఈ రోజుకి మీ పరికరాన్ని లాక్ చేసి ఉంచారు</translation> <translation id="9220525904950070496">ఖాతాను తీసివేయండి</translation> <translation id="923686485342484400">సైన్ అవుట్ చేయడానికి Control Shift Qను రెండుసార్లు నొక్కండి.</translation> +<translation id="92580429198593979">కలర్ మార్పిడి కోసం మీరు కీబోర్డ్ షార్ట్కట్ను నొక్కారు. మీరు దాన్ని ఆన్ చేయాలనుకుంటున్నారా?</translation> <translation id="925832987464884575">ప్రివ్యూలను దాచండి</translation> <translation id="937214777182567951">వెంటనే మీ <ph name="DEVICE_TYPE" />ను అప్డేట్ చేయాలని <ph name="MANAGER" /> తెలియజేస్తోంది</translation> <translation id="938963181863597773">నా క్యాలెండర్లో ఏమి ఉన్నాయి?</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 768c598..805180f 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -235,6 +235,7 @@ <translation id="2298170939937364391">เปิดใช้แว่นขยายทั้งหน้าจอแล้ว กด Ctrl+Search+M อีกครั้งเพื่อสลับเป็นปิด</translation> <translation id="2302092602801625023">บัญชีนี้จัดการโดย Family Link</translation> <translation id="2303600792989757991">ภาพรวมการสลับหน้าต่าง</translation> +<translation id="2315005022200073389"><ph name="HOLDING_SPACE_TITLE" />: การจับภาพหน้าจอ การดาวน์โหลด และไฟล์ที่ปักหมุดไว้ล่าสุด</translation> <translation id="2318576281648121272">วันนี้ <ph name="TODAY_DATE" /></translation> <translation id="2322065293366551060"><ph name="CATEGORY" /> , หมวดหมู่ผลการค้นหา</translation> <translation id="2322173485024759474">ถอยกลับทีละตัวอักษร</translation> @@ -1155,6 +1156,7 @@ <translation id="7633755430369750696">แสดงการตั้งค่าการแชร์ใกล้เคียง</translation> <translation id="7634648064048557203">จัดกล้องพอดีกับมุมขวาล่างแล้ว</translation> <translation id="7641938616688887143">บันทึก</translation> +<translation id="7642106959537987271">โหมดการกลับสี</translation> <translation id="7642647758716480637">เปิดการตั้งค่าของ <ph name="NETWORK_NAME" /> <ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (เจ้าของ)</translation> <translation id="7647488630410863958">ปลดล็อกอุปกรณ์เพื่อดูการแจ้งเตือน</translation> @@ -1260,6 +1262,7 @@ <translation id="8209010265547628927">รีเซ็ต</translation> <translation id="8214996719228530800">เวอร์ชัน Canary</translation> <translation id="8219451629189078428">คุณต้องเปิด Chromebook และเสียบปลั๊กไว้ตลอดในระหว่างนี้ ตรวจดูว่าได้เสียบสายที่ชาร์จและอะแดปเตอร์ไว้แน่นดีแล้ว ทั้งกับ Chromebook และเต้ารับ และอย่าปิด Chromebook</translation> +<translation id="8230305195727960608">โหมดการกลับสี</translation> <translation id="8236042855478648955">ได้เวลาพักแล้ว</translation> <translation id="8246282815785366524">ยินดีต้อนรับกลับมา <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />, แบตเตอรี่โทรศัพท์ <ph name="BATTERY_STATUS" /></translation> @@ -1386,6 +1389,7 @@ <translation id="8982906748181120328">การมองเห็นใกล้เคียง</translation> <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">กำลังใช้<ph name="IME_NAME" /></translation> +<translation id="8991617137207906966">เปิดใช้โหมดการกลับสีแล้ว กด Ctrl+Search+H อีกครั้งเพื่อสลับเป็นปิด</translation> <translation id="899350903320462459">ปลดล็อกอุปกรณ์โดยใช้ <ph name="LOGIN_ID" /> เพื่อดำเนินการแจ้งเตือน</translation> <translation id="9000771174482730261">จัดการพื้นที่เก็บข้อมูล</translation> <translation id="9017320285115481645">ป้อนรหัสการเข้าถึง Family Link ของผู้ปกครอง</translation> @@ -1434,6 +1438,7 @@ <translation id="921989828232331238">ผู้ปกครองล็อกอุปกรณ์ของคุณไว้ทั้งวัน</translation> <translation id="9220525904950070496">ลบบัญชี</translation> <translation id="923686485342484400">กด Control Shift Q 2 ครั้งเพื่อออกจากระบบ</translation> +<translation id="92580429198593979">คุณกดแป้นพิมพ์ลัดสำหรับการกลับสี คุณต้องการเปิดฟีเจอร์นี้ไหม</translation> <translation id="925832987464884575">ซ่อนตัวอย่าง</translation> <translation id="937214777182567951"><ph name="MANAGER" /> กำหนดให้คุณต้องอัปเดต <ph name="DEVICE_TYPE" /> โดยทันที</translation> <translation id="938963181863597773">มีอะไรในปฏิทินของฉันบ้าง</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index e413145..20d669c 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Tam ekran kaydet</translation> <translation id="2135456203358955318">Yerleştirilmiş büyüteç</translation> <translation id="2148716181193084225">Bugün</translation> +<translation id="2161132820593978283">Görüntülü görüşmelerde kendinizi ekranın ortasına yerleştirmek için kamera çerçevelemesini deneyin. Bu özelliği Hızlı Ayarlar'dan açın.</translation> <translation id="2170530631236737939">Genel Bakış'tan çıkmak için üç parmakla aşağı kaydırın</translation> <translation id="219905428774326614">Launcher, tüm uygulamalar</translation> <translation id="2201071101391734388">Son <ph name="TOTAL_COUNT" /> fotoğraftan <ph name="INDEX" />. fotoğraf.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Bağlı değil</translation> <translation id="2408955596600435184">PIN'inizi girin</translation> <translation id="2412593942846481727">Güncelleme var</translation> +<translation id="2426051945783024481">Kamera çerçevesi otomatik olarak ortalandı</translation> <translation id="2427507373259914951">Sol tıklama</translation> <translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" adlı Bluetooth cihaz eşleme izni istiyor. Kabul etmeden önce şu cihazda gösterilen bu parolanın gösterildiğini onaylayın: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Şifreyi göster</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Etkin değil. Operatörünüzle iletişime geçin.</translation> <translation id="6961121602502368900">Telefonu sessize alma özelliği, iş profilinde kullanılamaz</translation> <translation id="6961840794482373852">Alt + Yukarı Ok klavye kısayolu değişti. Page Up tuşunu kullanmak için <ph name="LAUNCHER_KEY_NAME" /> + Yukarı Ok tuşlarına basın.</translation> +<translation id="696267987219125751">Kamera çerçevelemesi kapalı.</translation> <translation id="6965382102122355670">Tamam</translation> <translation id="6972754398087986839">Başlarken</translation> <translation id="6979158407327259162">Google Drive</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Takvim, <ph name="DATE" /> haftası, şu anda <ph name="SELECTED_DATE" /> seçili.</translation> <translation id="7514365320538308">İndir</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Kamera çerçevelemesi açık.</translation> <translation id="7526573455193969409">Ağ trafiği izleniyor olabilir</translation> <translation id="7536035074519304529">IP adresi: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Linux uygulamaları ve gizli pencereler şu anda desteklenmiyor. Diğer uygulamalar kaydedilecek.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">Duraklatıldı</translation> <translation id="7609951632080598826">Takvim görünümü, <ph name="DATE" />, <ph name="TIME" /></translation> <translation id="7611213136657090146">Kamera yeniden bağlandı.</translation> +<translation id="761736749114493194">Kamera çerçevelemesini açın/kapatın. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Yakındakilerle Paylaşım ayarlarını gösterir.</translation> <translation id="7634648064048557203">Kamera sağ alt köşeye tutturuldu</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Geçerli masadaki pencereleri göster, radyo düğmesi seçildi</translation> <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> cihazınız açıkken şarj olmayabilir.</translation> <translation id="8535393432370007982">Renge göre sıralama ölçütünü geri al</translation> +<translation id="8541078764854166027">Kamera çerçevelemesi</translation> <translation id="8542053257095774575">Kayıtlı masa veya şablon yok</translation> <translation id="8546059259582788728">Sıralama işlemi başarıyla geri alındı</translation> <translation id="8551588720239073785">Tarih ve zaman ayarları</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index f31228c6..7d8e5e51 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">Записувати весь екран</translation> <translation id="2135456203358955318">Закріплена лупа</translation> <translation id="2148716181193084225">Сьогодні</translation> +<translation id="2161132820593978283">Налаштуйте режим слідкування, щоб ваше обличчя завжди залишалося в центрі екрана під час відеодзвінків. Увімкніть цю функцію в меню "Швидкі налаштування".</translation> <translation id="2170530631236737939">Щоб вийти з режиму огляду, проведіть трьома пальцями вниз</translation> <translation id="219905428774326614">Панель запуску, усі додатки</translation> <translation id="2201071101391734388">Фото <ph name="INDEX" /> з <ph name="TOTAL_COUNT" /> останніх.</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">Не підключено</translation> <translation id="2408955596600435184">Введіть PIN-код</translation> <translation id="2412593942846481727">Доступне оновлення</translation> +<translation id="2426051945783024481">Камера центрується автоматично</translation> <translation id="2427507373259914951">Натиснути лівою кнопкою</translation> <translation id="2429753432712299108">Пристрою Bluetooth "<ph name="DEVICE_NAME" />" потрібен дозвіл на підключення. Перш ніж надати його, підтвердьте, що на пристрої відображається цей ключ доступу: <ph name="PASSKEY" /></translation> <translation id="2435457462613246316">Показати пароль</translation> @@ -1038,6 +1040,7 @@ <translation id="6960565108681981554">Не активовано. Зв’яжіться з оператором.</translation> <translation id="6961121602502368900">Звук телефона не можна вимкнути в робочому профілі</translation> <translation id="6961840794482373852">Комбінацію клавіш Alt + стрілка вгору змінено. Щоб скористатися клавішею Page Up, натисніть клавішу <ph name="LAUNCHER_KEY_NAME" /> + стрілку вгору.</translation> +<translation id="696267987219125751">Режим слідкування вимкнено.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6972754398087986839">Почати</translation> <translation id="6979158407327259162">Диск Google</translation> @@ -1128,6 +1131,7 @@ <translation id="7513922695575567867">Календар, тиждень від <ph name="DATE" />, зараз вибрано <ph name="SELECTED_DATE" />.</translation> <translation id="7514365320538308">Завантажити</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">Режим слідкування ввімкнено.</translation> <translation id="7526573455193969409">Мережевий трафік може відстежуватися</translation> <translation id="7536035074519304529">ІР-адреса: <ph name="ADDRESS" /></translation> <translation id="7543399541175347147">Додатки Linux і вікна в режимі анонімного перегляду наразі не підтримуються. Інші додатки буде збережено.</translation> @@ -1146,6 +1150,7 @@ <translation id="7607002721634913082">Призупинено</translation> <translation id="7609951632080598826">Запис у календарі, <ph name="DATE" /> о <ph name="TIME" /></translation> <translation id="7611213136657090146">Камеру знову підключено.</translation> +<translation id="761736749114493194">Увімкнути або вимкнути режим слідкування. <ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Показати налаштування функції "Передавання поблизу".</translation> <translation id="7634648064048557203">Зображення з камери закріплено в нижньому правому куті</translation> @@ -1306,6 +1311,7 @@ <translation id="851458219935658693">Показувати вікна з поточного робочого столу, перемикач вибрано</translation> <translation id="8517041960877371778">Пристрій <ph name="DEVICE_TYPE" /> може не заряджатися, коли він увімкнений.</translation> <translation id="8535393432370007982">Скасувати сортування за кольором</translation> +<translation id="8541078764854166027">Слідкування</translation> <translation id="8542053257095774575">Немає збережених робочих столів або шаблонів</translation> <translation id="8546059259582788728">Сортування скасовано</translation> <translation id="8551588720239073785">Налаштування дати й часу</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 9837540..4b4edfa4 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -235,6 +235,7 @@ <translation id="2298170939937364391">Butun ekran rejimidagi lupa yoniq. Uni olib tashlash uchun Ctrl+Qidiruv+M tugmalarini bosing.</translation> <translation id="2302092602801625023">Ushbu hisob Family Link orqali boshqariladi</translation> <translation id="2303600792989757991">Ko‘rish rejimiga almashtirish</translation> +<translation id="2315005022200073389"><ph name="HOLDING_SPACE_TITLE" />: oxirgi ekran lavhalari, yuklanmalar va mahkamlangan fayllar</translation> <translation id="2318576281648121272">Bugun <ph name="TODAY_DATE" /></translation> <translation id="2322065293366551060"><ph name="CATEGORY" /> , qidiruv natijasi turkumi</translation> <translation id="2322173485024759474">Bitta harf orqaga</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index bc6a813..c9fff16 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -214,6 +214,7 @@ <translation id="2132302418721800944">錄影全螢幕</translation> <translation id="2135456203358955318">固定的放大鏡</translation> <translation id="2148716181193084225">今天</translation> +<translation id="2161132820593978283">試用相機取景功能,讓您在視像通話時處於畫面中央。請在「快速設定」中開啟相機取景功能。</translation> <translation id="2170530631236737939">用三隻手指向下滑動即可結束「概覽」</translation> <translation id="219905428774326614">啟動器,顯示緊全部應用程式</translation> <translation id="2201071101391734388">第 <ph name="INDEX" /> 張近期相片 (共 <ph name="TOTAL_COUNT" /> 張)。</translation> @@ -252,6 +253,7 @@ <translation id="2405664212338326887">未連線</translation> <translation id="2408955596600435184">請輸入您的 PIN</translation> <translation id="2412593942846481727">有可用的更新</translation> +<translation id="2426051945783024481">相機鏡頭已自動置中</translation> <translation id="2427507373259914951">按一下左鍵</translation> <translation id="2429753432712299108">藍牙裝置「<ph name="DEVICE_NAME" />」要求配對權限。接受要求前,請確認裝置顯示以下密碼金鑰:<ph name="PASSKEY" /></translation> <translation id="2435457462613246316">顯示密碼</translation> @@ -1036,6 +1038,7 @@ <translation id="6960565108681981554">未啟用。請聯絡您的流動網絡供應商。</translation> <translation id="6961121602502368900">工作設定檔不支援將手機設定為靜音</translation> <translation id="6961840794482373852">「Alt + 向上箭咀」的鍵盤快速鍵已變更。如要使用 Page Up 鍵,請按下<ph name="LAUNCHER_KEY_NAME" />鍵 + 向上箭咀。</translation> +<translation id="696267987219125751">相機取景功能已關閉。</translation> <translation id="6965382102122355670">確定</translation> <translation id="6972754398087986839">開始使用</translation> <translation id="6979158407327259162">Google 雲端硬碟</translation> @@ -1126,6 +1129,7 @@ <translation id="7513922695575567867">日曆,<ph name="DATE" />嗰個星期,目前揀咗 <ph name="SELECTED_DATE" /> 日。</translation> <translation id="7514365320538308">下載</translation> <translation id="7515998400212163428">Android</translation> +<translation id="7519206258459640379">相機取景功能已開啟。</translation> <translation id="7526573455193969409">網絡可能會受到監控</translation> <translation id="7536035074519304529">IP 位址:<ph name="ADDRESS" /></translation> <translation id="7543399541175347147">目前不支援 Linux 應用程式和無痕式視窗。系統將儲存其他應用程式。</translation> @@ -1144,10 +1148,12 @@ <translation id="7607002721634913082">已暫停</translation> <translation id="7609951632080598826">日曆檢視,<ph name="DATE" />,<ph name="TIME" /></translation> <translation id="7611213136657090146">攝錄機已經重新連線。</translation> +<translation id="761736749114493194">切換相機取景功能。<ph name="STATE_TEXT" /></translation> <translation id="7624117708979618027">華氏 <ph name="TEMPERATURE_F" />°</translation> <translation id="7633755430369750696">顯示「咫尺共享」設定。</translation> <translation id="7634648064048557203">攝錄機已經對齊右下角</translation> <translation id="7641938616688887143">錄影</translation> +<translation id="7642106959537987271">色彩反轉模式</translation> <translation id="7642647758716480637">打開<ph name="NETWORK_NAME" />嘅設定,<ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (擁有者)</translation> <translation id="7647488630410863958">解鎖裝置即可查看您的通知</translation> @@ -1253,6 +1259,7 @@ <translation id="8209010265547628927">重設</translation> <translation id="8214996719228530800">Canary 版本</translation> <translation id="8219451629189078428">Chromebook 在這段期間需要保持開啟並接上電源。請確保充電器或適配器連接線完全插入 Chromebook 和電源插座。請勿關閉 Chromebook。</translation> +<translation id="8230305195727960608">色彩反轉模式</translation> <translation id="8236042855478648955">休息時間到了</translation> <translation id="8246282815785366524"><ph name="GIVEN_NAME" />,歡迎回來</translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />,手機電量係 <ph name="BATTERY_STATUS" /></translation> @@ -1304,6 +1311,7 @@ <translation id="851458219935658693">顯示目前桌面嘅視窗,揀咗圓形按鈕</translation> <translation id="8517041960877371778">您的 <ph name="DEVICE_TYPE" /> 在開啟時可能無法充電。</translation> <translation id="8535393432370007982">根據顏色復原排列次序</translation> +<translation id="8541078764854166027">相機取景功能</translation> <translation id="8542053257095774575">沒有已儲存的桌面或範本</translation> <translation id="8546059259582788728">成功復原排序</translation> <translation id="8551588720239073785">日期和時間設定</translation> @@ -1378,6 +1386,7 @@ <translation id="8982906748181120328">「咫尺共享」分享設定</translation> <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">正在使用<ph name="IME_NAME" /></translation> +<translation id="8991617137207906966">已啟用「色彩反轉模式」。再次按下 Ctrl+Search+H 鍵便可停用。</translation> <translation id="899350903320462459">以 <ph name="LOGIN_ID" /> 身份解鎖裝置即可執行有關通知的動作</translation> <translation id="9000771174482730261">管理儲存空間</translation> <translation id="9017320285115481645">請輸入 Family Link 家長存取碼。</translation> @@ -1426,6 +1435,7 @@ <translation id="921989828232331238">您的家長今天已鎖定此裝置</translation> <translation id="9220525904950070496">移除帳戶</translation> <translation id="923686485342484400">按兩下 Ctrl+Shift+Q 鍵即可登出。</translation> +<translation id="92580429198593979">您已按下色彩反轉的鍵盤快速鍵。確定要啟用色彩反轉嗎?</translation> <translation id="925832987464884575">隱藏預覽</translation> <translation id="937214777182567951"><ph name="MANAGER" /> 要求您立即更新 <ph name="DEVICE_TYPE" /></translation> <translation id="938963181863597773">我日曆有咩活動?</translation>
diff --git a/ash/system/media/unified_media_controls_view.cc b/ash/system/media/unified_media_controls_view.cc index d07e3c0..6764870 100644 --- a/ash/system/media/unified_media_controls_view.cc +++ b/ash/system/media/unified_media_controls_view.cc
@@ -18,7 +18,6 @@ #include "ui/color/color_id.h" #include "ui/gfx/geometry/skia_conversions.h" #include "ui/gfx/paint_vector_icon.h" -#include "ui/views/accessibility/accessibility_paint_checks.h" #include "ui/views/background.h" #include "ui/views/controls/focus_ring.h" #include "ui/views/controls/highlight_path_generator.h" @@ -145,10 +144,6 @@ }, this)), controller_(controller) { - // TODO(crbug.com/1218186): Remove this, this is in place temporarily to be - // able to submit accessibility checks. This crashes if fetching a11y node - // data during paint because message_view_ is null. - SetProperty(views::kSkipAccessibilityPaintChecks, true); SetFocusBehavior(views::View::FocusBehavior::ALWAYS); SetBackground(views::CreateRoundedRectBackground(GetBackgroundColor(), kMediaControlsCornerRadius)); @@ -222,6 +217,15 @@ IDS_ASH_MEDIA_NOTIFICATION_ACTION_NEXT_TRACK)); button_row_ = AddChildView(std::move(button_row)); + + // Focusable views must have an accessible name when shown/painted so that + // the screen reader knows what to present to the user. SetTitle sets the + // accessible name using a string which includes the title of the song being + // played. That seems like the wrong string to use upon creation if nothing + // is playing. Therefore setting the name to a string which lacks the "now + // playing" information. + SetAccessibleName(l10n_util::GetStringUTF16( + IDS_ASH_QUICK_SETTINGS_BUBBLE_MEDIA_CONTROLS_SUB_MENU_ACCESSIBLE_DESCRIPTION)); } void UnifiedMediaControlsView::SetIsPlaying(bool playing) {
diff --git a/ash/system/privacy_hub/camera_privacy_switch_controller.cc b/ash/system/privacy_hub/camera_privacy_switch_controller.cc index 1318d818..ba8632e6 100644 --- a/ash/system/privacy_hub/camera_privacy_switch_controller.cc +++ b/ash/system/privacy_hub/camera_privacy_switch_controller.cc
@@ -102,10 +102,12 @@ int32_t camera_id, cros::mojom::CameraPrivacySwitchState state) { camera_privacy_switch_state_ = state; - Shell::Get() - ->privacy_hub_controller() - ->frontend() - .CameraHardwareToggleChanged(state); + PrivacyHubDelegate* const frontend = + Shell::Get()->privacy_hub_controller()->frontend(); + if (frontend) { + // This event can be received before the frontend delegate is registered + frontend->CameraHardwareToggleChanged(state); + } } cros::mojom::CameraPrivacySwitchState
diff --git a/ash/system/privacy_hub/microphone_privacy_switch_controller.cc b/ash/system/privacy_hub/microphone_privacy_switch_controller.cc index 7408307e..6807c01 100644 --- a/ash/system/privacy_hub/microphone_privacy_switch_controller.cc +++ b/ash/system/privacy_hub/microphone_privacy_switch_controller.cc
@@ -76,19 +76,24 @@ } void MicrophonePrivacySwitchController::OnAudioNodesChanged() { - Shell::Get() - ->privacy_hub_controller() - ->frontend() - .AvailabilityOfMicrophoneChanged( - CrasAudioHandler::Get()->HasActiveInputDeviceForSimpleUsage()); + PrivacyHubDelegate* const frontend = + Shell::Get()->privacy_hub_controller()->frontend(); + + if (frontend) { + // This may be called before the webui registers a frontend delegate + frontend->AvailabilityOfMicrophoneChanged( + CrasAudioHandler::Get()->HasActiveInputDeviceForSimpleUsage()); + } } void MicrophonePrivacySwitchController::OnMicrophoneMuteSwitchValueChanged( bool muted) { - Shell::Get() - ->privacy_hub_controller() - ->frontend() - .MicrophoneHardwareToggleChanged(muted); + PrivacyHubDelegate* const frontend = + Shell::Get()->privacy_hub_controller()->frontend(); + if (frontend) { + // In case this is called before the webui registers a frontend delegate + frontend->MicrophoneHardwareToggleChanged(muted); + } } } // namespace ash
diff --git a/ash/system/privacy_hub/privacy_hub_controller.h b/ash/system/privacy_hub/privacy_hub_controller.h index daa173f02..9200428 100644 --- a/ash/system/privacy_hub/privacy_hub_controller.h +++ b/ash/system/privacy_hub/privacy_hub_controller.h
@@ -38,7 +38,7 @@ void set_frontend(PrivacyHubDelegate* ptr) { frontend_ = ptr; } // Returns the adapter that can be used to modify the frontend - PrivacyHubDelegate& frontend() { return *frontend_; } + PrivacyHubDelegate* frontend() { return frontend_; } private: CameraPrivacySwitchController camera_controller_;
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb index b4d64306..0f5c032 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">ካሜራ</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">ምንም አልተቀረጸም</translation> +<translation id="169335673490251151">ተጨማሪ ገጾችን ቃኝ</translation> <translation id="1838104802459806957">ወደ ላይ አጋድል</translation> <translation id="1851169887664797861">ተጨማሪ የካሜራ መቆጣጠሪያዎች ይገኛሉ</translation> <translation id="1851616744363735765">ላፍታ ቆሟል</translation> @@ -100,6 +101,7 @@ <translation id="5317780077021120954">አስቀምጥ</translation> <translation id="5320594929574852403">ወደ ግራ አቅጣጫ በመንቀሳቀስ ላይ</translation> <translation id="5444515100983837161">የሰነዱን ሁሉንም ጠርዞች በክፈፉ ውስጥ ያስቀምጡ። ሰነዱ እና ዳራ የተለያዩ ቀለሞች ከሆኑ ቅኝት በተሻለ ሁኔታ ይሠራል።</translation> +<translation id="5662366948659129155">ገጽ <ph name="COUNT" />ን በመቃኘት ላይ</translation> <translation id="5671277269877808209">ካሬ</translation> <translation id="5746169159649715125">እንደ PDF አስቀምጥ</translation> <translation id="5753488212459587150">የባለሙያ ሁነታን ያንቁ</translation> @@ -107,6 +109,7 @@ <translation id="5775960006311140197">ወደ ውጭ መላክ ሁነታ</translation> <translation id="5860033963881614850">አጥፋ</translation> <translation id="5869546221129391014">ፍርግርግ</translation> +<translation id="5903928279335207406">ገጽ ሰርዝ</translation> <translation id="5916664084637901428">በርቷል</translation> <translation id="5975083100439434680">አሳንስ</translation> <translation id="5976160379964388480">ሌሎች</translation> @@ -158,6 +161,7 @@ <translation id="8167081290930651932">እንደ ፎቶ አስቀምጥ</translation> <translation id="8239780215768881278">የቪዲዮ ቅፅበተ ፎቶን ያንሱ</translation> <translation id="8261506727792406068">ሰርዝ</translation> +<translation id="839162370397157884">ገጽ ምረጥ</translation> <translation id="8425673304802773841">ወደ ታች አጋድል</translation> <translation id="8428213095426709021">ቅንብሮች</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb index ed38a430..3fd4aeb90 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">الكاميرا</translation> <translation id="1627744224761163218">4 × 4</translation> <translation id="1664224225747386870">لم يتمّ تسجيل أيّ بيانات.</translation> +<translation id="169335673490251151">مسح صفحات إضافية ضوئيًا</translation> <translation id="1838104802459806957">إمالة إلى أعلى</translation> <translation id="1851169887664797861">تتوفّر عناصر تحكُّم إضافية في الكاميرا.</translation> <translation id="1851616744363735765">متوقف مؤقتًا</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">نسخ عنوان الرابط</translation> <translation id="4281620174117014503">دقة متوسطة</translation> <translation id="4329152592498422850">التبديل لالتقاط صورة مربّعة</translation> +<translation id="4340659173795395806">يمكنك الآن إنشاء ملف PDF متعدِّد الصفحات.</translation> <translation id="4383571725254449280">طباعة سجلّات الأداء</translation> <translation id="4445542136948522167">إيقاف التقاط الصورة</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> ميغابكسل</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">حفظ</translation> <translation id="5320594929574852403">جارٍ نقل زاوية المستند في اتجاه اليسار</translation> <translation id="5444515100983837161">المستند بكل حوافه يجب أن يكون ضمن الإطار. وللحصول على أفضل النتائج، يجب أن يختلف لون المستند عن لون الخلفية.</translation> +<translation id="5662366948659129155">جارٍ مسح الصفحة <ph name="COUNT" /> ضوئيًا</translation> <translation id="5671277269877808209">وضع المربّع</translation> <translation id="5746169159649715125">حفظ بتنسيق ملف PDF</translation> <translation id="5753488212459587150">تفعيل الوضع المختصّ</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">الوضع المختصّ</translation> <translation id="5860033963881614850">غير مفعّل</translation> <translation id="5869546221129391014">شبكة</translation> +<translation id="5903928279335207406">حذف الصفحة</translation> <translation id="5916664084637901428">مفعّل</translation> <translation id="5975083100439434680">تصغير</translation> <translation id="5976160379964388480">غير ذلك</translation> @@ -159,6 +163,7 @@ <translation id="8167081290930651932">حفظ بتنسيق صورة</translation> <translation id="8239780215768881278">تسجيل لقطة فيديو</translation> <translation id="8261506727792406068">حذف</translation> +<translation id="839162370397157884">اختيار الصفحة</translation> <translation id="8425673304802773841">إمالة إلى أسفل</translation> <translation id="8428213095426709021">الإعدادات</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb index 9b8312e..302c29f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">কেমেৰা</translation> <translation id="1627744224761163218">৪ x ৪</translation> <translation id="1664224225747386870">একো ৰেকৰ্ড কৰা নহ'ল</translation> +<translation id="169335673490251151">অতিৰিক্ত পৃষ্ঠাসমূহ স্কেন কৰক</translation> <translation id="1838104802459806957">ওপৰলৈ হেলনীয়া কৰক</translation> <translation id="1851169887664797861">অতিৰিক্ত কেমেৰাৰ নিয়ন্ত্ৰণ উপলব্ধ</translation> <translation id="1851616744363735765">পজ হৈ আছে</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">লিংকৰ ঠিকনাটো প্ৰতিলিপি কৰক</translation> <translation id="4281620174117014503">মধ্যমীয়া ৰিজ’লিউশ্বন</translation> <translation id="4329152592498422850">বৰ্গাকাৰ ফট' ল'বলৈ সলনি কৰক</translation> +<translation id="4340659173795395806">আপুনি এতিয়া একাধিক পৃষ্ঠাৰ PDF সৃষ্টি কৰিব পাৰে</translation> <translation id="4383571725254449280">কার্যদক্ষতাৰ লগসমূহ প্ৰিণ্ট কৰক</translation> <translation id="4445542136948522167">ফট' উঠোৱা বন্ধ কৰক</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> মেগা পিক্সেল</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">ছেভ কৰক</translation> <translation id="5320594929574852403">বাওঁফাললৈ গতি কৰি আছে</translation> <translation id="5444515100983837161">নথিখনৰ আটাইকেইটা কাষ ফ্ৰে’মটোৰ ভিতৰত ৰাখক। নথিখনৰ সৈতে নেপথ্যৰ ৰংটো পৃথক হ’লে স্কেন কৰাৰ সুবিধাটোৱে আটাইতকৈ ভালকৈ কৰে।</translation> +<translation id="5662366948659129155"><ph name="COUNT" /> নম্বৰ পৃষ্ঠাখন স্কেন কৰি থকা হৈছে</translation> <translation id="5671277269877808209">বৰ্গাকাৰ</translation> <translation id="5746169159649715125">PDF হিচাপে ছেভ কৰক</translation> <translation id="5753488212459587150">বিশেষজ্ঞ ম’ড সক্ষম কৰক</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">বিশেষজ্ঞ ম’ড</translation> <translation id="5860033963881614850">অফ আছে</translation> <translation id="5869546221129391014">গ্ৰিড</translation> +<translation id="5903928279335207406">পৃষ্ঠা মচক</translation> <translation id="5916664084637901428">অন আছে</translation> <translation id="5975083100439434680">জুম আউট কৰক</translation> <translation id="5976160379964388480">অন্য</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">ফট' ছেভ কৰক</translation> <translation id="8239780215768881278">ভিডিঅ’ৰ স্নেপশ্বট লওক</translation> <translation id="8261506727792406068">মচক</translation> +<translation id="839162370397157884">পৃষ্ঠা বাছনি কৰক</translation> <translation id="8425673304802773841">তললৈ হেলনীয়া কৰক</translation> <translation id="8428213095426709021">ছেটিংসমূহ</translation> <translation id="8629662593426079630">৩৬০পি</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb index 81454e2..bd0604fc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Нищо не е записано</translation> +<translation id="169335673490251151">Сканиране на допълнителни страници</translation> <translation id="1838104802459806957">Накланяне нагоре</translation> <translation id="1851169887664797861">Налице са допълнителни контроли за камерата</translation> <translation id="1851616744363735765">НА ПАУЗА</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Копиране на адреса на връзката</translation> <translation id="4281620174117014503">Средна разделителна способност</translation> <translation id="4329152592498422850">Превключвател за правене на квадратна снимка</translation> +<translation id="4340659173795395806">Вече можете да създавате PDF файлове с няколко страници</translation> <translation id="4383571725254449280">Печат на регистрационните файлове за ефективността</translation> <translation id="4445542136948522167">Спиране на правенето на снимка</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> мегапиксела</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Запазване</translation> <translation id="5320594929574852403">Премества се наляво</translation> <translation id="5444515100983837161">Поставете документа изцяло в рамката. Функцията работи най-добре, ако документът и фонът са с различни цветове.</translation> +<translation id="5662366948659129155">Сканира се страница <ph name="COUNT" /></translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5746169159649715125">Запазване като PDF файл</translation> <translation id="5753488212459587150">Активиране на експертния режим</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Експертен режим</translation> <translation id="5860033963881614850">Изключено</translation> <translation id="5869546221129391014">Таблица</translation> +<translation id="5903928279335207406">Изтриване на страницата</translation> <translation id="5916664084637901428">Включено</translation> <translation id="5975083100439434680">Намаляване на мащаба</translation> <translation id="5976160379964388480">Други</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Запазване като снимка</translation> <translation id="8239780215768881278">Моментна снимка от видеоклипа</translation> <translation id="8261506727792406068">Изтриване</translation> +<translation id="839162370397157884">Избиране на страницата</translation> <translation id="8425673304802773841">Накланяне надолу</translation> <translation id="8428213095426709021">Настройки</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb index 084be69..2551ac2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">Copia l'adreça de l'enllaç</translation> <translation id="4281620174117014503">Resolució mitjana</translation> <translation id="4329152592498422850">Botó per fer una foto quadrada</translation> +<translation id="4340659173795395806">Ara pots crear fitxers PDF de diverses pàgines</translation> <translation id="4383571725254449280">Registres de rendiment d'impressió</translation> <translation id="4445542136948522167">No facis la foto</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapíxels</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb index 663106c..c6323a40 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Camera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Dim byd wedi'i recordio</translation> +<translation id="169335673490251151">Sganio tudalennau ychwanegol</translation> <translation id="1838104802459806957">Gogwyddo i fyny</translation> <translation id="1851169887664797861">Mae rheolyddion camera ychwanegol ar gael</translation> <translation id="1851616744363735765">SEIBIWYD</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Copïo cyfeiriad y ddolen</translation> <translation id="4281620174117014503">Cydraniad canolig</translation> <translation id="4329152592498422850">Newidiwch i dynnu llun sgwâr</translation> +<translation id="4340659173795395806">Nawr gallwch greu PDF aml-dudalen</translation> <translation id="4383571725254449280">Argraffu logiau perfformiad</translation> <translation id="4445542136948522167">Stopio tynnu llun</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapicsel</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Cadw</translation> <translation id="5320594929574852403">Yn symud i'r cyfeiriad chwith</translation> <translation id="5444515100983837161">Rhowch yr holl ymylon o'r ddogfen o fewn y ffrâm. Mae sganio'n gweithio orau os oes gan y ddogfen a'r cefndir liwiau gwahanol.</translation> +<translation id="5662366948659129155">Wrthi'n sganio tudalen <ph name="COUNT" /></translation> <translation id="5671277269877808209">Sgwâr</translation> <translation id="5746169159649715125">Cadw fel PDF</translation> <translation id="5753488212459587150">Galluogi'r modd arbenigwr</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Modd arbenigwr</translation> <translation id="5860033963881614850">Diffodd</translation> <translation id="5869546221129391014">Grid</translation> +<translation id="5903928279335207406">Dileu’r dudalen</translation> <translation id="5916664084637901428">Ymlaen</translation> <translation id="5975083100439434680">Pellhau</translation> <translation id="5976160379964388480">Eraill</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Cadw fel Llun</translation> <translation id="8239780215768881278">Tynnu llun o'r fideo</translation> <translation id="8261506727792406068">Dileu</translation> +<translation id="839162370397157884">Dewis tudalen</translation> <translation id="8425673304802773841">Gogwyddo i lawr</translation> <translation id="8428213095426709021">Gosodiadau</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb index 1d8a52c..4407caa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4x4</translation> <translation id="1664224225747386870">Der er ingen optagelser</translation> +<translation id="169335673490251151">Scan flere sider</translation> <translation id="1838104802459806957">Drej opad</translation> <translation id="1851169887664797861">Yderligere styringselementer til kameraet er tilgængelige</translation> <translation id="1851616744363735765">SAT PÅ PAUSE</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Kopiér linkadresse</translation> <translation id="4281620174117014503">Medium opløsning</translation> <translation id="4329152592498422850">Skift for at tage et kvadratisk billede</translation> +<translation id="4340659173795395806">Du kan nu oprette PDF-filer med flere sider</translation> <translation id="4383571725254449280">Effektivitetslogfiler for udskrivning</translation> <translation id="4445542136948522167">Stop med at tage billedet</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixels</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Gem</translation> <translation id="5320594929574852403">Flyttes mod venstre</translation> <translation id="5444515100983837161">Sørg for, at alle dokumentets kanter er inden for rammen. Scanning fungerer bedst, når dokumentet har en anden farve end baggrunden.</translation> +<translation id="5662366948659129155">Scanner side <ph name="COUNT" /></translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5746169159649715125">Gem som PDF</translation> <translation id="5753488212459587150">Aktivér eksperttilstand</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Eksperttilstand</translation> <translation id="5860033963881614850">Fra</translation> <translation id="5869546221129391014">Gitter</translation> +<translation id="5903928279335207406">Slet side</translation> <translation id="5916664084637901428">Til</translation> <translation id="5975083100439434680">Zoom ud</translation> <translation id="5976160379964388480">Andre</translation> @@ -159,6 +163,7 @@ <translation id="8167081290930651932">Gem som billede</translation> <translation id="8239780215768881278">Tag et videoøjebliksbillede</translation> <translation id="8261506727792406068">Slet</translation> +<translation id="839162370397157884">Vælg side</translation> <translation id="8425673304802773841">Drej nedad</translation> <translation id="8428213095426709021">Indstillinger</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb index e6ddc131..d2ebd49 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">URL kopieren</translation> <translation id="4281620174117014503">Mittlere Auflösung</translation> <translation id="4329152592498422850">Zum Modus für quadratische Fotos wechseln</translation> +<translation id="4340659173795395806">Du kannst jetzt PDF-Dateien mit mehreren Seiten erstellen</translation> <translation id="4383571725254449280">Druckleistungsprotokolle drucken</translation> <translation id="4445542136948522167">Fotoaufnahme beenden</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Megapixel</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb index 079e5c1..22128b3 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Cámara</translation> <translation id="1627744224761163218">4x4</translation> <translation id="1664224225747386870">No se ha grabado nada</translation> +<translation id="169335673490251151">Escanear más páginas</translation> <translation id="1838104802459806957">Inclinar hacia arriba</translation> <translation id="1851169887664797861">Controles de cámara adicionales disponibles</translation> <translation id="1851616744363735765">EN PAUSA</translation> @@ -100,6 +101,7 @@ <translation id="5317780077021120954">Guardar</translation> <translation id="5320594929574852403">Moviendo hacia la izquierda</translation> <translation id="5444515100983837161">Coloca todos los bordes del documento dentro del marco. Los documentos se escanean mejor si su color y el color de fondo son diferentes.</translation> +<translation id="5662366948659129155">Escaneando página <ph name="COUNT" /></translation> <translation id="5671277269877808209">Cuadrado</translation> <translation id="5746169159649715125">Guardar como PDF</translation> <translation id="5753488212459587150">Habilitar modo Experto</translation> @@ -107,6 +109,7 @@ <translation id="5775960006311140197">Modo Experto</translation> <translation id="5860033963881614850">Desactivado</translation> <translation id="5869546221129391014">Cuadrícula</translation> +<translation id="5903928279335207406">Eliminar página</translation> <translation id="5916664084637901428">Activado</translation> <translation id="5975083100439434680">Reducir</translation> <translation id="5976160379964388480">Otros</translation> @@ -158,6 +161,7 @@ <translation id="8167081290930651932">Guardar como foto</translation> <translation id="8239780215768881278">Hacer una captura de vídeo</translation> <translation id="8261506727792406068">Eliminar</translation> +<translation id="839162370397157884">Seleccionar página</translation> <translation id="8425673304802773841">Inclinar hacia abajo</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb index 3bf11415..138ab65 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kaamera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Midagi pole salvestatud</translation> +<translation id="169335673490251151">Täiendavate lehtede skannimine</translation> <translation id="1838104802459806957">Kalluta üles</translation> <translation id="1851169887664797861">Saadaval on kaamera täiendavad juhtnupud</translation> <translation id="1851616744363735765">PEATATUD</translation> @@ -100,6 +101,7 @@ <translation id="5317780077021120954">Salvesta</translation> <translation id="5320594929574852403">Liigub vasakule</translation> <translation id="5444515100983837161">Paigutage kõik dokumendi servad raami sisse. Skannimine toimib kõige paremini, kui dokument ja taust on eri värvi.</translation> +<translation id="5662366948659129155">Lehe <ph name="COUNT" /> skannimine</translation> <translation id="5671277269877808209">Ruut</translation> <translation id="5746169159649715125">Salvesta PDF-ina</translation> <translation id="5753488212459587150">Luba ekspertrežiim</translation> @@ -107,6 +109,7 @@ <translation id="5775960006311140197">Ekspertrežiim</translation> <translation id="5860033963881614850">Väljas</translation> <translation id="5869546221129391014">Ruudustik</translation> +<translation id="5903928279335207406">Kustuta leht</translation> <translation id="5916664084637901428">Sees</translation> <translation id="5975083100439434680">Suumib välja</translation> <translation id="5976160379964388480">Muud</translation> @@ -158,6 +161,7 @@ <translation id="8167081290930651932">Salvesta fotona</translation> <translation id="8239780215768881278">Jäädvusta video hetktõmmis</translation> <translation id="8261506727792406068">Kustuta</translation> +<translation id="839162370397157884">Vali leht</translation> <translation id="8425673304802773841">Kalluta alla</translation> <translation id="8428213095426709021">Seaded</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb index 3fbad19..ca080f5 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">Kopiatu estekaren helbidea</translation> <translation id="4281620174117014503">Tarteko bereizmena</translation> <translation id="4329152592498422850">Aldatu argazki karratuak ateratzeko modura</translation> +<translation id="4340659173795395806">Orri bat baino gehiagoko PDFak sor ditzakezu orain</translation> <translation id="4383571725254449280">Inprimatu errendimendu-erregistroak</translation> <translation id="4445542136948522167">Utzi argazkia ateratzeari</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb index 572cdbe3..5dd28d6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">دوربین</translation> <translation id="1627744224761163218">۴ × ۴</translation> <translation id="1664224225747386870">چیزی ضبط نشد</translation> +<translation id="169335673490251151">اسکن کردن صفحههای بیشتر</translation> <translation id="1838104802459806957">بالا بردن</translation> <translation id="1851169887664797861">کنترلهای بیشتر دوربین دردسترس است</translation> <translation id="1851616744363735765">موقتاً متوقف شد</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">کپی نشانی پیوند</translation> <translation id="4281620174117014503">وضوح متوسط</translation> <translation id="4329152592498422850">تغییر وضعیت به گرفتن عکس مربع</translation> +<translation id="4340659173795395806">اکنون میتوانید PDF چندصفحهای ایجاد کنید</translation> <translation id="4383571725254449280">چاپ گزارشهای عملکرد</translation> <translation id="4445542136948522167">توقف عکسبرداری</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> مگاپیکسل</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">ذخیره</translation> <translation id="5320594929574852403">درحال انتقال بهسمت چپ</translation> <translation id="5444515100983837161">همه لبههای سند را داخل قاب قرار دهید. اسکن بهترین عملکرد را زمانی دارد که رنگ سند و پسزمینه متفاوت باشد.</translation> +<translation id="5662366948659129155">درحال اسکن کردن صفحه <ph name="COUNT" /></translation> <translation id="5671277269877808209">مربع</translation> <translation id="5746169159649715125">ذخیره بهعنوان PDF</translation> <translation id="5753488212459587150">فعال کردن حالت کارشناس</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">حالت کارشناس</translation> <translation id="5860033963881614850">خاموش</translation> <translation id="5869546221129391014">جدولی</translation> +<translation id="5903928279335207406">حذف صفحه</translation> <translation id="5916664084637901428">روشن</translation> <translation id="5975083100439434680">دورنمایی کردن</translation> <translation id="5976160379964388480">موارد دیگر</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">ذخیره بهعنوان عکس</translation> <translation id="8239780215768881278">گرفتن عکس آنی ویدیو</translation> <translation id="8261506727792406068">حذف</translation> +<translation id="839162370397157884">انتخاب صفحه</translation> <translation id="8425673304802773841">پایین کشیدن</translation> <translation id="8428213095426709021">تنظیمات</translation> <translation id="8629662593426079630">۳۶۰ پیکسل</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb index 732d1ced..bf12740 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -80,6 +80,7 @@ <translation id="4269820728363426813">Kopioi linkin osoite</translation> <translation id="4281620174117014503">Keskitason resoluutio</translation> <translation id="4329152592498422850">Vaihda neliökuviin</translation> +<translation id="4340659173795395806">Voit nyt luoda monisivuisia PDF-tiedostoja</translation> <translation id="4383571725254449280">Tulosta kehityslokit</translation> <translation id="4445542136948522167">Lopeta kuvan ottaminen</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapikseliä</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb index 791ad59e..44b0c7a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">Kopyahin ang address ng link</translation> <translation id="4281620174117014503">Katamtamang resolution</translation> <translation id="4329152592498422850">Lumipat para kumuha ng parisukat na larawan</translation> +<translation id="4340659173795395806">Puwede ka na ngayong gumawa ng maraming page na PDF</translation> <translation id="4383571725254449280">Mag-print ng mga log ng pagganap</translation> <translation id="4445542136948522167">Ihinto ang pagkuha ng larawan</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mega pixel</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb index ee956c3..addb5986 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">કૅમેરા</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">કંઈ રેકોર્ડ થયું નથી</translation> +<translation id="169335673490251151">વધારાના પેજ સ્કૅન કરો</translation> <translation id="1838104802459806957">ઉપર ટિલ્ટ કરો</translation> <translation id="1851169887664797861">કૅમેરાના વધારાના નિયંત્રણો ઉપલબ્ધ છે</translation> <translation id="1851616744363735765">થોભાવેલ</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">લિંક સરનામું કૉપિ કરો</translation> <translation id="4281620174117014503">મધ્યમ રિઝોલ્યુશન</translation> <translation id="4329152592498422850">વર્ગાકાર ફોટો લેવા માટે સ્વિચ કરો</translation> +<translation id="4340659173795395806">હવે તમે એકથી વધુ પેજ વાળી PDF બનાવી શકો છો</translation> <translation id="4383571725254449280">કાર્યપ્રદર્શનના લૉગ પ્રિન્ટ કરો</translation> <translation id="4445542136948522167">ફોટા લેવાનું બંધ કરો</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> મેગાપિક્સેલ</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">સાચવો</translation> <translation id="5320594929574852403">ડાબી દિશામાં ખસેડી રહ્યાં છીએ</translation> <translation id="5444515100983837161">દસ્તાવેજના બધા ખૂણાઓને ફ્રેમની અંદર રાખો. જો દસ્તાવેજ અને બૅકગ્રાઉન્ડ અલગ-અલગ રંગોના હોય, તો સ્કૅન શ્રેષ્ઠ રીતે કામ કરે છે.</translation> +<translation id="5662366948659129155"><ph name="COUNT" /> નંબરનું પેજ સ્કૅન કરી રહ્યાં છીએ</translation> <translation id="5671277269877808209">ચોરસ</translation> <translation id="5746169159649715125">PDF તરીકે સાચવો</translation> <translation id="5753488212459587150">નિષ્ણાત મોડ ચાલુ કરો</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">નિષ્ણાત મોડ</translation> <translation id="5860033963881614850">બંધ</translation> <translation id="5869546221129391014">ગ્રિડ</translation> +<translation id="5903928279335207406">પેજ ડિલીટ કરો</translation> <translation id="5916664084637901428">ચાલુ</translation> <translation id="5975083100439434680">ઝૂમ ઘટાડો</translation> <translation id="5976160379964388480">અન્ય લોકો</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">ફોટો તરીકે સાચવો</translation> <translation id="8239780215768881278">વીડિયો સ્નૅપશૉટ લો</translation> <translation id="8261506727792406068">ડિલીટ કરો</translation> +<translation id="839162370397157884">પેજ પસંદ કરો</translation> <translation id="8425673304802773841">નીચે ટિલ્ટ કરો</translation> <translation id="8428213095426709021">સેટિંગ</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb index 27a76b6b..ad78ac56 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">कैमरा</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">कुछ भी रिकॉर्ड नहीं हुआ</translation> +<translation id="169335673490251151">अन्य पेजों को स्कैन करें</translation> <translation id="1838104802459806957">ऊपर झुकाएं</translation> <translation id="1851169887664797861">कैमरे के लिए अतिरिक्त कंट्रोल उपलब्ध हैं</translation> <translation id="1851616744363735765">रिकॉर्डिंग रोकी गई</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">लिंक पते को कॉपी करें</translation> <translation id="4281620174117014503">मीडियम रिज़ॉल्यूशन</translation> <translation id="4329152592498422850">चौकोर फ़ोटो खींचने के लिए स्विच करें</translation> +<translation id="4340659173795395806">अब आपके पास कई पेजों वाली PDF बनाने की सुविधा उपलब्ध है</translation> <translation id="4383571725254449280">परफ़ॉर्मेंस लॉग प्रिंट करें</translation> <translation id="4445542136948522167">फ़ोटो न खींचें</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> मेगापिक्सेल</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">सेव करें</translation> <translation id="5320594929574852403">बाईं ओर जा रहा है</translation> <translation id="5444515100983837161">दस्तावेज़ के सभी कोने फ़्रेम के अंदर रखें. दस्तावेज़ और बैकग्राउंड का रंग अलग-अलग होने पर स्कैन बेहतर होता है.</translation> +<translation id="5662366948659129155">पेज <ph name="COUNT" /> को स्कैन किया जा रहा है</translation> <translation id="5671277269877808209">वर्ग</translation> <translation id="5746169159649715125">PDF के रूप में सेव करें</translation> <translation id="5753488212459587150">एक्सपर्ट मोड चालू करें</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">एक्सपर्ट मोड</translation> <translation id="5860033963881614850">बंद</translation> <translation id="5869546221129391014">ग्रिड</translation> +<translation id="5903928279335207406">पेज मिटाएं</translation> <translation id="5916664084637901428">चालू है</translation> <translation id="5975083100439434680">ज़ूम आउट</translation> <translation id="5976160379964388480">अन्य</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">फ़ोटो फ़ॉर्मैट में सेव करें</translation> <translation id="8239780215768881278">वीडियो के स्नैपशॉट लें</translation> <translation id="8261506727792406068">मिटाएं</translation> +<translation id="839162370397157884">पेज चुनें</translation> <translation id="8425673304802773841">नीचे झुकाएं</translation> <translation id="8428213095426709021">सेटिंग</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb index 9c4e86a6..118b0dd9 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 × 4</translation> <translation id="1664224225747386870">A kamera semmit sem rögzített</translation> +<translation id="169335673490251151">További oldalak beolvasása</translation> <translation id="1838104802459806957">Billentés felfelé</translation> <translation id="1851169887664797861">Újabb kameravezérlők állnak rendelkezésre</translation> <translation id="1851616744363735765">SZÜNETEL</translation> @@ -100,6 +101,7 @@ <translation id="5317780077021120954">Mentés</translation> <translation id="5320594929574852403">Mozgatás bal oldali irányba</translation> <translation id="5444515100983837161">A dokumentum összes szélének a kereten belül kell lennie. A beolvasás akkor működik a legjobban, ha a dokumentum és a háttér színei különbözőek.</translation> +<translation id="5662366948659129155"><ph name="COUNT" />. oldal beolvasása</translation> <translation id="5671277269877808209">Négyzet</translation> <translation id="5746169159649715125">Mentés PDF-ként</translation> <translation id="5753488212459587150">Szakértői mód bekapcsolása</translation> @@ -107,6 +109,7 @@ <translation id="5775960006311140197">Szakértői mód</translation> <translation id="5860033963881614850">Kikapcsolva</translation> <translation id="5869546221129391014">Rács</translation> +<translation id="5903928279335207406">Oldal törlése</translation> <translation id="5916664084637901428">Be</translation> <translation id="5975083100439434680">Kicsinyítés</translation> <translation id="5976160379964388480">Egyéb</translation> @@ -158,6 +161,7 @@ <translation id="8167081290930651932">Mentés fotóként</translation> <translation id="8239780215768881278">Pillanatkép készítése a videóból</translation> <translation id="8261506727792406068">Törlés</translation> +<translation id="839162370397157884">Oldal kiválasztása</translation> <translation id="8425673304802773841">Billentés lefelé</translation> <translation id="8428213095426709021">Beállítások</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb index 7702f02..e868f64 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Fotocamera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nessun dato registrato</translation> +<translation id="169335673490251151">Scansiona pagine aggiuntive</translation> <translation id="1838104802459806957">Inclinazione verso l'alto</translation> <translation id="1851169887664797861">Disponibili controlli della videocamera aggiuntivi</translation> <translation id="1851616744363735765">IN PAUSA</translation> @@ -100,6 +101,7 @@ <translation id="5317780077021120954">Salva</translation> <translation id="5320594929574852403">Spostamento a sinistra</translation> <translation id="5444515100983837161">Posiziona i bordi del documento all'interno dell'inquadratura. La qualità della scansione è migliore se il documento e lo sfondo sono di colori diversi.</translation> +<translation id="5662366948659129155">Scansione pagina <ph name="COUNT" /> in corso…</translation> <translation id="5671277269877808209">Quadrato</translation> <translation id="5746169159649715125">Salva come PDF</translation> <translation id="5753488212459587150">Attiva modalità Esperto</translation> @@ -107,6 +109,7 @@ <translation id="5775960006311140197">Modalità Esperto</translation> <translation id="5860033963881614850">Off</translation> <translation id="5869546221129391014">Griglia</translation> +<translation id="5903928279335207406">Elimina pagina</translation> <translation id="5916664084637901428">On</translation> <translation id="5975083100439434680">Diminuisci lo zoom</translation> <translation id="5976160379964388480">Altri</translation> @@ -158,6 +161,7 @@ <translation id="8167081290930651932">Salva come foto</translation> <translation id="8239780215768881278">Scatta istantanea video</translation> <translation id="8261506727792406068">Elimina</translation> +<translation id="839162370397157884">Seleziona pagina</translation> <translation id="8425673304802773841">Inclinazione verso il basso</translation> <translation id="8428213095426709021">Impostazioni</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb index 503d1462..f99c2ae 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">מצלמה</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">לא צולם סרטון</translation> +<translation id="169335673490251151">סריקת דפים נוספים</translation> <translation id="1838104802459806957">הטייה מעלה</translation> <translation id="1851169887664797861">יש פקדים נוספים למצלמה</translation> <translation id="1851616744363735765">מושהית</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">העתקת כתובת של קישור</translation> <translation id="4281620174117014503">רזולוציה בינונית</translation> <translation id="4329152592498422850">מעבר לצילום תמונה מרובעת</translation> +<translation id="4340659173795395806">עכשיו אפשר ליצור קובץ PDF שמכיל מספר דפים</translation> <translation id="4383571725254449280">הדפסת יומני ביצועים</translation> <translation id="4445542136948522167">הפסקת הצילום</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> מגה-פיקסל</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">שמירה</translation> <translation id="5320594929574852403">מתבצעת תזוזה לשמאל</translation> <translation id="5444515100983837161">יש למקם את כל קצות המסמך בתוך המסגרת. הסריקה תתבצע בצורה הטובה ביותר אם המסמך והרקע יהיו בצבעים שונים.</translation> +<translation id="5662366948659129155">מתבצעת סריקה של דף <ph name="COUNT" /></translation> <translation id="5671277269877808209">ריבוע</translation> <translation id="5746169159649715125">שמירה כקובץ PDF</translation> <translation id="5753488212459587150">הפעלת מצב מתקדם</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">מצב מתקדם</translation> <translation id="5860033963881614850">כבוי</translation> <translation id="5869546221129391014">רשת</translation> +<translation id="5903928279335207406">מחיקת הדף</translation> <translation id="5916664084637901428">פועל</translation> <translation id="5975083100439434680">התרחקות</translation> <translation id="5976160379964388480">אחרים</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">שמירה כתמונה</translation> <translation id="8239780215768881278">צילום תמונה מהסרטון</translation> <translation id="8261506727792406068">מחיקה</translation> +<translation id="839162370397157884">בחירת הדף</translation> <translation id="8425673304802773841">הטייה מטה</translation> <translation id="8428213095426709021">הגדרות</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb index 76f91bb..a04209e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">카메라</translation> <translation id="1627744224761163218">4x4</translation> <translation id="1664224225747386870">녹화된 동영상이 없습니다.</translation> +<translation id="169335673490251151">추가 페이지 스캔</translation> <translation id="1838104802459806957">위로 기울이기</translation> <translation id="1851169887664797861">추가 카메라 제어 기능 사용 가능</translation> <translation id="1851616744363735765">일시중지됨</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">링크 주소 복사</translation> <translation id="4281620174117014503">중간 해상도</translation> <translation id="4329152592498422850">스퀘어 사진 촬영으로 전환</translation> +<translation id="4340659173795395806">이제 다중 페이지 PDF를 생성할 수 있습니다.</translation> <translation id="4383571725254449280">실적 로그 인쇄</translation> <translation id="4445542136948522167">사진 촬영 중지</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" />메가픽셀</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">저장</translation> <translation id="5320594929574852403">왼쪽으로 이동</translation> <translation id="5444515100983837161">프레임 안에 문서의 네 모서리를 위치시키세요. 문서와 배경이 서로 다른 색상일 때 스캔이 가장 잘 작동합니다.</translation> +<translation id="5662366948659129155"><ph name="COUNT" />페이지 스캔 중</translation> <translation id="5671277269877808209">정사각형</translation> <translation id="5746169159649715125">PDF로 저장</translation> <translation id="5753488212459587150">전문가 모드 사용 설정</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">전문가 모드</translation> <translation id="5860033963881614850">사용 안함</translation> <translation id="5869546221129391014">격자</translation> +<translation id="5903928279335207406">페이지 삭제</translation> <translation id="5916664084637901428">사용</translation> <translation id="5975083100439434680">축소</translation> <translation id="5976160379964388480">기타</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">사진으로 저장</translation> <translation id="8239780215768881278">동영상 스냅샷 촬영</translation> <translation id="8261506727792406068">삭제</translation> +<translation id="839162370397157884">페이지 선택</translation> <translation id="8425673304802773841">아래로 기울이기</translation> <translation id="8428213095426709021">설정</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb index 587dd24..3dc8a9e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nieko neįrašyta</translation> +<translation id="169335673490251151">Nuskaityti papildomus puslapius</translation> <translation id="1838104802459806957">Nukreipti aukštyn</translation> <translation id="1851169887664797861">Pasiekiami papildomi fotoaparato valdikliai</translation> <translation id="1851616744363735765">PRISTABDYTA</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Kopijuoti nuorodos adresą</translation> <translation id="4281620174117014503">Vidutinė skyra</translation> <translation id="4329152592498422850">Perjungti į kvadratinės nuotraukos režimą</translation> +<translation id="4340659173795395806">Dabar galite kurti kelių puslapių PDF</translation> <translation id="4383571725254449280">Spausdinti našumo žurnalus</translation> <translation id="4445542136948522167">Sustabdyti fotografavimą</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiks.</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Išsaugoti</translation> <translation id="5320594929574852403">Perkeliama kairėn</translation> <translation id="5444515100983837161">Visi dokumento kraštai turi būti rėmelyje. Geriausia nuskaitymo kokybė užtikrinama, kai dokumento ir fono spalvos skiriasi.</translation> +<translation id="5662366948659129155">Nuskaitomas <ph name="COUNT" /> psl.</translation> <translation id="5671277269877808209">Kvadratas</translation> <translation id="5746169159649715125">Išsaugoti kaip PDF</translation> <translation id="5753488212459587150">Įgalinti eksperto režimą</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Eksperto režimas</translation> <translation id="5860033963881614850">Išjungta</translation> <translation id="5869546221129391014">Tinklelis</translation> +<translation id="5903928279335207406">Ištrinti puslapį</translation> <translation id="5916664084637901428">Įjungta</translation> <translation id="5975083100439434680">Tolinti</translation> <translation id="5976160379964388480">Kita</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Išsaugoti kaip nuotrauką</translation> <translation id="8239780215768881278">Užfiksuoti momentinę vaizdo įrašo nuotrauką</translation> <translation id="8261506727792406068">Ištrinti</translation> +<translation id="839162370397157884">Pasirinkti puslapį</translation> <translation id="8425673304802773841">Nukreipti žemyn</translation> <translation id="8428213095426709021">Nustatymai</translation> <translation id="8629662593426079630">360 taškų</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb index 3c13a27d..ce568fa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Камер</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Бичсэн зүйл алга</translation> +<translation id="169335673490251151">Нэмэлт хуудас скан хийх</translation> <translation id="1838104802459806957">Дээш хазайлгах</translation> <translation id="1851169887664797861">Камерын нэмэлт хяналт боломжтой</translation> <translation id="1851616744363735765">ТҮР ЗОГСООСОН</translation> @@ -101,6 +102,7 @@ <translation id="5317780077021120954">Хадгалах</translation> <translation id="5320594929574852403">Зүүн тийш зөөж байна</translation> <translation id="5444515100983837161">Документын бүх ирмэгийг хүрээнд байрлуулна уу. Документ болон дэвсгэр өөр өөр өнгөтэй тохиолдолд илүү сайн скан хийнэ.</translation> +<translation id="5662366948659129155"><ph name="COUNT" />-р хуудсыг скан хийж байна</translation> <translation id="5671277269877808209">Дөрвөлжин</translation> <translation id="5746169159649715125">PDF хэлбэрээр хадгалах</translation> <translation id="5753488212459587150">Мэргэжилтний горимыг идэвхжүүлэх</translation> @@ -108,6 +110,7 @@ <translation id="5775960006311140197">Мэргэжилтэн горим</translation> <translation id="5860033963881614850">Идэвхгүй байна</translation> <translation id="5869546221129391014">Сүлжээний тор</translation> +<translation id="5903928279335207406">Хуудас устгах</translation> <translation id="5916664084637901428">Асаах</translation> <translation id="5975083100439434680">Багасгаж харах</translation> <translation id="5976160379964388480">Бусад</translation> @@ -159,6 +162,7 @@ <translation id="8167081290930651932">Зургаар хадгалах</translation> <translation id="8239780215768881278">Видео агшин зураг авах</translation> <translation id="8261506727792406068">Устгах</translation> +<translation id="839162370397157884">Хуудас сонгох</translation> <translation id="8425673304802773841">Доош хазайлгах</translation> <translation id="8428213095426709021">Тохиргоо</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb index beaff341..2ff0007 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">လင့် လိပ်စာ ကူးယူရန်</translation> <translation id="4281620174117014503">အလယ်အလတ် ပုံရိပ်ပြတ်သားကိန်း</translation> <translation id="4329152592498422850">စတုရန်းမုဒ် ဓာတ်ပုံရိုက်ရန်အတွက် ပြောင်းရန်</translation> +<translation id="4340659173795395806">စာမျက်နှာများပါသည့် PDF ကို ယခုပြုလုပ်နိုင်ပါပြီ</translation> <translation id="4383571725254449280">စွမ်းဆောင်ရည် မှတ်တမ်းများကို ပုံနှိပ်ရန်</translation> <translation id="4445542136948522167">ဓာတ်ပုံရိုက်ခြင်း ရပ်တန့်ရန်</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> မီဂါပစ်ဆယ်</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb index 81c111b..73d62a4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">Linkadres kopiëren</translation> <translation id="4281620174117014503">Gemiddelde resolutie</translation> <translation id="4329152592498422850">Schakel over om vierkante foto te maken</translation> +<translation id="4340659173795395806">Je kunt nu pdf's met meerdere pagina's maken</translation> <translation id="4383571725254449280">Prestatielogboeken afdrukken</translation> <translation id="4445542136948522167">Foto maken stoppen</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb index bc3fe94..55b017a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nic nie zostało nagrane</translation> +<translation id="169335673490251151">Skanuj dodatkowe strony</translation> <translation id="1838104802459806957">Przechyl do góry</translation> <translation id="1851169887664797861">Dostępne dodatkowe ustawienia aparatu</translation> <translation id="1851616744363735765">WSTRZYMANO</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Kopiuj adres linku</translation> <translation id="4281620174117014503">Rozdzielczość średnia</translation> <translation id="4329152592498422850">Przełącz, by zrobić kwadratowe zdjęcie</translation> +<translation id="4340659173795395806">Możesz teraz utworzyć wielostronicowy plik PDF</translation> <translation id="4383571725254449280">Drukuj dzienniki wydajności</translation> <translation id="4445542136948522167">Nie rób zdjęcia</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Mpix</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Zapisz</translation> <translation id="5320594929574852403">Przesuwam w lewo</translation> <translation id="5444515100983837161">Wszystkie krawędzie dokumentu muszą znaleźć się wewnątrz ramki. Skanowanie działa najlepiej, jeśli dokument i tło mają różne kolory.</translation> +<translation id="5662366948659129155">Skanowanie strony <ph name="COUNT" /></translation> <translation id="5671277269877808209">Kwadrat</translation> <translation id="5746169159649715125">Zapisz jako PDF</translation> <translation id="5753488212459587150">Włącz tryb eksperta</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Tryb eksperta</translation> <translation id="5860033963881614850">Wyłączone</translation> <translation id="5869546221129391014">Siatka</translation> +<translation id="5903928279335207406">Usuń stronę</translation> <translation id="5916664084637901428">Włączone</translation> <translation id="5975083100439434680">Pomniejsz</translation> <translation id="5976160379964388480">Pozostałe</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Zapisz jako zdjęcie</translation> <translation id="8239780215768881278">Zapisz stopklatkę</translation> <translation id="8261506727792406068">Usuń</translation> +<translation id="839162370397157884">Wybierz stronę</translation> <translation id="8425673304802773841">Pochyl w dół</translation> <translation id="8428213095426709021">Ustawienia</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb index 46b00687..4187874 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">Copiază adresa linkului</translation> <translation id="4281620174117014503">Rezoluție medie</translation> <translation id="4329152592498422850">Comută pentru a face o fotografie pătrată</translation> +<translation id="4340659173795395806">Acum poți crea PDF-uri cu mai multe pagini</translation> <translation id="4383571725254449280">Printează jurnalele de performanță</translation> <translation id="4445542136948522167">Nu mai fotografia</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixeli</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb index c9cce81..96b94ef 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -80,6 +80,7 @@ <translation id="4269820728363426813">Копировать адрес ссылки</translation> <translation id="4281620174117014503">Среднее разрешение</translation> <translation id="4329152592498422850">Перейти к созданию квадратного фото</translation> +<translation id="4340659173795395806">Создавайте многостраничные PDF</translation> <translation id="4383571725254449280">Распечатать журнал производительности</translation> <translation id="4445542136948522167">Отменить съемку</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Мп</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb index dccab8f..1132e034 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">Kopírovať adresu odkazu</translation> <translation id="4281620174117014503">Stredné rozlíšenie</translation> <translation id="4329152592498422850">Prepnúť na snímanie štvorcových fotiek</translation> +<translation id="4340659173795395806">Teraz môžete vytvoriť viacstránkový súbor PDF</translation> <translation id="4383571725254449280">Tlačiť denníky výkonnosti</translation> <translation id="4445542136948522167">Zastaviť fotenie</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Mpx</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb index 8681645e..61e59361 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nič ni posneto</translation> +<translation id="169335673490251151">Optično preberi dodatne strani</translation> <translation id="1838104802459806957">Nagni navzgor</translation> <translation id="1851169887664797861">Na voljo so dodatni kontrolniki kamere.</translation> <translation id="1851616744363735765">ZAČASNO ZAUSTAVLJENO</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Kopiraj naslov povezave</translation> <translation id="4281620174117014503">Srednja ločljivost</translation> <translation id="4329152592498422850">Preklop na snemanje kvadratnih fotografij</translation> +<translation id="4340659173795395806">Zdaj lahko ustvarite večstranski PDF.</translation> <translation id="4383571725254449280">Tiskanje dnevnikov delovanja</translation> <translation id="4445542136948522167">Ustavitev fotografiranja</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mio. slikovnih pik</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Shrani</translation> <translation id="5320594929574852403">Premikanje proti levi</translation> <translation id="5444515100983837161">Postavite vse robe dokumenta znotraj okvira. Optično branje deluje najbolje, če sta dokument in ozadje različnih barv.</translation> +<translation id="5662366948659129155">Optično branje <ph name="COUNT" />. strani</translation> <translation id="5671277269877808209">Kvadratno</translation> <translation id="5746169159649715125">Shrani kot PDF</translation> <translation id="5753488212459587150">Omogoči poznavalski način</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Poznavalski način</translation> <translation id="5860033963881614850">Izklopljeno</translation> <translation id="5869546221129391014">Mreža</translation> +<translation id="5903928279335207406">Izbriši stran</translation> <translation id="5916664084637901428">Vklopljeno</translation> <translation id="5975083100439434680">Pomanjšaj</translation> <translation id="5976160379964388480">Drugo</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Shrani kot fotografijo</translation> <translation id="8239780215768881278">Posnetek videa</translation> <translation id="8261506727792406068">Izbriši</translation> +<translation id="839162370397157884">Izberi stran</translation> <translation id="8425673304802773841">Nagni navzdol</translation> <translation id="8428213095426709021">Nastavitve</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb index 6786db8..63dfc5121 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Hiçbir şey kaydedilmedi</translation> +<translation id="169335673490251151">Başka sayfa tara</translation> <translation id="1838104802459806957">Kaldır</translation> <translation id="1851169887664797861">Ek kamera kontrolleri bulunuyor</translation> <translation id="1851616744363735765">DURAKLATILDI</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Bağlantı adresini kopyala</translation> <translation id="4281620174117014503">Orta düzey çözünürlük</translation> <translation id="4329152592498422850">Kare fotoğraf çekme moduna geç</translation> +<translation id="4340659173795395806">Artık çok sayfalı PDF oluşturabilirsiniz</translation> <translation id="4383571725254449280">Performans günlüklerini yazdır</translation> <translation id="4445542136948522167">Fotoğraf çekmeyi durdur</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Kaydet</translation> <translation id="5320594929574852403">Sola doğru hareket ediyor</translation> <translation id="5444515100983837161">Dokümanın tüm kenarlarını çerçevenin içine yerleştirin. Dokümanla arka plan farklı renklere sahip olduğunda tarama daha iyi sonuç verir.</translation> +<translation id="5662366948659129155"><ph name="COUNT" />. sayfa taranıyor</translation> <translation id="5671277269877808209">Kare</translation> <translation id="5746169159649715125">PDF olarak kaydet</translation> <translation id="5753488212459587150">Uzman modunu etkinleştir</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Uzman modu</translation> <translation id="5860033963881614850">Kapalı</translation> <translation id="5869546221129391014">Tablo</translation> +<translation id="5903928279335207406">Sayfayı sil</translation> <translation id="5916664084637901428">Açık</translation> <translation id="5975083100439434680">Uzaklaştır</translation> <translation id="5976160379964388480">Diğerleri</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Fotoğraf olarak kaydet</translation> <translation id="8239780215768881278">Video anlık görüntüsü yakala</translation> <translation id="8261506727792406068">Sil</translation> +<translation id="839162370397157884">Sayfayı seç</translation> <translation id="8425673304802773841">Yatır</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb index 8fe1caab..812f998 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Нічого не записано</translation> +<translation id="169335673490251151">Сканувати додаткові сторінки</translation> <translation id="1838104802459806957">Нахилити вгору</translation> <translation id="1851169887664797861">Доступні додаткові елементи керування камерою</translation> <translation id="1851616744363735765">ПРИЗУПИНЕНО</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">Копіювати адресу посилання</translation> <translation id="4281620174117014503">Середня роздільна здатність</translation> <translation id="4329152592498422850">Перейти в режим квадратного фото</translation> +<translation id="4340659173795395806">Тепер ви можете створювати файли PDF із кількома сторінками</translation> <translation id="4383571725254449280">Друкувати журнали продуктивності</translation> <translation id="4445542136948522167">Припинити фотографувати</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> мегапікс.</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">Зберегти</translation> <translation id="5320594929574852403">Переміщення вліво</translation> <translation id="5444515100983837161">Розмістіть усі краї документа всередині рамки. Сканування працює найкраще, коли кольори документа й фону відрізняються.</translation> +<translation id="5662366948659129155">Сканування сторінки <ph name="COUNT" /></translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5746169159649715125">Зберегти у форматі PDF</translation> <translation id="5753488212459587150">Увімкнути режим експерта</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">Режим експерта</translation> <translation id="5860033963881614850">Вимк.</translation> <translation id="5869546221129391014">Сітка</translation> +<translation id="5903928279335207406">Видалити сторінку</translation> <translation id="5916664084637901428">Увімкнено</translation> <translation id="5975083100439434680">Зменшити масштаб</translation> <translation id="5976160379964388480">Інші</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">Зберегти як фото</translation> <translation id="8239780215768881278">Зробити знімок відео</translation> <translation id="8261506727792406068">Видалити</translation> +<translation id="839162370397157884">Вибрати сторінку</translation> <translation id="8425673304802773841">Нахилити донизу</translation> <translation id="8428213095426709021">Налаштування</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb index 25c8f23f9..1421ff4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb
@@ -81,6 +81,7 @@ <translation id="4269820728363426813">لنک کا پتہ کاپی کریں</translation> <translation id="4281620174117014503">متوسط ریزولیوشن</translation> <translation id="4329152592498422850">مربع تصویر لینے کی وضع پر سوئچ کریں</translation> +<translation id="4340659173795395806">اب آپ متعدد صفحات کا PDF بنا سکتے ہیں</translation> <translation id="4383571725254449280">کارکردگی کے لاگز پرنٹ کریں</translation> <translation id="4445542136948522167">تصویر لینا بند کریں</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> میگا پکسل</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index 94864496..7aaf4a2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -20,6 +20,7 @@ <translation id="1620510694547887537">相機</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">沒有記錄任何內容</translation> +<translation id="169335673490251151">掃描其他頁面</translation> <translation id="1838104802459806957">向上傾斜</translation> <translation id="1851169887664797861">已推出新的相機控制項</translation> <translation id="1851616744363735765">已暫停</translation> @@ -80,6 +81,7 @@ <translation id="4269820728363426813">複製連結網址</translation> <translation id="4281620174117014503">中解像度</translation> <translation id="4329152592498422850">切換至正方形相片拍攝模式</translation> +<translation id="4340659173795395806">您現可建立多頁 PDF</translation> <translation id="4383571725254449280">列印效能記錄</translation> <translation id="4445542136948522167">停止拍照</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> 百萬像素</translation> @@ -100,6 +102,7 @@ <translation id="5317780077021120954">儲存</translation> <translation id="5320594929574852403">向左移</translation> <translation id="5444515100983837161">將鏡頭對準文件,確認各邊都在方框內。如要獲得最佳的掃瞄效果,請將文件與背景的顏色區分起來。</translation> +<translation id="5662366948659129155">正在掃瞄第 <ph name="COUNT" /> 頁</translation> <translation id="5671277269877808209">正方形</translation> <translation id="5746169159649715125">另存為 PDF</translation> <translation id="5753488212459587150">啟用專業模式</translation> @@ -107,6 +110,7 @@ <translation id="5775960006311140197">專業模式</translation> <translation id="5860033963881614850">關閉</translation> <translation id="5869546221129391014">網格</translation> +<translation id="5903928279335207406">刪除頁面</translation> <translation id="5916664084637901428">開啟</translation> <translation id="5975083100439434680">縮小</translation> <translation id="5976160379964388480">其他</translation> @@ -158,6 +162,7 @@ <translation id="8167081290930651932">儲存為相片</translation> <translation id="8239780215768881278">拍攝影片快照</translation> <translation id="8261506727792406068">刪除</translation> +<translation id="839162370397157884">選取頁面</translation> <translation id="8425673304802773841">向下傾斜</translation> <translation id="8428213095426709021">設定</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/base/android/java/src/org/chromium/base/CommandLine.java b/base/android/java/src/org/chromium/base/CommandLine.java index 34a844a..1139dad 100644 --- a/base/android/java/src/org/chromium/base/CommandLine.java +++ b/base/android/java/src/org/chromium/base/CommandLine.java
@@ -5,7 +5,6 @@ package org.chromium.base; import android.text.TextUtils; -import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -146,7 +145,13 @@ */ public static void initFromFile(String file) { char[] buffer = readFileAsUtf8(file); - init(buffer == null ? null : tokenizeQuotedArguments(buffer)); + String[] tokenized = buffer == null ? null : tokenizeQuotedArguments(buffer); + init(tokenized); + // The file existed, which should never be the case under normal operation. + // Use a log message to help with debugging if it's the flags that are causing issues. + if (tokenized != null) { + Log.i(TAG, "COMMAND-LINE FLAGS: %s (from %s)", Arrays.toString(tokenized), file); + } } /** @@ -202,7 +207,7 @@ } if (arg != null) { if (currentQuote != noQuote) { - Log.w(TAG, "Unterminated quoted string: " + arg); + Log.w(TAG, "Unterminated quoted string: %s", arg); } args.add(arg.toString()); }
diff --git a/base/system/sys_info.h b/base/system/sys_info.h index a966ad6..2539bc8 100644 --- a/base/system/sys_info.h +++ b/base/system/sys_info.h
@@ -17,8 +17,19 @@ #include "base/time/time.h" #include "build/build_config.h" +#if BUILDFLAG(IS_MAC) +#include "base/feature_list.h" +#endif + namespace base { +#if BUILDFLAG(IS_MAC) +// When enabled, NumberOfProcessors() returns the number of physical processors +// instead of the number of logical processors if CPU security mitigations are +// enabled for the current process. +extern const Feature kNumberOfCoresWithCpuSecurityMitigation; +#endif + namespace debug { FORWARD_DECLARE_TEST(SystemMetricsTest, ParseMeminfo); } @@ -28,7 +39,11 @@ class BASE_EXPORT SysInfo { public: - // Return the number of logical processors/cores on the current machine. + // Returns the number of processors/cores available for the current + // application. This is typically the number of logical cores installed on the + // system, but could instead be the number of physical cores when + // SetIsCpuSecurityMitigationsEnabled() has been invoked to indicate that CPU + // security mitigations are enabled on Mac. static int NumberOfProcessors(); // Return the number of bytes of physical memory on the current machine. @@ -211,6 +226,13 @@ // On Desktop this returns true when memory <= 2GB. static bool IsLowEndDevice(); +#if BUILDFLAG(IS_MAC) + // Sets whether CPU security mitigations are enabled for the current process. + // This is used to control the behavior of NumberOfProcessors(), see comment + // on that method. + static void SetIsCpuSecurityMitigationsEnabled(bool is_enabled); +#endif + private: FRIEND_TEST_ALL_PREFIXES(SysInfoTest, AmountOfAvailablePhysicalMemory); FRIEND_TEST_ALL_PREFIXES(debug::SystemMetricsTest, ParseMeminfo);
diff --git a/base/system/sys_info_internal.h b/base/system/sys_info_internal.h index 36eb267..2134c86b 100644 --- a/base/system/sys_info_internal.h +++ b/base/system/sys_info_internal.h
@@ -5,6 +5,9 @@ #ifndef BASE_SYSTEM_SYS_INFO_INTERNAL_H_ #define BASE_SYSTEM_SYS_INFO_INTERNAL_H_ +#include "base/base_export.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + namespace base { namespace internal { @@ -25,6 +28,11 @@ const T value_; }; +// Exposed for testing. +BASE_EXPORT absl::optional<int> NumberOfPhysicalProcessors(); + +BASE_EXPORT int NumberOfProcessors(); + } // namespace internal } // namespace base
diff --git a/base/system/sys_info_posix.cc b/base/system/sys_info_posix.cc index c6c7502..be0014a96 100644 --- a/base/system/sys_info_posix.cc +++ b/base/system/sys_info_posix.cc
@@ -35,49 +35,16 @@ #include <sys/vfs.h> #endif +#if BUILDFLAG(IS_MAC) +#include <sys/sysctl.h> +#include "base/feature_list.h" +#include "base/system/sys_info_internal.h" +#endif + namespace { - -#if !BUILDFLAG(IS_OPENBSD) -int NumberOfProcessors() { - // sysconf returns the number of "logical" (not "physical") processors on both - // Mac and Linux. So we get the number of max available "logical" processors. - // - // Note that the number of "currently online" processors may be fewer than the - // returned value of NumberOfProcessors(). On some platforms, the kernel may - // make some processors offline intermittently, to save power when system - // loading is low. - // - // One common use case that needs to know the processor count is to create - // optimal number of threads for optimization. It should make plan according - // to the number of "max available" processors instead of "currently online" - // ones. The kernel should be smart enough to make all processors online when - // it has sufficient number of threads waiting to run. - long res = sysconf(_SC_NPROCESSORS_CONF); - if (res == -1) { - NOTREACHED(); - return 1; - } - - int num_cpus = static_cast<int>(res); - -#if BUILDFLAG(IS_LINUX) - // Restrict the CPU count based on the process's CPU affinity mask, if - // available. - cpu_set_t* cpu_set = CPU_ALLOC(num_cpus); - size_t cpu_set_size = CPU_ALLOC_SIZE(num_cpus); - int ret = sched_getaffinity(0, cpu_set_size, cpu_set); - if (ret == 0) { - num_cpus = CPU_COUNT_S(cpu_set_size, cpu_set); - } - CPU_FREE(cpu_set); -#endif // BUILDFLAG(IS_LINUX) - - return num_cpus; -} - -base::LazyInstance<base::internal::LazySysInfoValue<int, NumberOfProcessors>>:: - Leaky g_lazy_number_of_processors = LAZY_INSTANCE_INITIALIZER; -#endif // !BUILDFLAG(IS_OPENBSD) +#if BUILDFLAG(IS_MAC) +bool is_cpu_security_mitigation_enabled = false; +#endif uint64_t AmountOfVirtualMemory() { struct rlimit limit; @@ -144,9 +111,81 @@ namespace base { +namespace internal { + +int NumberOfProcessors() { +#if BUILDFLAG(IS_MAC) + // When CPU security mitigation is enabled, return number of "physical" + // cores and not the number of "logical" cores. CPU security mitigations + // disables hyper-threading for the current application, which effectively + // limits the number of concurrently executing threads to the number of + // physical cores. + if (base::FeatureList::IsEnabled( + base::kNumberOfCoresWithCpuSecurityMitigation) && + is_cpu_security_mitigation_enabled) { + absl::optional<int> number_of_physical_cores = + internal::NumberOfPhysicalProcessors(); + if (number_of_physical_cores.has_value()) + return number_of_physical_cores.value(); + } +#endif // BUILDFLAG(IS_MAC) + + // sysconf returns the number of "logical" (not "physical") processors on both + // Mac and Linux. So we get the number of max available "logical" processors. + // + // Note that the number of "currently online" processors may be fewer than the + // returned value of NumberOfProcessors(). On some platforms, the kernel may + // make some processors offline intermittently, to save power when system + // loading is low. + // + // One common use case that needs to know the processor count is to create + // optimal number of threads for optimization. It should make plan according + // to the number of "max available" processors instead of "currently online" + // ones. The kernel should be smart enough to make all processors online when + // it has sufficient number of threads waiting to run. + long res = sysconf(_SC_NPROCESSORS_CONF); + if (res == -1) { + NOTREACHED(); + return 1; + } + + int num_cpus = static_cast<int>(res); + +#if BUILDFLAG(IS_LINUX) + // Restrict the CPU count based on the process's CPU affinity mask, if + // available. + cpu_set_t* cpu_set = CPU_ALLOC(num_cpus); + size_t cpu_set_size = CPU_ALLOC_SIZE(num_cpus); + int ret = sched_getaffinity(0, cpu_set_size, cpu_set); + if (ret == 0) { + num_cpus = CPU_COUNT_S(cpu_set_size, cpu_set); + } + CPU_FREE(cpu_set); +#endif // BUILDFLAG(IS_LINUX) + + return num_cpus; +} + +#if BUILDFLAG(IS_MAC) +absl::optional<int> NumberOfPhysicalProcessors() { + uint32_t sysctl_value = 0; + size_t length = sizeof(sysctl_value); + + if (sysctlbyname("hw.physicalcpu_max", &sysctl_value, &length, nullptr, 0) == + 0) { + return static_cast<int>(sysctl_value); + } + + return absl::nullopt; +} +#endif // BUILDFLAG(IS_LINUX) + +} // namespace internal + #if !BUILDFLAG(IS_OPENBSD) int SysInfo::NumberOfProcessors() { - return g_lazy_number_of_processors.Get().value(); + static int number_of_processors = internal::NumberOfProcessors(); + return number_of_processors; } #endif // !BUILDFLAG(IS_OPENBSD) @@ -250,4 +289,15 @@ return checked_cast<size_t>(getpagesize()); } -} // namespace base +#if BUILDFLAG(IS_MAC) +const BASE_EXPORT base::Feature kNumberOfCoresWithCpuSecurityMitigation = { + "NumberOfCoresWithCpuSecurityMitigation", + base::FEATURE_DISABLED_BY_DEFAULT}; + +void SysInfo::SetIsCpuSecurityMitigationsEnabled(bool is_enabled) { + is_cpu_security_mitigation_enabled = is_enabled; +} + +#endif // BUILDFLAG(IS_MAC) + +} // namespace base \ No newline at end of file
diff --git a/base/system/sys_info_unittest.cc b/base/system/sys_info_unittest.cc index e1c4342..d461e8f 100644 --- a/base/system/sys_info_unittest.cc +++ b/base/system/sys_info_unittest.cc
@@ -40,6 +40,11 @@ #include "base/win/wmi.h" #endif // BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_MAC) +#include "base/system/sys_info_internal.h" +#include "base/test/scoped_feature_list.h" +#endif // BUILDFLAG(IS_MAC) + namespace base { #if BUILDFLAG(IS_ANDROID) @@ -56,6 +61,22 @@ EXPECT_GE(SysInfo::NumberOfProcessors(), 1); } +#if BUILDFLAG(IS_MAC) +TEST_F(SysInfoTest, NumProcsWithSecurityMitigationEnabled) { + // Verify that the number of number of available processors available when CPU + // security mitigation is enabled is the number of available "physical" + // processors. + test::ScopedFeatureList feature_list_; + feature_list_.InitAndEnableFeature(kNumberOfCoresWithCpuSecurityMitigation); + SysInfo::SetIsCpuSecurityMitigationsEnabled(true); + EXPECT_EQ(internal::NumberOfProcessors(), + internal::NumberOfPhysicalProcessors()); + + // Reset to default value + SysInfo::SetIsCpuSecurityMitigationsEnabled(false); +} +#endif // BUILDFLAG(IS_MAC) + TEST_F(SysInfoTest, AmountOfMem) { // We aren't actually testing that it's correct, just that it's sane. EXPECT_GT(SysInfo::AmountOfPhysicalMemory(), 0u);
diff --git a/chrome/VERSION b/chrome/VERSION index bc354e4..e0728034 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=108 MINOR=0 -BUILD=5310 +BUILD=5311 PATCH=0
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 4e48749..8db21be 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -332,6 +332,7 @@ <translation id="8453117565092476964">የጫኚው መዝገብ ተበላሽቷል ወይም ትክክል አይደለም። እባክዎ Chromiumን እንደገና ያውርዱ።</translation> <translation id="8463672209299734063">ከተፈለገ፦ የምርመራ እና የአጠቃቀም ውሂብ ወደ Google በራስ-ሰር በመላክ የChromiumOS ባህሪያትን እና አፈጻጸምን እንዲሻሻል ያግዙ።</translation> <translation id="8493179195440786826">Chromium ጊዜው አልፎበታል</translation> +<translation id="8522220489792889625">እንደ አስፈላጊነቱ፣ Chromium በንቃት የማይጠቀሟቸውን ትሮች ማህደረ ትውስታ መልሶ ይወስዳል። ይህንን በማንኛውም ጊዜ በቅንብሮች ውስጥ መቀየር ይችላሉ።</translation> <translation id="8550334526674375523">ይህ የስራ መገለጫ ከግል መገለጫዎ ሙሉ ለሙሉ የተለየ ነው።</translation> <translation id="8558383651099478961">የእርስዎ ወላጅ ለChromium «የጣቢያዎች፣ መተግበሪያዎች እና ቅጥያዎች ፈቃዶች»ን አጥፍተዋል። ይህን <ph name="EXTENSION_TYPE_PARAMETER" /> ማከል አይፈቀድም።</translation> <translation id="8561285221328166383">የወደፊቱን የChromium ዝመኔዎችን ለማግኘት፣ macOS 10.13 ወይም ከዚያ በኋላ ያለው ያስፈልግዎታል። ይህ ኮምፒተር macOS 10.12 እየተጠቀመ ነው።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index 9e44e7a..ab60f96a 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -298,6 +298,7 @@ <translation id="7682601070171973634">يعمل Chromium على استكشاف ميزات جديدة تتيح للمواقع الإلكترونية توفير تجربة التصفّح نفسها باستخدام قدر أقل من البيانات.</translation> <translation id="7686590090926151193">Chromium ليس متصفحك التلقائي.</translation> <translation id="7689606757190482937">يمكنك مزامنة Chromium وتخصيصه على جميع أجهزتك.</translation> +<translation id="7714577916146996629">عند تفعيل هذا الإعداد، يستعيد Chromium الذاكرة من علامات التبويب غير النشطة. يؤدي هذا إلى توفير بعض موارد جهاز الكمبيوتر لتنفيذ مهام أخرى والحفاظ على سرعة الأداء في Chromium. وتظهر علامات التبويب غير النشطة فارغة وتتم إعادة تحميلها تلقائيًا عند النقر عليها. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /> أو <ph name="BEGIN_LINK_2" />إرسال ملاحظات<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">سيؤدي هذا إلى حذف بيانات التصفح من هذا الجهاز. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium كـ <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">تعذر على أداة المثبِّت إنشاء دليل مؤقت. يُرجى التحقق من وجود مساحة خالية على القرص وتوفر الإذن اللازم لتثبيت البرنامج.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -327,6 +328,7 @@ <translation id="8453117565092476964">أرشيف أداة التثبيت تالف أو غير صالح. يُرجى إعادة تنزيل Chromium.</translation> <translation id="8463672209299734063">إجراء اختياري: يمكنك المساعدة في تحسين ميزات نظام التشغيل Chromium وأدائه من خلال إرسال بيانات التشخيص والاستخدام تلقائيًا إلى Google.</translation> <translation id="8493179195440786826">إصدار Chromium قديم</translation> +<translation id="8522220489792889625">حسب الحاجة، يستعيد Chromium الذاكرة من علامات التبويب غير النشطة. يمكنك تعديل ذلك في أي وقت من خلال الإعدادات.</translation> <translation id="8550334526674375523">هذا الملف الشخصي للعمل منفصِل تمامًا عن ملفك الشخصي.</translation> <translation id="8558383651099478961">أوقفَ أحد والدَيك "أذونات المواقع الإلكترونية والتطبيقات والإضافات" لمتصفِّح Chromium. ولا يمكن تثبيت <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8561285221328166383">للحصول على تحديثات Chromium في المستقبل، يجب استخدام جهاز يعمل بنظام التشغيل macOS 10.13 أو إصدار أحدث. يعمل هذا الكمبيوتر بنظام التشغيل macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index 377d580..8c428b30 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Chromiumএ নতুন সুবিধাসমূহ অন্বেষণ কৰি আছে, যিবোৰে ছাইটসমূহক আপোনাৰ ডেটা কমকৈ ব্যৱহাৰ কৰি একেই ব্ৰাউজিঙৰ অভিজ্ঞতা প্ৰদান কৰিবলৈ দিয়ে</translation> <translation id="7686590090926151193">Chromium আপোনাৰ ডিফ'ল্ট ব্ৰাউজাৰ নহয়</translation> <translation id="7689606757190482937">আপোনাৰ সমগ্ৰ ডিভাইচতে Chromiumক ছিংক কৰি ব্যক্তিকৃত কৰক</translation> +<translation id="7714577916146996629">অন কৰা থকিলে, Chromiumএ আপুনি সক্ৰিয়ভাৱে ব্যৱহাৰ কৰি নথকা টেবসমূহৰ পৰা মেম’ৰী পুনৰুদ্ধাৰ কৰে। ই আপোনাৰ কম্পিউটাৰৰ সম্পদসমূহ আন কাৰ্যসমূহৰ বাবে খালী কৰে আৰু Chromiumক দ্ৰুত কৰি ৰাখে। নিষ্ক্ৰিয় টেবসমূহ খালী হৈ থকা দেখা পোৱা যায় আৰু আপুনি সেইসমূহত ক্লিক কৰিলে সেইসমূহ স্বয়ংক্ৰিয়ভাৱে পুনৰ ল’ড হয়। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /> অথবা <ph name="BEGIN_LINK_2" />মতামত পঠিয়াওক<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">এই কাৰ্যই এই ডিভাইচটোৰ পৰা আপোনাৰ ব্ৰাউজিং ডেটা মচি পেলাব। আপোনাৰ ডেটা পাছত পুনৰুদ্ধাৰ কৰিবলৈ Chromiumত <ph name="USER_EMAIL" /> হিচাপে ছাইন ইন কৰক।</translation> <translation id="7747138024166251722">ইনষ্টলাৰটোৱে কোনো অস্থায়ী ডাইৰেক্ট'ৰী সৃষ্টি কৰিব নোৱাৰিলে। ছফ্টৱেৰ ইনষ্টল কৰিবলৈ অনুগ্ৰহ কৰি খালী ঠাই আৰু লগতে অনুমতি আছেনে নাই পৰীক্ষা কৰক।</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -333,6 +334,7 @@ <translation id="8453117565092476964">ইনষ্টলাৰ আৰ্কাইভটো ব্যৱহাৰযোগ্য নহয় বা অমান্য। অনুগ্ৰহ কৰি Chromium আকৌ ডাউনল’ড কৰক।</translation> <translation id="8463672209299734063">ঐচ্ছিক: Googleলৈ স্বয়ংক্ৰিয়ভাৱে ডায়গন’ষ্টিক আৰু ব্যৱহাৰৰ ডেটা পঠিয়াই ChromiumOSৰ সুবিধাসমূহ আৰু কাৰ্যক্ষমতা উন্নত কৰাত সহায় কৰক।</translation> <translation id="8493179195440786826">Chromiumটো অতি পুৰণি</translation> +<translation id="8522220489792889625">প্ৰয়োজন অনুসৰি, Chromiumএ আপুনি সক্ৰিয়ভাৱে ব্যৱহাৰ কৰি নথকা টেবসমূহৰ পৰা মেম’ৰী পুনৰুদ্ধাৰ কৰে। আপুনি যিকোনো সময়তে ছেটিঙত এইটো সলনি কৰিব পাৰে।</translation> <translation id="8550334526674375523">এই কৰ্মস্থানৰ প্ৰ’ফাইলটো আপোনাৰ ব্যক্তিগত প্ৰ’ফাইলৰ পৰা সম্পূৰ্ণৰূপে পৃথক।</translation> <translation id="8558383651099478961">আপোনাৰ অভিভাৱকে Chromiumত "ছাইট, এপ্ আৰু এক্সটেনশ্বনসমূহৰ বাবে অনুমতি" অফ কৰিছে। এই <ph name="EXTENSION_TYPE_PARAMETER" />টো যোগ দিয়াৰ অনুমতি নাই।</translation> <translation id="8561285221328166383">Chromiumৰ ভৱিষ্যতৰ আপডে’টসমূহ পাবলৈ আপোনাক macOS 10.13 অথবা তাৰ পাছৰ সংস্কৰণৰ আৱশ্যক হ’ব। এই কম্পিউটাৰটোৱে macOS 10.12 ব্যৱহাৰ কৰি আছে।</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index fb97a2d9..c830ae651 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -296,6 +296,7 @@ <translation id="7682601070171973634">Chromium проучва нови функции, с чиято помощ сайтовете осигуряват същата практическа работа при сърфиране, използвайки по-малко данни</translation> <translation id="7686590090926151193">Chromium не е браузърът ви по подразбиране</translation> <translation id="7689606757190482937">Синхронизирайте и персонализирайте Chromium на всичките си устройства</translation> +<translation id="7714577916146996629">Когато настройката е включена, Chromium освобождава паметта от разделите, които не използвате активно. Така ресурсите на компютъра ви са свободни за други задачи и Chromium не се забавя. Неактивните раздели са празни и се презареждат автоматично, когато кликнете върху тях. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /> или <ph name="BEGIN_LINK_2" />изпратете отзиви<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Данните за сърфирането ви ще се изтрият от това устройство. За да ги извлечете по-късно, влезте в Chromium като <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Инсталационната програма не можа да създаде временна директория. Моля, проверете дали има свободно дисково пространство и разрешение за инсталиране на софтуер.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation> @@ -325,6 +326,7 @@ <translation id="8453117565092476964">Архивът на инсталационната програма е повреден или невалиден. Моля, изтеглете отново Chromium.</translation> <translation id="8463672209299734063">По избор: Помогнете за подобряването на функциите и ефективността на Chromium OS, като автоматично изпращате до Google данни за диагностиката и употребата.</translation> <translation id="8493179195440786826">Chromium не е актуален</translation> +<translation id="8522220489792889625">Ако е необходимо, Chromium освобождава паметта от разделите, които не използвате активно. Можете да промените това по всяко време от настройките.</translation> <translation id="8550334526674375523">Този служебен потребителски профил е изцяло отделен от личния ви.</translation> <translation id="8558383651099478961">Някой от родителите ви е изключил разрешенията за сайтове, приложения и разширения за Chromium. Добавянето на <ph name="EXTENSION_TYPE_PARAMETER" /> не е разрешено.</translation> <translation id="8561285221328166383">За да получавате бъдещи актуализации на Chromium, трябва да използвате macOS 10.13 или по-нова версия. Компютърът ви работи с macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index b93aa7ab..df260b4 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -302,6 +302,7 @@ <translation id="7682601070171973634">Chromium està explorant noves funcions que permetin als llocs web oferir la mateixa experiència de navegació utilitzant menys dades</translation> <translation id="7686590090926151193">Chromium no és el navegador predeterminat</translation> <translation id="7689606757190482937">Sincronitza i personalitza Chromium en tots els teus dispositius</translation> +<translation id="7714577916146996629">Quan aquesta opció està activada, Chromium es reapropia de la memòria de les pestanyes que no estàs utilitzant activament. Així, s'alliberen els recursos de l'ordinador per a altres tasques i es manté l'agilitat de Chromium. Les pestanyes inactives es mostren buides i es tornen a carregar automàticament quan hi fas clic. <ph name="BEGIN_LINK" />Obtén més informació<ph name="END_LINK" /> o <ph name="BEGIN_LINK_2" />envia suggeriments<ph name="END_LINK_2" />.</translation> <translation id="7745317241717453663">Amb aquesta acció, se suprimiran les teves dades de navegació d'aquest dispositiu. Per recuperar les teves dades més endavant, inicia la sessió a Chromium com a <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">L'instal·lador no ha pogut crear un directori temporal. Comprova que hi ha espai lliure al disc i que tens permís per instal·lar el programari.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb index dcb91c4..5eba2a1 100644 --- a/chrome/app/resources/chromium_strings_cy.xtb +++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Mae Chromium yn archwilio nodweddion newydd sy'n caniatáu i wefannau ddarparu'r un profiad pori drwy ddefnyddio llai o'ch data</translation> <translation id="7686590090926151193">Nid Chromium yw eich porwr diofyn</translation> <translation id="7689606757190482937">Cysoni â phersonoleiddio Chromium ar draws eich dyfeisiau</translation> +<translation id="7714577916146996629">Pan fydd ymlaen, mae Chromium yn adfer cof o dabiau nad ydych yn eu defnyddio'n weithredol. Mae hyn yn rhyddhau adnoddau eich cyfrifiadur ar gyfer tasgau eraill ac yn cadw Chromium yn gyflym. Mae tabiau anweithredol yn ymddangos yn wag ac yn ail-lwytho'n awtomatig pan fyddwch yn clicio arnynt. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /> neu <ph name="BEGIN_LINK_2" />anfon adborth<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Bydd hyn yn dileu eich data pori o'r ddyfais hon. I adfer eich data yn nes ymlaen, mewngofnodwch i Chromium fel <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Ni allai'r gosodwr greu cyfeiriadur dros dro. Gwnewch yn siŵr bod gennych ddigon o le storio ar gael a bod gennych y caniatâd i osod meddalwedd.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -333,6 +334,7 @@ <translation id="8453117565092476964">Mae'r archif gosodwr wedi'i lygru neu'n annilys. Lawrlwythwch Chromium eto.</translation> <translation id="8463672209299734063">Dewisol: Helpu i wella nodweddion a pherfformiad ChromiumOS drwy anfon data diagnostig a defnydd at Google yn awtomatig.</translation> <translation id="8493179195440786826">Mae Chromium yn Hen</translation> +<translation id="8522220489792889625">Yn ôl yr angen, mae Chromium yn adfer cof o dabiau nad ydych yn eu defnyddio'n weithredol. Gallwch newid hyn unrhyw bryd yn y gosodiadau.</translation> <translation id="8550334526674375523">Mae'r proffil gwaith hwn yn hollol ar wahân i'ch proffil personol.</translation> <translation id="8558383651099478961">Mae dy riant wedi diffodd "Caniatadau ar gyfer gwefannau, apiau ac estyniadau" ar gyfer Chromium. Ni chaniateir ychwanegu'r <ph name="EXTENSION_TYPE_PARAMETER" /> hwn.</translation> <translation id="8561285221328166383">I gael diweddariadau Chromium yn y dyfodol, bydd angen macOS 10.13 neu'n hwyrach arnoch. Mae'r cyfrifiadur hwn yn defnyddio macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index f6ed1e2..63524d6 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -302,6 +302,7 @@ <translation id="7682601070171973634">Chromium afprøver nye funktioner, der giver websites mulighed for at levere den samme browseroplevelse med færre af dine data</translation> <translation id="7686590090926151193">Chromium er ikke din standardbrowser</translation> <translation id="7689606757190482937">Synkroniser og tilpas Chromium på alle dine enheder</translation> +<translation id="7714577916146996629">Når indstillingen er aktiveret, bruger Chromium hukommelse fra faner, du ikke aktivt bruger. Dette frigør din computers ressourcer til andre opgaver og sørger for, at Chromium er hurtigt. Inaktive faner fremstår som tomme og genindlæses automatisk, når du klikker på dem. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" />, eller <ph name="BEGIN_LINK_2" />send feedback<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Denne handling sletter dine browserdata på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chromium som <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Installationsprogrammet kunne ikke oprette en midlertidig mappe. Tjek, om der er tilstrækkelig diskplads, og om der er tilladelse til at installere software.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation> @@ -331,6 +332,7 @@ <translation id="8453117565092476964">Installationsarkivet er beskadiget eller ugyldigt. Download Chromium igen.</translation> <translation id="8463672209299734063">Valgfrit: Vær med til at forbedre funktioner og ydeevne i Chromium OS ved automatisk at sende diagnostik og brugsdata til Google.</translation> <translation id="8493179195440786826">Chromium er forældet</translation> +<translation id="8522220489792889625">Når det er nødvendigt, bruger Chromium hukommelse fra faner, du ikke aktivt bruger. Du kan altid ændre dette under Indstillinger.</translation> <translation id="8550334526674375523">Denne arbejdsprofil er totalt adskilt fra din personlige profile.</translation> <translation id="8558383651099478961">Din forælder har deaktiveret "Tilladelser til websites, apps og udvidelser" for Chromium. Det er ikke tilladt at tilføje denne <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8561285221328166383">Hvis du vil have fremtidige Chromium-opdateringer, skal du have macOS 10.13 eller nyere. Denne computer anvender macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 6b6d6e3..e642b786 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -301,6 +301,7 @@ <translation id="7682601070171973634">In Chromium werden neue Funktionen ausprobiert, mit denen Websites bei gleichbleibender Nutzererfahrung beim Surfen weniger Nutzerdaten verwenden</translation> <translation id="7686590090926151193">Chromium ist nicht als dein Standardbrowser festgelegt</translation> <translation id="7689606757190482937">Chromium wird auf allen deinen Geräten synchronisiert und personalisiert</translation> +<translation id="7714577916146996629">Wenn diese Option aktiviert ist, gibt Chromium den für Tabs genutzten Arbeitsspeicher wieder frei, wenn du sie gerade nicht aktiv verwendest. Dadurch werden die Ressourcen deines Computers für andere Aufgaben frei und Chromium wird schneller. Inaktive Tabs erscheinen leer und werden automatisch aktualisiert, wenn du sie anklickst. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /> oder <ph name="BEGIN_LINK_2" />Feedback senden<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Dadurch werden deine Browserdaten von diesem Gerät gelöscht. Wenn du deine Daten später abrufen möchtest, melde dich als <ph name="USER_EMAIL" /> in Chromium an.</translation> <translation id="7747138024166251722">Das Installationsprogramm konnte kein temporäres Verzeichnis erstellen. Überprüfe, ob freier Speicherplatz und die Rechte zum Installieren von Software vorhanden sind.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 66f3440..9f58407 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -63,6 +63,7 @@ <translation id="2583187216237139145">Any Chromium data that is generated during the use of this profile (such as the creation of bookmarks, history, passwords and other settings) can be removed by the work profile administrator. <ph name="LEARN_MORE" /></translation> <translation id="2648074677641340862">An operating system error occurred during installation. Please download Chromium again.</translation> <translation id="2661879430930417727">If you share a device, friends and family can browse separately and set up Chromium just the way they want</translation> +<translation id="2669853942967761236">Chromium blocked this archive file because it may hide malware</translation> <translation id="268602741124540128">Welcome to Chromium, <ph name="ACCOUNT_FIRST_NAME" /></translation> <translation id="2711502716910134313">Chromium Tab</translation> <translation id="2718390899429598676">For added security, Chromium will encrypt your data.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index e350f4c2..a2f05c4 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -333,6 +333,7 @@ <translation id="8453117565092476964">El archivo de instalación está dañado o no es válido. Vuelve a descargar Chromium.</translation> <translation id="8463672209299734063">Opcional: Ayuda a mejorar las funciones y el rendimiento de ChromiumOS enviando automáticamente datos de diagnóstico y de uso a Google.</translation> <translation id="8493179195440786826">Chromium no está actualizado</translation> +<translation id="8522220489792889625">Cuando es necesario, Chromium recupera la memoria de las pestañas que no estás usando activamente. Puedes cambiar esta opción en cualquier momento en la configuración.</translation> <translation id="8550334526674375523">Este perfil de trabajo es completamente independiente de tu perfil personal.</translation> <translation id="8558383651099478961">Tus padres han desactivado "Permisos de sitios, aplicaciones y extensiones" en Chromium. No se permite añadir <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8561285221328166383">Para recibir futuras actualizaciones de Chromium, necesitarás macOS 10.13 o una versión posterior. Este ordenador utiliza macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index 0e51415..f8757bf0b 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -330,6 +330,7 @@ <translation id="8453117565092476964">Installeri arhiiv on rikutud või kehtetu. Laadige Chromium uuesti alla.</translation> <translation id="8463672209299734063">Valikuline. Aidake Chromium OS-i funktsioone ning toimivust täiustada, saates Google'ile automaatselt diagnostika- ja kasutusandmeid.</translation> <translation id="8493179195440786826">Chromium on aegunud</translation> +<translation id="8522220489792889625">Vajaduse korral võtab Chromium mälu tagasi vahelehtedelt, mida te aktiivselt ei kasuta. Saate seda menüüs Seaded alati muuta.</translation> <translation id="8550334526674375523">See tööprofiil on teie isiklikust profiilist täielikult eraldi.</translation> <translation id="8558383651099478961">Sinu vanem lülitas valiku „Saitide, rakenduste ja laienduste load” Chromiumi puhul välja. Laienduse <ph name="EXTENSION_TYPE_PARAMETER" /> lubamine on keelatud.</translation> <translation id="8561285221328166383">Chromiumi tulevaste värskenduste saamiseks on teil vaja operatsioonisüsteemi macOS 10.13 või uuemat versiooni. See arvuti kasutab operatsioonisüsteemi macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 6c6cb7b30..946059b 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -303,6 +303,7 @@ <translation id="7682601070171973634">Chromium eginbide berriak probatzen ari da; haiei esker, datu gutxiago erabilita sarea modu berean arakatzeko aukera eskainiko dute webguneek</translation> <translation id="7686590090926151193">Chromium ez da zure arakatzaile lehenetsia</translation> <translation id="7689606757190482937">Sinkronizatu eta pertsonalizatu Chromium gailu guzietan</translation> +<translation id="7714577916146996629">Aktibatuta dagoenean, aktiboki erabiltzen ari ez zaren fitxen memoria berreskuratzen du Chromium-ek, behar den moduan. Horrela, ordenagailuaren baliabideak libre geratzen dira beste zeregin batzuetarako, eta Chromium-ek abiadura egokian funtzionatzen jarraitzen du. Inaktibo dauden fitxak hutsik agertzen dira eta automatikoki kargatzen dira berriro sakatzen dituzunean. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /> edo <ph name="BEGIN_LINK_2" />bidali oharrak<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Gailuko arakatze-datuak ezabatuko dira. Geroago datuak eskuratu nahi izanez gero, hasi saioa Chromium-en <ph name="USER_EMAIL" /> gisa.</translation> <translation id="7747138024166251722">Instalatzaileak ezin izan du sortu behin behineko direktoriorik. Softwarea instalatzeko, egiaztatu diskoan duzun espazio librea eta baimena.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 9ca846f..1dc9b54 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -300,6 +300,7 @@ <translation id="7682601070171973634">Chromium ویژگیهای جدیدی را کاوش میکند که به سایتها اجازه میدهد با مصرف داده کمتر، همان تجربه مرور را ارائه دهند</translation> <translation id="7686590090926151193">Chromium مرورگر پیشفرض شما نیست</translation> <translation id="7689606757190482937">Chromium را در همه دستگاههایتان همگامسازی و شخصیسازی کنید</translation> +<translation id="7714577916146996629">وقتی روشن باشد، Chromium حافظه را از برگههایی که بهطور فعال از آنها استفاده نمیکنید بازپس میگیرد. این کار منابع رایانه را برای وظایف دیگر آزاد میکند و موجب میشود Chromium همچنان با سرعت بالا اجرا شود. برگههای غیرفعال خالی بهنظر میرسند و وقتی روی آنها کلیک کنید بهطور خودکار مجدداً بار میشوند. <ph name="BEGIN_LINK" />اطلاعات بیشتری کسب کنید<ph name="END_LINK" /> یا <ph name="BEGIN_LINK_2" />بازخورد ارسال کنید<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">این کار دادههای محصول مرورتان را از این دستگاه حذف میکند. برای بازیابی دادههایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> به سیستم Chromium وارد شوید.</translation> <translation id="7747138024166251722">نصبکننده نتوانست دایرکتوری موقت ایجاد کند. لطفاً فضای خالی دیسک و اجازه نصب نرمافزار را بررسی کنید.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -329,6 +330,7 @@ <translation id="8453117565092476964">بایگانی نصبکننده خراب یا نامعتبر است. لطفاً Chromium را دوباره را بارگیری کنید.</translation> <translation id="8463672209299734063">اختیاری: با ارسال خودکار دادههای استفاده و عیبیابی به Google، به بهبود ویژگیها و عملکرد ChromiumOS کمک کنید.</translation> <translation id="8493179195440786826">نسخه Chromium قدیمی است</translation> +<translation id="8522220489792889625">درصورت نیاز، Chromium حافظه را از برگههایی که بهطور فعال از آنها استفاده نمیکنید بازپس میگیرد. هرزمان خواستید میتوانید آن را در تنظیمات تغییر دهید.</translation> <translation id="8550334526674375523">این نمایه کاری کاملاً مجزا از نمایه شخصیتان است.</translation> <translation id="8558383651099478961">ولیتان «اجازههای مربوط به سایتها، برنامهها، و افزونهها» را برای Chromium خاموش کرده است. افزودن این <ph name="EXTENSION_TYPE_PARAMETER" /> مجاز نیست.</translation> <translation id="8561285221328166383">برای دریافت بهروزرسانیهای آتی Chromium، باید macOS نسخه ۱۰.۱۳ یا بالاتر داشته باشید. این رایانه از macOS نسخه ۱۰.۱۲ استفاده میکند.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 4b54623..08f898a 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -302,6 +302,7 @@ <translation id="7682601070171973634">Chromium kokeilee uusia ominaisuuksia, joiden avulla sivustot voivat tarjota saman selauskokemuksen vähemmällä datalla</translation> <translation id="7686590090926151193">Chromium ei ole oletusselain.</translation> <translation id="7689606757190482937">Voit synkronoida Chromiumin ja tehdä siitä yksilöllisemmän kaikilla laitteilla.</translation> +<translation id="7714577916146996629">Kun asetus on päällä, Chromium vapauttaa muistia välilehdiltä, joita et käytä aktiivisesti. Näin tietokoneesi resurssit vapautuvat muihin tehtäviin ja Chromium pysyy nopeana. Ei-aktiiviset välilehdet näyttävät tyhjiltä ja latautuvat automaattisesti uudelleen, kun klikkaat niitä. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /> tai <ph name="BEGIN_LINK_2" />lähetä palautetta<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Tämä poistaa selaustiedot pysyvästi laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromiumiin käyttäjänä <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Asennusohjelma ei pystynyt luomaan väliaikaista hakemistoa. Tarkista, että käytettävissä on riittävästi levytilaa ja että sinulla on oikeus asentaa ohjelmia.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index cda039f..ae8ad8bd 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Nag-e-explore ang Chromium ng mga bagong feature na nagbibigay-daan sa mga site na ihatid ang parehong karanasan sa pag-browse nang hindi gaanong gumagamit ng iyong data</translation> <translation id="7686590090926151193">Hindi Chromium ang iyong default na browser</translation> <translation id="7689606757190482937">I-sync at i-personalize ang Chromium sa lahat ng iyong device</translation> +<translation id="7714577916146996629">Kapag naka-on, binabawi ng Chromium ang memory mula sa mga tab na hindi mo aktibong ginagamit. Binabakante nito ang mga resource ng iyong computer para sa iba pang gawain at pinapanatili nitong mabilis ang Chromium. Mukhang walang laman ang mga hindi aktibong tab at awtomatikong nagre-reload ang mga ito kapag na-click mo ang mga ito. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /> o <ph name="BEGIN_LINK_2" />magpadala ng feedback<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Ide-delete nito ang iyong data sa pag-browse sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chromium bilang <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Hindi makalikha ng pansamantalang direktoryo ang installer. Paki-suri para sa puwang sa disk na walang laman at pahintulot upang i-install ang software.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 4f5318c..b56e5b6 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Chromium એવી સુવિધાઓની શોધખોળ કરી રહ્યું છે જે તમારા ડેટાના મર્યાદિત ઉપયોગ વડે પણ સાઇટને બ્રાઉઝિંગનો પહેલાં જેવો જ અનુભવ પ્રદાન કરી શકે</translation> <translation id="7686590090926151193">Chromium તમારું ડિફૉલ્ટ બ્રાઉઝર નથી</translation> <translation id="7689606757190482937">તમારા બધા ડિવાઇસ પર Chromiumને સિંક કરો અને મનગમતું બનાવો</translation> +<translation id="7714577916146996629">જ્યારે ચાલુ હોય, તમે જે ટૅબનો સક્રિય રીતે ઉપયોગ ન કરતા હો, Chromium એ ટૅબમાંથી મેમરી પાછી લઈ લે છે. આ તમારા કમ્પ્યુટરના સંસાધનોને અન્ય કાર્યો માટે ઉપલબ્ધ કરે છે અને Chromiumની કામગીરી ઝડપી રાખે છે. નિષ્ક્રિય ટૅબ ખાલી દેખાય છે અને જ્યારે તમે તેના પર ક્લિક કરો, ત્યારે તે ઑટોમૅટિક રીતે ફરીથી લોડ થાય છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /> અથવા <ph name="BEGIN_LINK_2" />પ્રતિસાદ મોકલો<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">આ તમારા બ્રાઉઝિંગ ડેટાને આ ડિવાઇસમાંથી ડિલીટ કરશે. પછીથી તમારો ડેટા ફરીથી મેળવવા માટે, Chromium માં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation> <translation id="7747138024166251722">ઇન્સ્ટૉલર અસ્થાયી ડિરેક્ટરી બનાવી શક્યું નથી. કૃપા કરીને ખાલી ડિસ્ક સ્પેસ માટે અને સૉફ્ટવેર ઇન્સ્ટૉલ કરવાની પરવાનગી માટે તપાસો.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -333,6 +334,7 @@ <translation id="8453117565092476964">ઇન્સ્ટૉલર આર્કાઇવ ખરાબ અથવા અમાન્ય છે. કૃપા કરીને Chromium ફરીથી ડાઉનલોડ કરો.</translation> <translation id="8463672209299734063">વૈકલ્પિક: Googleને ડાયગ્નોસ્ટિક અને વપરાશનો ડેટા ઑટોમૅટિક રીતે મોકલીને ChromiumOSની સુવિધાઓ અને કાર્યપ્રદર્શનને બહેતર બનાવવામાં સહાય કરો.</translation> <translation id="8493179195440786826">Chromium જૂનું થઈ ગયું છે</translation> +<translation id="8522220489792889625">આવશ્યકતા મુજબ, તમે જે ટૅબનો સક્રિય રીતે ઉપયોગ ન કરતા હો, Chromium એ ટૅબમાંથી મેમરી પાછી લઈ લે છે. સેટિંગમાં તમે આને કોઈપણ સમયે બદલી શકો છો.</translation> <translation id="8550334526674375523">ઑફિસની આ પ્રોફાઇલ તમારી વ્યક્તિગત પ્રોફાઇલથી સાવ અલગ છે.</translation> <translation id="8558383651099478961">તમારા માતાપિતાએ Chromium માટે "સાઇટ, ઍપ અને એક્સ્ટેન્શન માટેની પરવાનગીઓ" બંધ કરી છે. આ <ph name="EXTENSION_TYPE_PARAMETER" /> ઉમેરવાની મંજૂરી નથી.</translation> <translation id="8561285221328166383">Chromiumની ભાવિ અપડેટ મેળવવા માટે, તમારે macOS 10.13 કે તે પછીના વર્ઝન પર અપડેટ કરવું જરૂરી રહેશે. આ કમ્પ્યુટર macOS 10.12નો ઉપયોગ કરે છે.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 963d977..aa28b812 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -302,6 +302,7 @@ <translation id="7682601070171973634">Chromium पर ऐसी नई सुविधाएं एक्सप्लोर की जा रही हैं जिनसे साइटें, उपयोगकर्ता का कम डेटा इस्तेमाल करके उन्हें पहले जैसा अनुभव दे सकती हैं</translation> <translation id="7686590090926151193">क्रोमियम आपका डिफ़ॉल्ट ब्राउज़र नहीं है</translation> <translation id="7689606757190482937">क्रोमियम को अपने सभी डिवाइस पर सिंक करें और मनमुताबिक बनाएं</translation> +<translation id="7714577916146996629">इस सेटिंग के चालू होने पर, Chromium उन टैब की मेमोरी को रिकवर करता है जिन्हें आपने पिछले कुछ समय से इस्तेमाल नहीं किया है. इससे आपके कंप्यूटर के रिसॉर्स, अन्य कामों में इस्तेमाल किए जा सकते हैं. साथ ही, Chromium तेज़ी से काम करता रहता है. इनएक्टिव टैब खाली दिखते हैं. इन पर क्लिक करने के बाद, ये अपने-आप फिर से लोड हो जाते हैं. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /> या <ph name="BEGIN_LINK_2" />सुझाव, शिकायत या राय भेजें<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">ऐसा करने से इस डिवाइस से आपका ब्राउज़िंग डेटा मिट जाएगा. बाद में अपना डेटा पाने के लिए, Chromium में <ph name="USER_EMAIL" /> के रूप में साइन इन करें.</translation> <translation id="7747138024166251722">इंस्टॉलर अस्थायी डायरेक्टरी नहीं बना सका. कृपया डिस्क में खाली जगह और सॉफ़्टवेयर इंस्टॉल करने की अनुमति जांचें.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - क्रोमियम कैनरी</translation> @@ -331,6 +332,7 @@ <translation id="8453117565092476964">इंस्टॉलर संग्रह खराब या अमान्य है. कृपया क्रोमियम फिर से डाउनलोड करें.</translation> <translation id="8463672209299734063">आप चाहें, तो ChromiumOS को यह अनुमति दें कि वह गड़बड़ी की जानकारी और इस्तेमाल से जुड़ा डेटा Google को अपने-आप भेज सके. आपके ऐसा करने से, ChromiumOS की सुविधाओं और परफ़ॉर्मेंस को बेहतर बनाने में मदद मिलेगी.</translation> <translation id="8493179195440786826">क्रोमियम पुराना हो गया है</translation> +<translation id="8522220489792889625">ज़रूरत के मुताबिक, Chromium उन टैब से मेमोरी फिर से रिकवर करता है जिन्हें आपने पिछले कुछ समय से इस्तेमाल नहीं किया है. सेटिंग में जाकर, इस विकल्प को कभी भी बदला जा सकता है.</translation> <translation id="8550334526674375523">यह वर्क प्रोफ़ाइल आपकी निजी प्रोफ़ाइल से पूरी तरह अलग है.</translation> <translation id="8558383651099478961">आपके अभिभावक ने क्रोमियम के लिए, "साइट, ऐप्लिकेशन, और एक्सटेंशन के लिए अनुमतियां" को बंद कर दिया है. इस <ph name="EXTENSION_TYPE_PARAMETER" /> को जोड़ने की अनुमति नहीं है.</translation> <translation id="8561285221328166383">आगे भी Chromium के अपडेट पाते रहने के लिए, आपके कंप्यूटर में macOS 10.13 या इसके बाद का वर्शन होना चाहिए. इस कंप्यूटर में macOS 10.12 का इस्तेमाल किया जा रहा है.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index 066e8f91..bcc7172a 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -329,6 +329,7 @@ <translation id="8453117565092476964">A telepítő tömörített állománya megsérült vagy érvénytelen. Kérjük, töltse le újra a Chromium böngészőt.</translation> <translation id="8463672209299734063">Nem kötelező: Hozzájárulhat a ChromiumOS funkcióinak és teljesítményének javításához azzal, hogy automatikusan elküldi a diagnosztikai és használati adatokat a Google-nak.</translation> <translation id="8493179195440786826">A Chromium elavult</translation> +<translation id="8522220489792889625">A Chromium szükség szerint visszaveszi a memóriát az olyan lapokról, amelyeket nem használ aktívan. A beállításokban ezt bármikor módosíthatja.</translation> <translation id="8550334526674375523">Ez a munkaprofil teljesen el van választva a személyes profiljától.</translation> <translation id="8558383651099478961">Szülőd kikapcsolta a Chromium „Engedélyek webhelyek, alkalmazások és bővítmények számára” beállítását. A(z) <ph name="EXTENSION_TYPE_PARAMETER" /> nem telepíthető.</translation> <translation id="8561285221328166383">Ha a jövőben Chromium-frissítéseket szeretne kapni, akkor a macOS 10.13-as vagy újabb verziójára lesz szüksége. Ezen a számítógépen a macOS X 10.12 fut.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index e9ab6f60..97028e6 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -330,6 +330,7 @@ <translation id="8453117565092476964">L'archivio di installazione è danneggiato o non valido. Scarica di nuovo Chromium.</translation> <translation id="8463672209299734063">(Facoltativo) Contribuisci a migliorare le funzionalità e le prestazioni di Chromium OS inviando automaticamente a Google dati diagnostici e sull'utilizzo.</translation> <translation id="8493179195440786826">Chromium non è aggiornato</translation> +<translation id="8522220489792889625">Se necessario, Chromium recupera memoria dalle schede che non utilizzi attivamente. Puoi modificare questa preferenza in qualsiasi momento nelle Impostazioni.</translation> <translation id="8550334526674375523">Questo profilo di lavoro è completamente separato dal tuo profilo personale.</translation> <translation id="8558383651099478961">Uno dei tuoi genitori ha disattivato "Autorizzazioni per siti, app ed estensioni" per Chromium. L'aggiunta di <ph name="EXTENSION_TYPE_PARAMETER" /> non è consentita.</translation> <translation id="8561285221328166383">Per ricevere gli aggiornamenti futuri di Chromium, devi avere macOS 10.13 o versioni successive. Su questo computer è installato macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index c81a5bc..ea6fb597 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -299,6 +299,7 @@ <translation id="7682601070171973634">אנחנו בודקים תכונות חדשות ב-Chromium שמאפשרות לאתרים להציג את אותה חוויית הגלישה תוך שימוש בפחות נתונים.</translation> <translation id="7686590090926151193">Chromium אינו דפדפן ברירת המחדל שלך</translation> <translation id="7689606757190482937">סנכרון והתאמה אישית של Chromium בכל המכשירים שברשותך</translation> +<translation id="7714577916146996629">כשההגדרה מופעלת, מערכת Chromium משתמשת בזיכרון מכרטיסיות שאינן בשימוש באופן פעיל. כך המשאבים של המחשב מתפנים למשימות אחרות, ומערכת Chromium ממשיכה לפעול במהירות. כרטיסיות לא פעילות מופיעות ריקות ונטענות מחדש באופן אוטומטי כשלוחצים עליהן. אפשר <ph name="BEGIN_LINK" />לקבל מידע נוסף<ph name="END_LINK" /> או <ph name="BEGIN_LINK_2" />לשלוח משוב<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">פעולה זו תמחק את נתוני הגלישה מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, יש להיכנס אל Chromium עם <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">המתקין לא הצליח ליצור ספרייה זמנית. יש לבדוק את המקום הפנוי בדיסק ואת האישור להתקנת תוכנה.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium בגרסת Canary</translation> @@ -328,6 +329,7 @@ <translation id="8453117565092476964">הארכיון של המתקין פגום או שאינו חוקי. יש להוריד שוב את Chromium.</translation> <translation id="8463672209299734063">אופציונלי: שליחה אוטומטית של נתוני אבחון ונתוני שימוש במכשיר אל Google תעזור לשפר את התכונות ואת הביצועים של ChromiumOS.</translation> <translation id="8493179195440786826">Chromium אינו מעודכן</translation> +<translation id="8522220489792889625">מערכת Chromium משתמשת בזיכרון מכרטיסיות שאינן בשימוש באופן פעיל, לפי הצורך. תמיד אפשר לשנות זאת בהגדרות.</translation> <translation id="8550334526674375523">פרופיל העבודה שלך נפרד לחלוטין מהפרופיל האישי שלך.</translation> <translation id="8558383651099478961">אחד מההורים השבית ב-Chromium את ההגדרה "הרשאות לאתרים, אפליקציות ותוספים". לא ניתן להוסיף את ה<ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8561285221328166383">כדי לקבל עדכונים של Chromium בעתיד, צריך להשתמש ב-macOS מגרסה 10.13 ואילך. במחשב הזה מותקנת מערכת ההפעלה macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index c046864..b535b0c8e 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Chromium은 사용자의 데이터를 더 적게 사용하면서도 사이트에서 동일한 탐색 환경을 제공할 수 있는 새로운 기능을 알아보고 있습니다.</translation> <translation id="7686590090926151193">Chromium이 기본 브라우저로 설정되어 있지 않습니다</translation> <translation id="7689606757190482937">모든 기기에서 Chromium을 동기화하고 맞춤설정하세요.</translation> +<translation id="7714577916146996629">사용 설정하면 Chromium에서 사용자가 현재 사용하지 않는 탭의 메모리를 회수합니다. 이렇게 하면 다른 작업을 위해 컴퓨터 리소스를 확보하고 Chromium의 속도를 빠르게 유지합니다. 비활성 탭은 비어 있을 때 표시되며 클릭하면 자동으로 새로고침됩니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /> 또는 <ph name="BEGIN_LINK_2" />의견 보내기<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">인터넷 사용 기록이 기기에서 삭제됩니다. 나중에 데이터를 가져오려면 Chromium에 <ph name="USER_EMAIL" />(으)로 로그인하세요.</translation> <translation id="7747138024166251722">설치 프로그램이 임시 디렉터리를 만들지 못했습니다. 디스크 공간 및 설치 권한을 확인해 보세요.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -333,6 +334,7 @@ <translation id="8453117565092476964">설치 프로그램 아카이브가 손상되었거나 잘못되었습니다. Chromium을 다시 다운로드하세요.</translation> <translation id="8463672209299734063">선택사항: 진단 및 사용 데이터를 Google에 자동으로 전송하여 ChromiumOS의 기능 및 성능 개선에 참여합니다.</translation> <translation id="8493179195440786826">Chromium이 이전 버전임</translation> +<translation id="8522220489792889625">필요한 경우 Chromium에서는 사용자가 현재 사용하지 않는 탭에서 메모리를 회수합니다. 언제든지 설정에서 변경할 수 있습니다.</translation> <translation id="8550334526674375523">이 직장 프로필은 개인 프로필과 완전히 분리됩니다.</translation> <translation id="8558383651099478961">부모님이 Chromium의 ‘사이트, 앱, 확장 프로그램에 대한 권한’을 사용 중지하셨습니다. 이 <ph name="EXTENSION_TYPE_PARAMETER" /> 추가가 허용되지 않습니다.</translation> <translation id="8561285221328166383">향후 Chromium 업데이트를 받으려면 macOS 10.13 이상이 필요합니다. 이 컴퓨터에서는 macOS X 10.12를 사용하고 있습니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 9bc9d59..e2b233a 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">„Chromium“ tyrinėja naujas funkcijas, leidžiančias svetainėms teikti tas pačias naršymo funkcijas, naudojant mažiau jūsų duomenų</translation> <translation id="7686590090926151193">„Chromium“ nėra numatytoji naršyklė</translation> <translation id="7689606757190482937">Sinchronizuokite ir suasmeninkite „Chromium“ skirtinguose įrenginiuose</translation> +<translation id="7714577916146996629">Kai įjungta, „Chromium“ iš naujo įtraukia atmintį iš skirtukų, kurių aktyviai nenaudojate. Tai atlaisvina kompiuterio šaltinius kitoms užduotims ir užtikrina „Chromium“ spartą. Neaktyvūs skirtukai rodomi tušti ir automatiškai įkeliami iš naujo juos spustelėjus. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /> arba <ph name="BEGIN_LINK_2" />siųskite atsiliepimą<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Atlikus šį veiksmą iš šio įrenginio bus ištrinti naršymo duomenys. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chromium“ kaip <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Diegimo programai nepavyko sukurti laikino katalogo. Patikrinkite, ar yra laisvos vietos diske ir, ar leidžiama įdiegti programinę įrangą.</translation> <translation id="7790626492778995050">„<ph name="PAGE_TITLE" />“ – „Chromium Canary“</translation> @@ -333,6 +334,7 @@ <translation id="8453117565092476964">Diegimo programos archyvas sugadintas arba negalioja. Atsisiųskite „Chromium“ dar kartą.</translation> <translation id="8463672209299734063">Pasirenkama: padėkite tobulinti „Chromium“ OS funkcijas ir našumą automatiškai siųsdami diagnostikos ir naudojimo duomenis sistemai „Google“.</translation> <translation id="8493179195440786826">„Chromium“ versija yra pasenusi</translation> +<translation id="8522220489792889625">Jei reikia, „Chromium“ iš naujo įtraukia atmintį iš skirtukų, kurių aktyviai nenaudojate. Tai galite bet kada pakeisti skiltyje „Nustatymai“.</translation> <translation id="8550334526674375523">Šis darbo profilis visiškai atskirtas nuo jūsų asmeninio profilio.</translation> <translation id="8558383651099478961">Jūsų tėvai išjungė svetainių, programų ir plėtinių leidimus sistemoje „Chromium“. Neleidžiama pridėti šio <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8561285221328166383">Jei norite gauti būsimus „Chromium“ naujinius, jums reikės 10.13 ar naujesnės „macOS“ versijos. Šiame kompiuteryje naudojama 10.12 versijos „macOS“.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index 8622975..5f391931 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -330,6 +330,7 @@ <translation id="8453117565092476964">Суулгагчийн архив устгагдсан эсвэл хүчингүй болсон байна. Chromium-ыг дахин татаж авна уу.</translation> <translation id="8463672209299734063">Заавал биш: Оношилгоо болон ашиглалтын өгөгдлийг Google-д автоматаар илгээснээр ChromiumOS-н онцлогууд, гүйцэтгэлийг сайжруулахад тусална уу.</translation> <translation id="8493179195440786826">Chromium нь хуучирсан байна</translation> +<translation id="8522220489792889625">Шаардлагатай бол Chromium таны идэвхтэй ашиглаагүй байгаа табуудаас санах ойг сэргээнэ. Та үүнийг тохиргоонд хүссэн үедээ өөрчлөх боломжтой.</translation> <translation id="8550334526674375523">Энэ ажлын профайл нь таны хувийн профайлаас бүрэн тусдаа байна.</translation> <translation id="8558383651099478961">Таны эцэг эх Chromium-н "Сайтууд, аппууд болон өргөтгөлүүдийн зөвшөөрөл"-ийг унтраасан байна. Энэ <ph name="EXTENSION_TYPE_PARAMETER" />-г нэмэхийг зөвшөөрдөггүй.</translation> <translation id="8561285221328166383">Chromium-н цаашдын шинэчлэлтийг авахын тулд танд macOS 10.13 эсвэл түүнээс хойших хувилбар хэрэгтэй болно. Энэ компьютер macOS 10.12 хувилбарыг ашиглаж байна.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index 945abfc3..12b1610e 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -306,6 +306,7 @@ <translation id="7682601070171973634">ဝဘ်ဆိုက်များအား ဒေတာချွေတာ၍ တူညီသောကြည့်ရှုနိုင်မှု အတွေ့အကြုံပေးနိုင်မည့် ဝန်ဆောင်မှုအသစ်များကို Chromium က စူးစမ်းလေ့လာနေပါသည်</translation> <translation id="7686590090926151193">Chromium သည် သင်၏ မူရင်းဘရောင်ဇာ မဟုတ်ပါ</translation> <translation id="7689606757190482937">သင်၏ စက်ပစ္စည်းများအားလုံးတွင် Chromium ကို စင့်ခ်လုပ်ပြီး စိတ်ကြိုက်ပြင်ဆင်ပါ</translation> +<translation id="7714577916146996629">ဖွင့်ထားပါက Chromium သည် လက်ရှိ အသုံးမပြုသည့်တဘ်များမှ မှတ်ဉာဏ်ကို ပြန်လည်ရယူသည်။ ၎င်းက အခြားလုပ်ဆောင်စရာများအတွက် သင့်ကွန်ပျူတာ၏ ရင်းမြစ်များကို ရှင်းလင်းပေးပြီး Chromium ကို လျင်မြန်စေသည်။ အသုံးမပြုသည့် တဘ်များက အလွတ်ပုံဖြစ်နေပြီး ၎င်းတို့ကိုနှိပ်သောအခါ အလိုအလျောက် ပြန်လည်စတင်သည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /> (သို့) <ph name="BEGIN_LINK_2" />အကြံပြုချက် ပို့ရန်<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">၎င်းသည် ဤစက်ပစ္စည်းထဲရှိ အင်တာနက်အသုံးပြုမှု အချက်အလက်များကို ဖျက်လိုက်ပါမည်။ သင့်ဒေတာကို နောက်မှ ပြန်ယူရန် Chromium သို့ <ph name="USER_EMAIL" /> အဖြစ် လက်မှတ်ထိုးဝင်ပါ။</translation> <translation id="7747138024166251722">ဤထည့်သွင်းသူသည် ယာယီဒါရိုက်ထရီကို မဖန်တီးနိုင်ခဲ့ပါ။ ကျေးဇူးပြု၍ ဒစ်က် နေရာလွတ်နှင့် ဆော့ဖ်ဝဲထည့်သွင်းရန် ခွင့်ပြုချက်ကို စစ်ဆေးပါ။</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index 552a665f..66afde1 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -303,6 +303,7 @@ <translation id="7682601070171973634">Chromium bevat nieuwe experimentele functies waarmee sites dezelfde browsefunctionaliteit kunnen leveren terwijl er minder van je gegevens worden gebruikt</translation> <translation id="7686590090926151193">Chromium is niet je standaardbrowser</translation> <translation id="7689606757190482937">Chromium synchroniseren en personaliseren op al je apparaten</translation> +<translation id="7714577916146996629">Als deze instelling aanstaat, claimt Chromium geheugen terug van tabbladen die je niet actief gebruikt. Zo worden de resources van je computer vrijgemaakt voor andere taken en blijft Chromium snel. Inactieve tabbladen worden leeg weergegeven en worden automatisch opnieuw geladen als je erop klikt. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /> of <ph name="BEGIN_LINK_2" />feedback sturen<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Hiermee worden je browsegegevens verwijderd van dit apparaat. Als je je gegevens later wilt terughalen, log je in bij Chromium als <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Het installatieprogramma kan geen tijdelijke directory maken. Controleer of je nog schijfruimte hebt en of je rechten hebt om software te installeren.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index 1c230227..e980d30 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -299,6 +299,7 @@ <translation id="7682601070171973634">Testujemy nowe funkcje Chromium, dzięki którym witryny będą mogły zapewniać użytkownikom taką samą wygodę przeglądania treści przy wykorzystaniu mniejszej ilości danych</translation> <translation id="7686590090926151193">Chromium nie jest domyślną przeglądarką</translation> <translation id="7689606757190482937">Synchronizuj dane Chromium i korzystaj z własnych ustawień przeglądarki na wielu urządzeniach</translation> +<translation id="7714577916146996629">Gdy ta funkcja jest włączona, Chromium odzyskuje pamięć z kart, których aktywnie nie używasz. Powoduje to zwolnienie zasobów komputera na potrzeby innych zadań i przyspiesza działanie Chromium. Nieaktywne karty wyglądają na puste i automatycznie ładują się ponownie po kliknięciu. <ph name="BEGIN_LINK" />Dowiedz się więcej<ph name="END_LINK" /> lub <ph name="BEGIN_LINK_2" />prześlij opinię<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Spowoduje to usunięcie danych przeglądania z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chromium jako <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Instalator nie mógł utworzyć katalogu tymczasowego. Sprawdź, czy na dysku jest dość wolnego miejsca oraz sprawdź, czy posiadasz uprawnienia do instalowania programów.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation> @@ -328,6 +329,7 @@ <translation id="8453117565092476964">Archiwum instalatora jest uszkodzone lub nieprawidłowe. Pobierz Chromium ponownie.</translation> <translation id="8463672209299734063">Opcjonalnie: pomóż ulepszyć funkcje i działanie systemu operacyjnego Chromium, automatycznie wysyłając do Google dane diagnostyczne i dane o korzystaniu.</translation> <translation id="8493179195440786826">Chromium jest nieaktualny</translation> +<translation id="8522220489792889625">W razie potrzeby Chromium odzyskuje pamięć z kart, których aktywnie nie używasz. Możesz to zmienić w dowolnym momencie w ustawieniach.</translation> <translation id="8550334526674375523">Ten profil służbowy jest całkowicie oddzielony od Twojego profilu osobistego.</translation> <translation id="8558383651099478961">Rodzic wyłączył „Uprawnienia stron, aplikacji i rozszerzeń” dla Chromium. Dodanie elementu <ph name="EXTENSION_TYPE_PARAMETER" /> jest niedozwolone.</translation> <translation id="8561285221328166383">Aby otrzymywać w przyszłości aktualizacje Chromium, musisz mieć system macOS 10.13 lub nowszy. Na tym komputerze jest zainstalowany system macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index ffc1b628..1a50e8c1 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -301,6 +301,7 @@ <translation id="7682601070171973634">Chromium explorează noi funcții care le dau site-urilor posibilitatea să ofere aceeași experiență de navigare, folosind mai puține date despre tine</translation> <translation id="7686590090926151193">Chromium nu este browserul prestabilit</translation> <translation id="7689606757190482937">Sincronizează și personalizează Chromium pe toate dispozitivele</translation> +<translation id="7714577916146996629">Când opțiunea este activată, Chromium revendică memoria din filele pe care nu le folosești în mod activ. Acțiunea eliberează resursele computerului pentru alte activități și menține viteza ridicată a browserului Chromium. Filele inactive se afișează goale și se reîncarcă automat când dai clic pe ele. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /> sau <ph name="BEGIN_LINK_2" />trimite feedback<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Astfel, se vor șterge datele de navigare de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chromium ca <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Programul de instalare nu a putut crea un director temporar. Verifică dacă există suficient spațiu liber și dacă ai drepturile necesare pentru a instala software-ul.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index ef264b5..03d9748 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -297,6 +297,7 @@ <translation id="7682601070171973634">Chromium представляет новый взгляд на просмотр веб-страниц: сайты функционируют в обычном режиме, собирая меньше данных о вас.</translation> <translation id="7686590090926151193">Chromium не является браузером по умолчанию.</translation> <translation id="7689606757190482937">Синхронизируйте данные Chromium на всех устройствах</translation> +<translation id="7714577916146996629">В этом режиме Chromium не использует память на вкладки, которые некоторое время оставались неактивными. Это освобождает ресурсы компьютера для текущих задач и поддерживает быструю работу Chromium. Неактивные вкладки при этом показываются как пустые и автоматически загружаются при нажатии на них. Вы можете <ph name="BEGIN_LINK" />узнать больше<ph name="END_LINK" /> или <ph name="BEGIN_LINK_2" />отправить отзыв<ph name="END_LINK_2" />.</translation> <translation id="7745317241717453663">Данные о работе в браузере будут удалены с устройства. Чтобы восстановить их позже, войдите в Chromium как <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Программе установки не удалось создать временный каталог. Возможно, у вас нет прав на установку приложений или недостаточно места на диске.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 2f77652..4fdef5a 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Chromium skúma nové funkcie, ktoré umožňujú webom zobraziť rovnaké prostredie prehliadania s využitím menšieho počtu dát</translation> <translation id="7686590090926151193">Chromium nie je váš predvolený prehliadač</translation> <translation id="7689606757190482937">Synchronizujte a prispôsobte si Chromium v rôznych zariadeniach</translation> +<translation id="7714577916146996629">Keď je táto funkcia zapnutá, Chromium bude uvoľňovať pamäť z kariet, ktoré aktívne nepoužívate. Týmto sa uvoľnia zdroje počítača pre ďalšie úlohy a Chromium bude fungovať rýchlejšie. Neaktívne karty sa budú zobrazovať prázdne a po kliknutí sa automaticky znova načítajú. Môžete si prečítať <ph name="BEGIN_LINK" />ďalšie informácie<ph name="END_LINK" /> alebo <ph name="BEGIN_LINK_2" />odoslať spätnú väzbu<ph name="END_LINK_2" />.</translation> <translation id="7745317241717453663">Táto akcia odstráni zo zariadenia údaje prehliadania. Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Inštalátor nemohol vytvoriť dočasný priečinok. Skontrolujte úroveň zaplnenia disku a povolenie na inštaláciu softvéru.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index fa8a5ee3..540e629 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -304,6 +304,7 @@ <translation id="7682601070171973634">Chromium raziskuje nove funkcije, ki spletnim mestom omogočajo, da z manjšo količino prenesenih podatkov zagotavljajo isto izkušnjo pri brskanju.</translation> <translation id="7686590090926151193">Chromium ni privzeti brskalnik</translation> <translation id="7689606757190482937">V vseh svojih napravah sinhronizirajte in prilagodite Chromium</translation> +<translation id="7714577916146996629">Če je vklopljena ta nastavitev, Chromium znova pridobi pomnilnik z zavihkov, ki jih ne uporabljate aktivno. S tem sprostite sredstva računalnika za druga opravila in poskrbite, da Chromium še naprej deluje hitro. Neaktivni zavihki so videti prazni in se samodejno znova naložijo, ko jih kliknete. <ph name="BEGIN_LINK" />Preberite več<ph name="END_LINK" /> ali <ph name="BEGIN_LINK_2" />pošljite povratne informacije<ph name="END_LINK_2" />.</translation> <translation id="7745317241717453663">S tem bodo iz te naprave izbrisani podatki brskanja. Če želite pozneje prenesti podatke, se v Chromium prijavite kot <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Namestitvenemu programu ni uspelo ustvariti začasnega imenika. Preverite, ali je na disku dovolj prostora in ali imate dovoljenje za namestitev programske opreme.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – delovna različica Chromiuma</translation> @@ -333,6 +334,7 @@ <translation id="8453117565092476964">Arhiv namestitvenega programa je poškodovan ali neveljaven. Znova prenesite Chromium.</translation> <translation id="8463672209299734063">Izbirno: Pomagajte izboljšati funkcije sistema Chromium OS in njegovo delovanje s samodejnim pošiljanjem diagnostičnih podatkov in podatkov o uporabi Googlu.</translation> <translation id="8493179195440786826">Chromium je zastarel</translation> +<translation id="8522220489792889625">Chromium po potrebi znova pridobi pomnilnik z zavihkov, ki jih ne uporabljate aktivno. To lahko kadar koli spremenite v nastavitvah.</translation> <translation id="8550334526674375523">Ta delovni profil je v celoti ločen od osebnega profila.</translation> <translation id="8558383651099478961">Tvoj starš je izklopil »Dovoljenja za spletna mesta, aplikacije in razširitve« za Chromium. Dodajanje tega ni dovoljeno: <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8561285221328166383">Če želite prejemati prihodnje posodobitve Chromiuma, potrebujete macOS 10.13 ali novejšega. V tem računalniku je nameščen macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index 822b5c7..f3917b6 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -61,6 +61,7 @@ <translation id="2583187216237139145">ผู้ดูแลโปรไฟล์งานนำข้อมูล Chromium ที่สร้างขึ้นในช่วงที่มีการใช้โปรไฟล์นี้ออกได้ (เช่น การสร้างบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ) <ph name="LEARN_MORE" /></translation> <translation id="2648074677641340862">เกิดข้อผิดพลาดของระบบปฏิบัติในระหว่างการติดตั้ง โปรดดาวน์โหลด Chromium อีกครั้ง</translation> <translation id="2661879430930417727">เพื่อนและครอบครัวสามารถท่องเว็บแยกกันและตั้งค่า Chromium ตามที่ตนต้องการในกรณีที่ใช้อุปกรณ์ร่วมกัน</translation> +<translation id="2669853942967761236">Chromium บล็อกไฟล์ที่เก็บถาวรนี้เนื่องจากอาจซ่อนมัลแวร์</translation> <translation id="268602741124540128">ยินดีต้อนรับสู่ Chromium <ph name="ACCOUNT_FIRST_NAME" /></translation> <translation id="2711502716910134313">แท็บ Chromium</translation> <translation id="2718390899429598676">เพื่อเพิ่มความปลอดภัยให้มากยิ่งขึ้น Chromium จะเข้ารหัสข้อมูลของคุณ</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 25c37b5..24b8caf 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -299,6 +299,7 @@ <translation id="7682601070171973634">Chromium, sitelerin daha az veri kullanarak aynı tarama deneyimini sunmasını sağlayan yeni özellikleri keşfediyor</translation> <translation id="7686590090926151193">Chromium varsayılan tarayıcınız değil</translation> <translation id="7689606757190482937">Chromium'u cihazlarınız arasında senkronize edin ve kişiselleştirin</translation> +<translation id="7714577916146996629">Bu ayar etkinleştirildiğinde Chromium, aktif olarak kullanmadığınız sekmelerdeki belleği geri kazanır. Böylece, bilgisayarınızın kaynaklarında diğer görevler için yer açılır ve Chromium hızlı çalışmaya devam eder. Aktif olmayan sekmeler boş görünür ve bunları tıkladığınızda otomatik olarak yeniden yüklenir. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /> veya <ph name="BEGIN_LINK_2" />geri bildirim gönderin<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Bu işlem tarama verilerinizi bu cihazdan silecektir. Verilerinizi daha sonra geri almak için Chromium'da <ph name="USER_EMAIL" /> hesabıyla oturum açın.</translation> <translation id="7747138024166251722">Yükleyici geçici bir dizin oluşturamadı. Lütfen, kullanılabilir disk alanını ve yazılım yükleme iznini kontrol edin.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -328,6 +329,7 @@ <translation id="8453117565092476964">Yükleyici arşivi bozuk veya geçersiz. Lütfen Chromium'u yeniden indirin.</translation> <translation id="8463672209299734063">İsteğe bağlı: Teşhis ve kullanım verilerini Google'a otomatik olarak göndererek ChromiumOS özelliklerini ve performansını iyileştirmeye yardımcı olun.</translation> <translation id="8493179195440786826">Chromium Sürümü Eski</translation> +<translation id="8522220489792889625">Chromium, aktif olarak kullanmadığınız sekmelerdeki belleği gerektiğinde geri kazanır. İstediğiniz zaman bunu Ayarlar'dan değiştirebilirsiniz.</translation> <translation id="8550334526674375523">Bu iş profili, kişisel profilinizden tamamen ayrıdır.</translation> <translation id="8558383651099478961">Ebeveyniniz, Chromium'a yönelik "Siteler, uygulamalar ve uzantılar için izinler"i kapattı. Bu <ph name="EXTENSION_TYPE_PARAMETER" /> uzantısını eklemeye izin verilmiyor.</translation> <translation id="8561285221328166383">Gelecekteki Chromium güncellemelerini almak için macOS 10.13 veya sonraki bir sürümün yüklü olması gerekir. Bu bilgisayar macOS 10.12 kullanıyor.</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index f8a48d7..025ffd2 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -302,6 +302,7 @@ <translation id="7682601070171973634">Chromium досліджує нові функції, за допомогою яких сайти забезпечуватимуть ту саму роботу, використовуючи менше ваших даних</translation> <translation id="7686590090926151193">Chromium не є вашим веб-переглядачем за умовчанням</translation> <translation id="7689606757190482937">Синхронізуйте та персоналізуйте роботу Chromium на всіх своїх пристроях</translation> +<translation id="7714577916146996629">Якщо цей режим увімкнено, Chromium перестає використовувати оперативну пам’ять для вкладок, які ви активно не застосовуєте. Це звільняє ресурси комп’ютера для інших завдань і підтримує швидку роботу Chromium. Неактивні вкладки при цьому відображаються пустими й автоматично оновлюються, коли ви їх натискаєте. <ph name="BEGIN_LINK" />Дізнайтеся більше<ph name="END_LINK" /> або <ph name="BEGIN_LINK_2" />надішліть відгук<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">Дані веб-перегляду буде видалено з цього пристрою. Щоб відновити дані пізніше, увійдіть в обліковий запис Chromium як <ph name="USER_EMAIL" />.</translation> <translation id="7747138024166251722">Програмі встановлення не вдалося створити тимчасовий каталог. Перевірте наявність вільного простору на диску та дозволу на встановлення програмного забезпечення.</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation> @@ -331,6 +332,7 @@ <translation id="8453117565092476964">Архів програми встановлення пошкоджений або недійсний. Завантажте Chromium ще раз.</translation> <translation id="8463672209299734063">Необов’язково: допоможіть нам покращувати функції та підвищувати продуктивність Chromium OS, автоматично надсилаючи в Google дані про діагностику та використання.</translation> <translation id="8493179195440786826">Версія Chromium застаріла</translation> +<translation id="8522220489792889625">За потреби Chromium перестає використовувати оперативну пам’ять для вкладок, які ви активно не застосовуєте. Це можна будь-коли змінити в налаштуваннях.</translation> <translation id="8550334526674375523">Цей робочий профіль ніяк не пов'язаний із вашим особистим профілем.</translation> <translation id="8558383651099478961">Хтось із твоїх батьків вимкнув "Дозволи для сайтів, додатків і розширень" у Chromium. Додавати це <ph name="EXTENSION_TYPE_PARAMETER" /> заборонено.</translation> <translation id="8561285221328166383">Щоб отримувати майбутні оновлення Chromium, потрібна операційна система macOS 10.13 або новішої версії. На цьому комп’ютері встановлено macOS 10.12.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index b5e2492..2092332 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -303,6 +303,7 @@ <translation id="7682601070171973634">Chromium نئی خصوصیات کو دریافت کر رہا ہے جو سائٹس کو آپ کے کم ڈیٹا کا استعمال کر کے وہی براؤزنگ تجربہ فراہم کرنے کی اجازت دیتا ہے</translation> <translation id="7686590090926151193">Chromium آپ کا ڈیفالٹ براؤزر نہیں ہے</translation> <translation id="7689606757190482937">اپنے آلات پر Chromium کو مطابقت پذیر اور ذاتی نوعیت کا بنائیں</translation> +<translation id="7714577916146996629">آن ہونے پر، Chromium ان ٹیبز سے میموری کا دوبارہ دعویٰ کرتا ہے جنہیں آپ فعال طور پر استعمال نہیں کر رہے ہیں۔ یہ آپ کے کمپیوٹر کے وسائل کو دوسرے ٹاسکس کے لیے خالی کر دیتا ہے اور Chromium کو تیز رفتار رکھتا ہے۔ غیر فعال ٹیبز خالی دکھائی دیتی ہیں اور جب آپ ان پر کلک کرتے ہیں تو خودکار طور پر دوبارہ لوڈ ہو جاتے ہیں۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /> یا <ph name="BEGIN_LINK_2" />تاثرات بھیجیں<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">یہ اس آلہ سے آپ کے براؤزنگ ڈیٹا کو حذف کر دے گا۔ بعد میں اپنے ڈیٹا کی بازیافت کرنے کیلئے، Chromium میں <ph name="USER_EMAIL" /> کے بطور سائن ان کریں۔</translation> <translation id="7747138024166251722">انسٹالر ایک عارضی ڈائرکٹری نہیں بنا سکا۔ سافٹ ویئر انسٹال کرنے کیلئے براہ کرم ڈسک کی خالی جگہ اور اجازت کو چیک کریں۔</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index 9d47171..dd9354e3 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -61,6 +61,7 @@ <translation id="2583187216237139145">Bu profil ishlatilganda yaratilgan har qanday Chromium maʼlumotlari (bukmarklar, tarix, parollar va boshqa sozlamalar kabi) ish profili administratori tomonidan tozalanishi mumkin. <ph name="LEARN_MORE" /></translation> <translation id="2648074677641340862">O‘rnatish vaqtida operatsion tizim xatoligi yuz berdi. Chromium‘ni qaytadan yuklab oling.</translation> <translation id="2661879430930417727">Agar qurilmangizdan yaqinlaringiz va doʻstlaringiz ham foydalansa, ular Chromium brauzerini oʻzlari xohlagancha sozlab olishlari mumkin.</translation> +<translation id="2669853942967761236">Tarkibida zararli kod borligi sababli bu arxiv fayli Chromium tomonidan bloklandi.</translation> <translation id="268602741124540128">Chromium brauzeriga xush kelibsiz, <ph name="ACCOUNT_FIRST_NAME" /></translation> <translation id="2711502716910134313">Chromium sahifasi</translation> <translation id="2718390899429598676">Xavfsizlik himoyasini oshirish maqsadida Chromium ma’lumotlaringizni shifrlaydi.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index b31530a..54372e7 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -303,6 +303,7 @@ <translation id="7682601070171973634">Chromium 正在探索新功能,讓網站能在使用較少資料的情況下提供相同的瀏覽體驗</translation> <translation id="7686590090926151193">Chromium 不是您的預設瀏覽器</translation> <translation id="7689606757190482937">在不同裝置上同步和設定個人化的 Chromium</translation> +<translation id="7714577916146996629">啟用此設定後,Chromium 會回收目前未使用的分頁記憶體。這樣做可釋出電腦的資源來處理其他工作,並維持 Chromium 的運作速度。已停用的分頁會顯示為空白,並會在您按一下分頁後自動重新載入內容。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" />或<ph name="BEGIN_LINK_2" />提供意見<ph name="END_LINK_2" /></translation> <translation id="7745317241717453663">這會刪除此裝置上的瀏覽資料。如果日後想擷取資料,請以 <ph name="USER_EMAIL" /> 的身分登入 Chromium。</translation> <translation id="7747138024166251722">安裝程式無法建立暫時目錄,請檢查可用磁碟空間與權限,以順利安裝軟件。</translation> <translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation> @@ -332,6 +333,7 @@ <translation id="8453117565092476964">安裝程式封存檔案已損毀或無效,請重新下載 Chromium。</translation> <translation id="8463672209299734063">可選用:將診斷和使用情況資料自動傳送給 Google,協助改善 Chromium 作業系統的功能和效能。</translation> <translation id="8493179195440786826">Chromium 版本過舊</translation> +<translation id="8522220489792889625">如有需要,Chromium 會回收目前未使用的分頁記憶體。您可隨時在設定中變更此設定。</translation> <translation id="8550334526674375523">此工作設定檔與個人設定檔是完全分開。</translation> <translation id="8558383651099478961">您的家長已停用 Chromium 的「網站、應用程式和擴充程式權限」設定,因此您無法新增此<ph name="EXTENSION_TYPE_PARAMETER" />。</translation> <translation id="8561285221328166383">如要取得日後的 Chromium 更新,您將需要 macOS 10.13 或以上版本。此電腦正在使用 macOS 10.12。</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 1fd0de9..2573e2c 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -693,6 +693,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 ከRSA ምስጠራ ጋር</translation> <translation id="1641113438599504367">የጥንቃቄ አሰሳ</translation> <translation id="1641496881756082050">ለ<ph name="NETWORK_NAME" /> ተጨማሪ እርምጃዎች</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{በስህተት ቅርጸት ስለተሰራለት 1 ሌላ የይለፍ ቃል ማምጣት አልተቻለም}one{በስህተት ቅርጸት ስለተሰራለት {NUM_PASSWORDS} ሌላ የይለፍ ቃል ማምጣት አልተቻለም}other{በስህተት ቅርጸት ስለተሰራላቸው {NUM_PASSWORDS} ሌላ የይለፍ ቃላት ማምጣት አልተቻለም}}</translation> <translation id="1642492862748815878">ከ<ph name="DEVICE" /> እና <ph name="NUMBER_OF_DEVICES" /> ሌሎች የብሉቱዝ መሣሪያዎች ጋር ተገናኝቷል</translation> <translation id="1642494467033190216">ሌሎች የማረሚያ ባህሪያት ከመንቃታቸው በፊት የrootfs ጥበቃ መወገድ እና ዳግም መጀመር ያስፈልጋል።</translation> <translation id="1643072738649235303">የX9.62 ECDSA ፊርማ በSHA-1</translation> @@ -1838,6 +1839,7 @@ <translation id="2673135533890720193">የአሰሳ ታሪክዎን ያነብባል</translation> <translation id="2674764818721168631">አጥፋ</translation> <translation id="2678063897982469759">እንደገና አንቃ</translation> +<translation id="2678100101831051676">cast ማድረግ አልተቻለም።</translation> <translation id="268053382412112343">&ታሪክ</translation> <translation id="2681124317993121768">የእንግዳ መገለጫዎች አይደገፉም</translation> <translation id="2682498795777673382">ዝማኔ ከእርስዎ ወላጅ</translation> @@ -3869,6 +3871,7 @@ <translation id="4617019240346358451">«<ph name="EXTENSION_NAME" />»ን ለመጠቀም ገጹን ዳግም ይጫኑ</translation> <translation id="4617270414136722281">የቅጥያ አማራጮች</translation> <translation id="4617880081511131945">ግንኙነትን መመስረት አልተቻለም</translation> +<translation id="4618195822946934889">ዩአርኤል መያዝ የሚችለው የASCII ቁምፊዎችን ብቻ ነው</translation> <translation id="4619564267100705184">እርስዎ መሆንዎን ያረጋግጡ</translation> <translation id="4619615317237390068">ከሌሎች መሣሪያዎች የመጡ ትሮች</translation> <translation id="4620809267248568679">ይህ ቅንብር በአንድ ቅጥያ ነው የሚፈጸመው።</translation> @@ -5068,6 +5071,7 @@ <translation id="5800351251499368110">በጎን ፓነል ውስጥ ፍለጋን ዝጋ። ፍለጋ በጎን ፓነል ውስጥ ተከፍቷል።</translation> <translation id="5801568494490449797">አማራጮች</translation> <translation id="5804241973901381774">ፍቃዶች</translation> +<translation id="5805268472388605531">የአጽንዖት ምልክቶች እና ልዩ ቁምፊዎችን ለማየት የቁልፍ ሰሌዳ ቁልፎችን ተጭነው ይያዙ</translation> <translation id="5805697420284793859">የWindow አስተዳዳሪ</translation> <translation id="5806447147478173900">በሚታዩት ጣቢያዎች ስራ ላይ የዋለው ጠቅላላ ማከማቻ፦ <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (ነባሪ)</translation> @@ -5709,6 +5713,7 @@ <translation id="642469772702851743">ይህ መሣሪያ (SN፦ <ph name="SERIAL_NUMBER" />) በዋና ባለቤቱ ተቆልፎ ነበር።</translation> <translation id="6425556984042222041">የጽሑፍ-ወደ-ንግግር ፍጥነት</translation> <translation id="642729974267661262">ድምጽ ለማጫወት አልተፈቀደም</translation> +<translation id="6427608534767366138">ለ«<ph name="NETWORK_ID" />» ተኪ ማረጋገጥ ያስፈልጋል</translation> <translation id="6429384232893414837">የማዘመን ስህተት</translation> <translation id="6430814529589430811">Base64-encoded ASCII፣ ነጠላ ሰርቲፊኬት</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> ለሁሉም የዚህ ኮምፒውተር ተጠቃሚዎች አውቶማቲክ ዝምኖችን ያዋቅራል።</translation> @@ -7845,6 +7850,7 @@ <translation id="844063558976952706">ሁሌም በዚህ ጣቢያ ላይ</translation> <translation id="8441313165929432954">እንደ ሞደም መሰካትን አንቃ/አሰናክል</translation> <translation id="8443795068008423036">እባክዎ መሣሪያዎ የተዘመነ መሆኑን ያረጋግጡ እና እንደገና ይሞክሩ</translation> +<translation id="8443986842926457191">ዩአርኤል ከ2048 ቁምፊዎች በላይ ነው</translation> <translation id="8446884382197647889">ተጨማሪ ለመረዳት</translation> <translation id="8447409163267621480">Ctrl ወይም Alt ያካትቱ</translation> <translation id="844850004779619592">ምንም ትዕዛዞች አልተገኙም</translation> @@ -7910,6 +7916,7 @@ <translation id="851263357009351303">ሁልጊዜ <ph name="HOST" /> ምስሎችን እዲያሳይ ፍቀድ</translation> <translation id="8513108775083588393">በራስ ሰር አሽከርክር</translation> <translation id="8514746246728959655">የተለየ የደህንነት ቁልፍ ይሞክሩ</translation> +<translation id="8519895319663397036">የይለፍ ቃላትን ማምጣት አልተቻለም። የፋይሉ መጠን ከ150 ኪባ በታች መሆን አለበት።</translation> <translation id="8523493869875972733">ለውጦችን አስቀምጥ</translation> <translation id="8523849605371521713">በመመሪያ የታከለ</translation> <translation id="8524783101666974011">ወደ የእርስዎ የGoogle መለያ ካርዶችን ያስቀምጡ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index ab8f19c..e10a5aa 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">سيتم قفل الجهاز بعد قليل</translation> <translation id="1062628064301375934">مساعدتنا في تصميم تجربة تصفُّح أكثر خصوصية</translation> <translation id="1067048845568873861">تم الإنشاء</translation> +<translation id="1067661089446014701">لتوفير مزيد من الأمان، يمكنك تشفير كلمات المرور على جهازك قبل حفظها في حسابك على Google.</translation> <translation id="1067922213147265141">خدمات Google الأخرى</translation> <translation id="1069355737714877171">إزالة الملف التعريفي لشريحة eSIM التي تحمل الاسم <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">أضاف برنامج آخر بجهاز الكمبيوتر إضافة قد تؤدي إلى تغيير طريقة عمل Chrome. @@ -253,6 +254,7 @@ <translation id="1223853788495130632">يوصي المشرف بقيمة محددة لهذا الإعداد.</translation> <translation id="1225177025209879837">جارٍ معالجة الطلب...</translation> <translation id="1227507814927581609">تعذّرت المصادقة أثناء الاتصال بالجهاز "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">تعذَّر البث. يُرجى المحاولة مرة أخرى.</translation> <translation id="1230417814058465809">الحماية العادية مفعَّلة. لزيادة مستوى الأمان، يمكنك استخدام "الحماية المُحسَّنة".</translation> <translation id="1231733316453485619">هل تريد تفعيل المزامنة؟</translation> <translation id="1232569758102978740">بلا عنوان</translation> @@ -283,7 +285,7 @@ <translation id="1254593899333212300">اتصال مباشر بالإنترنت</translation> <translation id="1257336506558170607">تصدير الشهادة التي تم اختيارها</translation> <translation id="1258491128795710625">الميزات الجديدة</translation> -<translation id="1259152067760398571">تم تفعيل ميزة "تأكيد السلامة" أمس.</translation> +<translation id="1259152067760398571">تم تفعيل ميزة "التحقّق من الأمان" أمس.</translation> <translation id="1260451001046713751">السماح دائمًا بعرض النوافذ المنبثقة وعمليات إعادة التوجيه من الموقع <ph name="HOST" /></translation> <translation id="1260810365552581339">قد لا تتوفّر مساحة تخزين كافية على القرص في نظام التشغيل Linux. يمكنك زيادة مساحة التخزين على القرص في نظام التشغيل Linux ومحاولة الاستعادة مرة أخرى من خلال <ph name="LINK_START" />الإعدادات<ph name="LINK_END" />.</translation> <translation id="1261380933454402672">معتدل</translation> @@ -695,6 +697,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 مع ترميز RSA</translation> <translation id="1641113438599504367">التصفح الآمن</translation> <translation id="1641496881756082050">مزيد من الإجراءات للشبكة <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{لم يتم استيراد كلمة مرور واحدة أخرى بسبب تنسيقها بشكل غير صحيح.}zero{لم يتم استيراد {NUM_PASSWORDS} كلمة مرور أخرى بسبب تنسيقها بشكل غير صحيح.}two{لم يتم استيراد كلمتَي مرور ({NUM_PASSWORDS}) أخريين بسبب تنسيقهما بشكل غير صحيح.}few{لم يتم استيراد {NUM_PASSWORDS} كلمات مرور أخرى بسبب تنسيقها بشكل غير صحيح.}many{لم يتم استيراد {NUM_PASSWORDS} كلمة مرور أخرى بسبب تنسيقها بشكل غير صحيح.}other{لم يتم استيراد {NUM_PASSWORDS} كلمة مرور أخرى بسبب تنسيقها بشكل غير صحيح.}}</translation> <translation id="1642492862748815878">تم الاتصال بالجهاز <ph name="DEVICE" /> و<ph name="NUMBER_OF_DEVICES" /> جهاز آخر يتضمّن بلوتوث.</translation> <translation id="1642494467033190216">مطلوب إزالة الحماية من rootfs وإعادة التشغيل قبل تفعيل ميزات التصحيح الأخرى.</translation> <translation id="1643072738649235303">توقيع X9.62 ECDSA باستخدام SHA-1</translation> @@ -761,7 +764,7 @@ <translation id="1703666494654169921">عدم السماح للمواقع الإلكترونية باستخدام أجهزة الواقع الافتراضي أو بياناته</translation> <translation id="1704097193565924901">تحويل الأحرف الأولى إلى أحرف كبيرة</translation> <translation id="1704230497453185209">عدم السماح للمواقع الإلكترونية بتشغيل الصوت</translation> -<translation id="1704970325597567340">تم تفعيل ميزة "تأكيد السلامة" بتاريخ <ph name="DATE" />.</translation> +<translation id="1704970325597567340">تم تفعيل ميزة "التحقّق من الأمان" بتاريخ <ph name="DATE" />.</translation> <translation id="1706586824377653884">تمت الإضافة من قبل المشرف</translation> <translation id="170658918174941828">سيتم إرسال إصدار Chrome وإصدار نظام التشغيل وإعدادات Google Cast وإحصاءات أداء النسخ المطابق وسجلات تشخيص قناة الاتصال بالإضافة إلى أي معلومات تختار تضمينها أعلاه. ويتم استخدام ملاحظاتك هذه لتشخيص المشاكل والمساعدة في تحسين الميزة. وستتم حماية أي معلومات شخصية ترسلها، سواء بشكل صريح أو بدون قصد، بموجب سياسات الخصوصية التي نلتزم بها. ومن خلال إرسال هذه الملاحظات، فإنّك توافق على أنّه يجوز لشركة Google استخدام الملاحظات التي تقدّمها لتحسين أي منتج أو خدمة من Google.</translation> <translation id="1708338024780164500">(غير نشطة)</translation> @@ -1009,7 +1012,7 @@ <translation id="192494336144674234">فتح باستخدام</translation> <translation id="1925017091976104802">اضغط على <ph name="MODIFIER_KEY_DESCRIPTION" /> للصق.</translation> <translation id="1925021887439448749">إدخال عنوان الويب المُخصص</translation> -<translation id="1925124445985510535">تم تفعيل ميزة "تأكيد السلامة" عند الساعة <ph name="TIME" />.</translation> +<translation id="1925124445985510535">تم تفعيل ميزة "التحقّق من الأمان" عند الساعة <ph name="TIME" />.</translation> <translation id="192564025059434655">لن تُفتَح الإصدارات القديمة من تطبيقات Chrome على الأجهزة التي تعمل بنظام التشغيل Windows بعد كانون الأول (ديسمبر) 2022. يمكنك التحقّق من توفّر إصدار جديد.</translation> <translation id="1926339101652878330">تتحكم سياسات المؤسسة في هذه الإعدادات. يُرجى الاتصال بالمشرف للحصول على مزيد من المعلومات.</translation> <translation id="1927632033341042996">إصبع <ph name="NEW_FINGER_NUMBER" /></translation> @@ -1115,6 +1118,7 @@ <translation id="2031914984822377766">يمكنك إضافة <ph name="LINK_BEGIN" />اللغات المفضَّلة التي تريد عرض المواقع الإلكترونية<ph name="LINK_END" /> بها. سيتم استخدام اللغة الواردة في أعلى القائمة لترجمة المواقع الإلكترونية إلى تلك اللغة.</translation> <translation id="2033758234986231162">لا يمكن مواصلة الاتصال بهاتفك. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأن يكون البلوتوث وشبكة Wi-Fi مفعَّلين.</translation> <translation id="2034346955588403444">إضافة شبكة WiFi أخرى</translation> +<translation id="2035211704574173780">تدرُّج الرمادي</translation> <translation id="203574396658008164">تفعيل تدوين الملاحظات من شاشة القفل</translation> <translation id="2037445849770872822">تم إعداد الإشراف من أجل حساب Google هذا. ولإعداد المزيد من أدوات الرقابة الأبوية، يُرجى اختيار "مواصلة". @@ -1832,6 +1836,7 @@ <translation id="2673135533890720193">قراءة سجل التصفح التابع لك</translation> <translation id="2674764818721168631">غير مفعَّل</translation> <translation id="2678063897982469759">إعادة تفعيل</translation> +<translation id="2678100101831051676">تعذَّر البث</translation> <translation id="268053382412112343">ال&سجل</translation> <translation id="2681124317993121768">لا يمكن استخدام الملفات الشخصية للضيوف.</translation> <translation id="2682498795777673382">تحديث من أحد والديك</translation> @@ -2440,7 +2445,7 @@ <translation id="3265118321284789528">في انتظار موافقة أحد الوالدَين</translation> <translation id="3265459715026181080">إغلاق الإطار</translation> <translation id="3266022278425892773">بيئة تطوير نظام التشغيل Linux</translation> -<translation id="3266274118485960573">"تأكيد السلامة" قيد التشغيل.</translation> +<translation id="3266274118485960573">"التحقّق من الأمان" قيد التشغيل.</translation> <translation id="3267726687589094446">متابعة السماح بعمليات التنزيل التلقائية لعدة ملفات</translation> <translation id="3268451620468152448">علامات التبويب المفتوحة</translation> <translation id="3269093882174072735">تحميل الصورة</translation> @@ -2524,7 +2529,7 @@ <translation id="3341703758641437857">السماح بالدخول إلى عناوين URL للملفات</translation> <translation id="3342361181740736773">يرغب "<ph name="TRIGGERING_EXTENSION_NAME" />" في إزالة هذه الإضافة.</translation> <translation id="3345135638360864351">تعذر إرسال طلبك للوصول إلى هذا الموقع إلى <ph name="NAME" />. يُرجى إعادة المحاولة مرة أخرى.</translation> -<translation id="3345634917232014253">تم تفعيل ميزة "تأكيد السلامة" قبل قليل.</translation> +<translation id="3345634917232014253">تم تفعيل ميزة "التحقّق من الأمان" قبل قليل.</translation> <translation id="3345886924813989455">لم يتم العثور على·متصفح متوافق.</translation> <translation id="3347086966102161372">&نسخ عنوان الصورة</translation> <translation id="3348038390189153836">تم اكتشاف جهاز قابل للإزالة</translation> @@ -2543,6 +2548,7 @@ <translation id="3363202073972776113">ستتم إدارة هذا الملف الشخصي الجديد بواسطة مؤسستك. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> <translation id="3364986687961713424">من مُشرفك: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">يرجى استخدام مفتاح واحد فقط: Ctrl أو Alt.</translation> +<translation id="3368586359109138591">يمكنك تنزيل نسخة لاستخدامها في مكان آخر.</translation> <translation id="3368922792935385530">متصل</translation> <translation id="3369067987974711168">عرض المزيد من الإجراءات لهذا المنفذ</translation> <translation id="3369624026883419694">إثبات هوية المضيف...</translation> @@ -2731,6 +2737,7 @@ <translation id="3532273508346491126">إدارة المزامنة</translation> <translation id="3532521178906420528">جارٍ الاتصال بالشبكة...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - تم كتم الصوت</translation> +<translation id="3536492240554502321">تدوير تدرُّج الألوان</translation> <translation id="3537881477201137177">يمكنك تعديل حجم القرص لاحقًا من خلال "الإعدادات".</translation> <translation id="3538066758857505094">حدث خطأ أثناء إلغاء تثبيت نظام التشغيل Linux. يُرجى إعادة المحاولة.</translation> <translation id="354060433403403521">محول AC</translation> @@ -3057,6 +3064,7 @@ <translation id="383669374481694771">هذه معلومات عامة حول هذا الجهاز وطريقة استخدامه (مثل مستوى البطارية، ونشاط النظام والتطبيقات، والأخطاء). وسيتم استخدام هذه البيانات في تحسين Android، كما ستساعد بعض المعلومات المجمّعة في تحسين تطبيقات Google والتطبيقات والمنتجات الخاصة بشركائها، مثل مطوّري البرامج المتوافقة مع Android.</translation> <translation id="3838085852053358637">فشل تحميل الإضافة</translation> <translation id="3838486795898716504">مزيد من <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">يمكنك إضافة كلمات المرور المحفوظة إلى "مدير كلمات المرور في Google".</translation> <translation id="383891835335927981">لم يتم تكبير أو تصغير أي مواقع إلكترونية</translation> <translation id="3839509547554145593">تفعيل تسريع تمرير الماوس</translation> <translation id="3839516600093027468">حظر <ph name="HOST" /> دائمًا من الاطلاع على الحافظة</translation> @@ -3865,6 +3873,7 @@ <translation id="4617019240346358451">إعادة تحميل الصفحة لاستخدام "<ph name="EXTENSION_NAME" />"</translation> <translation id="4617270414136722281">خيارات الإضافات</translation> <translation id="4617880081511131945">لا يمكن إجراء اتصال</translation> +<translation id="4618195822946934889">لا يمكن أن يتضمّن عنوان URL سوى أحرف ASCII.</translation> <translation id="4619564267100705184">إثبات هويّتك</translation> <translation id="4619615317237390068">علامات التبويب من الأجهزة الأخرى</translation> <translation id="4620809267248568679">يتم فرض هذا الإعداد بواسطة إحدى الإضافات.</translation> @@ -4126,6 +4135,7 @@ <translation id="4871568871368204250">إيقاف المزامنة</translation> <translation id="4871719318659334896">إغلاق المجموعة</translation> <translation id="4872192066608821120">لاستيراد كلمات مرور، اختَر أحد ملفات CSV.</translation> +<translation id="4872212987539553601">ضبط إعدادات عملية "التشفير على الجهاز فقط"</translation> <translation id="4873312501243535625">مدقق ملف الوسائط</translation> <translation id="4876273079589074638">ساعد مهندسينا في تحري هذا العطل وإصلاحه. واسرد الخطوات الدقيقة إذا كان ذلك ممكنًا. لا توجد تفاصيل صغيرة جدًا!</translation> <translation id="4876895919560854374">قفل الشاشة وإلغاء قفلها</translation> @@ -4759,7 +4769,7 @@ <translation id="5499476581866658341">يمكنك الآن الاطّلاع على أحدث الصور والوسائط المتوفّرة على هاتفك</translation> <translation id="549957179819296104">رمز جديد</translation> <translation id="5500168250243071806">قد يتم حفظ <ph name="BEGIN_LINK_SEARCH" />سجلّ البحث<ph name="END_LINK_SEARCH" /> و<ph name="BEGIN_LINK_GOOGLE" />بيانات الأنشطة الأخرى<ph name="END_LINK_GOOGLE" /> في حسابك على Google عند تسجيل الدخول إليه. ويمكنك حذفها في أي وقت.</translation> -<translation id="5500709606820808700">تم تفعيل ميزة "تأكيد السلامة" اليوم.</translation> +<translation id="5500709606820808700">تم تفعيل ميزة "التحقّق من الأمان" اليوم.</translation> <translation id="5501322521654567960">اللوحة الجانبية التي تمت محاذاتها إلى اليسار</translation> <translation id="5501809658163361512">{COUNT,plural, =1{تعذّر استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}zero{تعذّر استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}two{تعذّر استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}few{تعذّر استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}many{تعذّر استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}other{تعذّر استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}}</translation> <translation id="5502500733115278303">تمّ الاستيراد من متصفّح فايرفوكس</translation> @@ -5064,6 +5074,7 @@ <translation id="5800351251499368110">أغلِق صفحة "بحث Google" في اللوحة الجانبية. صفحة "بحث Google" مفتوحة في اللوحة الجانبية.</translation> <translation id="5801568494490449797">الإعدادات المفضّلة</translation> <translation id="5804241973901381774">الأذونات</translation> +<translation id="5805268472388605531">اضغط مع الاستمرار على مفاتيح لوحة المفاتيح لإظهار علامات التشكيل والرموز الخاصة.</translation> <translation id="5805697420284793859">مدير النوافذ</translation> <translation id="5806447147478173900">إجمالي مساحة التخزين التي تستخدمها المواقع الإلكترونية المعروضة: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0 درجة (تلقائي)</translation> @@ -5593,7 +5604,7 @@ <translation id="6310141306111263820">تعذّر تثبيت الملف التعريفي لشريحة eSIM. للحصول على المساعدة، يُرجى التواصل مع مشغّل شبكة الجوّال.</translation> <translation id="6311165245110979290">البطاقة الافتراضية متوفّرة</translation> <translation id="6311220991371174222">تعذّر بدء تشغيل Chrome بسبب حدوث خطأ ما أثناء فتح ملفك الشخصي. حاول إعادة تشغيل Chrome.</translation> -<translation id="6312567056350025599">{NUM_DAYS,plural, =1{تم تفعيل ميزة "تأكيد السلامة" قبل يوم واحد.}zero{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_DAYS} يوم.}two{تم تفعيل ميزة "تأكيد السلامة" قبل يومَين ({NUM_DAYS}).}few{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_DAYS} أيام.}many{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_DAYS} يومًا.}other{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_DAYS} يوم.}}</translation> +<translation id="6312567056350025599">{NUM_DAYS,plural, =1{تم تفعيل ميزة "التحقّق من الأمان" قبل يوم واحد.}zero{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_DAYS} يوم.}two{تم تفعيل ميزة "التحقّق من الأمان" قبل يومَين ({NUM_DAYS}).}few{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_DAYS} أيام.}many{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_DAYS} يومًا.}other{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_DAYS} يوم.}}</translation> <translation id="6312638141433622592">اقتراح مشاهدة المقالات في وضع القارئ إذا كان ذلك متاحًا</translation> <translation id="6313641880021325787">الخروج من VR</translation> <translation id="6313950457058510656">إيقاف "التوصيل الفوري"</translation> @@ -5705,6 +5716,7 @@ <translation id="642469772702851743">أقفل المالك هذا الجهاز (الرقم التسلسلي: <ph name="SERIAL_NUMBER" />).</translation> <translation id="6425556984042222041">معدّل "تحويل النص إلى كلام"</translation> <translation id="642729974267661262">المواقع الإلكترونية التي لا يُسمح لها بتشغيل الصوت</translation> +<translation id="6427608534767366138">يجب إجراء مصادقة للخادم الوكيل في "<ph name="NETWORK_ID" />".</translation> <translation id="6429384232893414837">خطأ في التحديث</translation> <translation id="6430814529589430811">حفظ شهادة واحدة بتشفير ASCII المرمّز باستخدام Base64</translation> <translation id="6431347207794742960">سيعمل <ph name="PRODUCT_NAME" /> على إعداد التحديثات التلقائية لجميع مستخدمي هذا الكمبيوتر.</translation> @@ -5879,7 +5891,7 @@ <translation id="6587958707401001932">اختيار الإعداد التلقائي</translation> <translation id="6588043302623806746">استخدام "نظام أسماء النطاقات" (DNS) الآمن</translation> <translation id="6588047202935130957">قد تظهر هنا قائمة الاهتمامات أثناء تصفّحك للويب.</translation> -<translation id="659005207229852190">اكتمل إعداد "تأكيد السلامة".</translation> +<translation id="659005207229852190">اكتمل إعداد ميزة "التحقّق من الأمان".</translation> <translation id="6590458744723262880">إعادة تسمية المجلد</translation> <translation id="6592267180249644460">تم التقاط سجلات WebRTC في <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation> <translation id="6592808042417736307">تم حِفظ بصمة الإصبع.</translation> @@ -6394,7 +6406,7 @@ <translation id="7055451306017383754">تعذّر إلغاء المشاركة بسبب استخدام تطبيق لهذا المجلد. سيتم إلغاء مشاركة المجلد عند إيقاف تشغيل نظام Parallels Desktop.</translation> <translation id="7056418393177503237">{0,plural, =1{نافذة واحدة للتصفُّح المتخفي}zero{# نافذة مفتوحة للتصفُّح المتخفي}two{# نافذتان مفتوحتان للتصفُّح المتخفي}few{# نوافذ مفتوحة للتصفُّح المتخفي}many{# نافذةً مفتوحة للتصفُّح المتخفي}other{# نافذة مفتوحة للتصفُّح المتخفي}}</translation> <translation id="7056526158851679338">&فحص الأجهزة</translation> -<translation id="7057184853669165321">{NUM_MINS,plural, =1{تم تفعيل ميزة "تأكيد السلامة" قبل دقيقة واحدة.}zero{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_MINS} دقيقة.}two{تم تفعيل ميزة "تأكيد السلامة" قبل دقيقتَين ({NUM_MINS}).}few{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_MINS} دقائق.}many{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_MINS} دقيقة.}other{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_MINS} دقيقة.}}</translation> +<translation id="7057184853669165321">{NUM_MINS,plural, =1{تم تفعيل ميزة "التحقّق من الأمان" قبل دقيقة واحدة.}zero{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_MINS} دقيقة.}two{تم تفعيل ميزة "التحقّق من الأمان" قبل دقيقتَين ({NUM_MINS}).}few{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_MINS} دقائق.}many{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_MINS} دقيقة.}other{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_MINS} دقيقة.}}</translation> <translation id="7057767408836081338">تعذَّر علينا الحصول على بيانات التطبيق، ولكن ما نزال نحاول تشغيل التطبيق.</translation> <translation id="7058024590501568315">شبكة مخفية</translation> <translation id="7059858479264779982">ضبط على تشغيل تلقائي</translation> @@ -6431,6 +6443,7 @@ <translation id="7093220653036489319">معلومات سريعة</translation> <translation id="7093416310351037609">لحماية البيانات والحفاظ على أمانها، تتطلّب مؤسستك حفظ جميع عمليات التنزيل المؤهّلة في حساب <ph name="WEB_DRIVE" /> التابع لمؤسستك.</translation> <translation id="7093866338626856921">تبادل البيانات مع الأجهزة المسماه: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">قبول طلب البث على جهاز "<ph name="DEVICE_NAME" />"</translation> <translation id="7098389117866926363">جهاز USB-C (المنفذ الأيسر في الخلف)</translation> <translation id="7098447629416471489">ستظهر هنا محركات البحث المحفوظة الأخرى</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{إزالة التطبيق}zero{إزالة التطبيقات}two{إزالة التطبيقَين}few{إزالة التطبيقات}many{إزالة التطبيقات}other{إزالة التطبيقات}}</translation> @@ -6532,6 +6545,7 @@ <translation id="7212097698621322584">يُرجى إدخال رقم التعريف الشخصي الحالي لتغييره. في حال كنت لا تعرف رقم التعريف الشخصي، عليك إعادة ضبط مفتاح الأمان، ثم إنشاء رقم تعريف شخصي جديد.</translation> <translation id="7213903639823314449">محرك البحث المُستخدَم في شريط العناوين</translation> <translation id="721490496276866468">استيراد كلمات المرور</translation> +<translation id="7218514093816577632">يجب تفعيل الإشعارات على جهاز "<ph name="DEVICE_NAME" />"</translation> <translation id="7219473482981809164">تتوفَّر عدّة ملفات شخصية للتنزيل. يُرجى اختيار الملفات الشخصية التى تريد تنزيلها قبل المتابعة.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{ما مِن كلمات مرور ضعيفة.}=1{كلمة مرور ضعيفة واحدة}two{كلمتا مرور ضعيفتان ({NUM_WEAK})}few{{NUM_WEAK} كلمات مرور ضعيفة}many{{NUM_WEAK} كلمة مرور ضعيفة}other{{NUM_WEAK} كلمة مرور ضعيفة}}</translation> <translation id="7220019174139618249">تعذّر تصدير كلمات المرور إلى "<ph name="FOLDER" />"</translation> @@ -6719,7 +6733,7 @@ <translation id="7401778920660465883">رفض هذه الرسالة</translation> <translation id="7403642243184989645">جارٍ تنزيل موارد</translation> <translation id="7404065585741198296">توصيل هاتفك باستخدام كابل USB</translation> -<translation id="7405938989981604410">{NUM_HOURS,plural, =1{تم تفعيل ميزة "تأكيد السلامة" قبل ساعة واحدة.}zero{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_HOURS} ساعة.}two{تم تفعيل ميزة "تأكيد السلامة" قبل ساعتَين ({NUM_HOURS}).}few{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_HOURS} ساعات.}many{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_HOURS} ساعة.}other{تم تفعيل ميزة "تأكيد السلامة" قبل {NUM_HOURS} ساعة.}}</translation> +<translation id="7405938989981604410">{NUM_HOURS,plural, =1{تم تفعيل ميزة "التحقّق من الأمان" قبل ساعة واحدة.}zero{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعة.}two{تم تفعيل ميزة "التحقّق من الأمان" قبل ساعتَين ({NUM_HOURS}).}few{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعات.}many{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعة.}other{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعة.}}</translation> <translation id="740624631517654988">تم منع النوافذ المنبثقة.</translation> <translation id="7407430846095439694">الاستيراد والربط</translation> <translation id="7407504355934009739">يحظر معظم المستخدمين الإشعارات من هذا الموقع الإلكتروني.</translation> @@ -7001,6 +7015,7 @@ <translation id="7664620655576155379">جهاز بلوتوث غير متوافق: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">حجز الحجم</translation> <translation id="7665369617277396874">إضافة حساب</translation> +<translation id="766635563210446220">يتعذّر استيراد كلمات المرور. يُرجى مراجعة ملف "<ph name="FILENAME" />" والتأكّد من تنسيقه بشكلٍ صحيح. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{يجب إرجاع جهاز <ph name="DEVICE_TYPE" /> خلال أسبوع واحد ({NUM_WEEKS})}zero{يجب إرجاع جهاز <ph name="DEVICE_TYPE" /> خلال {NUM_WEEKS} أسبوع}two{يجب إرجاع جهاز <ph name="DEVICE_TYPE" /> خلال أسبوعَين ({NUM_WEEKS})}few{يجب إرجاع جهاز <ph name="DEVICE_TYPE" /> خلال {NUM_WEEKS} أسابيع}many{يجب إرجاع جهاز <ph name="DEVICE_TYPE" /> خلال {NUM_WEEKS} أسبوعًا}other{يجب إرجاع جهاز <ph name="DEVICE_TYPE" /> خلال {NUM_WEEKS} أسبوع}}</translation> <translation id="7668423670802040666">تعديل كلمة المرور في "مدير كلمات المرور" من Google للحساب <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">تساعدك ميزات تسهيل الاستخدام في استخدام جهازك بشكل أكثر سهولة. للوصول إلى "الإعدادات السريعة"، انقر على الوقت في أسفل الشاشة.</translation> @@ -7533,6 +7548,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{فيديو واحد}zero{# فيديو}two{فيديوهان}few{# فيديوهات}many{# فيديو}other{# فيديو}}</translation> <translation id="8143442547342702591">التطبيق غير صالح</translation> <translation id="8143609395536282994">كيفية إدارة بياناتك:</translation> +<translation id="8145170459658034418">وضع "توفير الذاكرة"</translation> <translation id="8146177459103116374">إذا كنت مسجلاً على هذا الجهاز من قبل، يمكنك <ph name="LINK2_START" />تسجيل الدخول كمستخدم حالي<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">يمكنك إضافة اللغات المفضَّلة وترتيبها. ستُعرض المواقع الإلكترونية بلغاتك المفضَّلة إن أمكن. وستتم مزامنة هذه الإعدادات المفضّلة مع إعدادات المتصفّح. <ph name="BEGIN_LINK_LEARN_MORE" />مزيد من المعلومات<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">تعذّر تسجيل الدخول، يُرجى الاتصال بالمشرف أو إعادة المحاولة.</translation> @@ -7592,6 +7608,7 @@ <translation id="8198456017687137612">جارٍ إرسال محتوى علامة التبويب</translation> <translation id="8199300056570174101">خصائص الشبكة (الخدمة) والجهاز</translation> <translation id="8200772114523450471">استئناف</translation> +<translation id="8200789660596905522">يجب قبول طلب البث على جهاز "<ph name="DEVICE_NAME" />"</translation> <translation id="8202160505685531999">يُرجى إعادة إدخال كلمة المرور لتحديث ملف <ph name="DEVICE_TYPE" /> الشخصي.</translation> <translation id="8203152941016626022">اسم الجهاز الذي يستخدم ميزة "المشاركة عن قرب"</translation> <translation id="8203732864715032075">تُرسِل إليك الإشعارات وتتذكر جهاز الكمبيوتر هذا لميزة "الرسائل". <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> @@ -7844,6 +7861,7 @@ <translation id="844063558976952706">إلغاء الحظر دومًا على الموقع الإلكتروني هذا</translation> <translation id="8441313165929432954">تفعيل/إيقاف التوصيل</translation> <translation id="8443795068008423036">يُرجى التأكُّد من أنّ جهازك مُحدَّث، ثم إعادة المحاولة.</translation> +<translation id="8443986842926457191">يجب ألّا يزيد عدد أحرف عنوان URL عن 2048 حرفًا.</translation> <translation id="8446884382197647889">مزيد من المعلومات</translation> <translation id="8447409163267621480">تضمين إما مفتاح Ctrl أو Alt</translation> <translation id="844850004779619592">ما مِن أوامر.</translation> @@ -7909,6 +7927,7 @@ <translation id="851263357009351303">السماح للموقع <ph name="HOST" /> بعرض الصور دومًا</translation> <translation id="8513108775083588393">التدوير تلقائي</translation> <translation id="8514746246728959655">تجربة مفتاح أمان آخر</translation> +<translation id="8519895319663397036">يتعذّر استيراد كلمات المرور. يجب أن يكون حجم الملف أقل من 150 كيلوبايت.</translation> <translation id="8523493869875972733">الإبقاء على التغييرات</translation> <translation id="8523849605371521713">تمت الإضافة من قبل السياسة</translation> <translation id="8524783101666974011">حفظ البطاقات في حسابك على Google</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 515248e..12a2ff80 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">ডিভাইচ লক হওঁ হওঁ</translation> <translation id="1062628064301375934">অধিক ব্যক্তিগত ৱেব নিৰ্মাণ কৰাত আমাক সহায় কৰক</translation> <translation id="1067048845568873861">সৃষ্টি কৰা হ’ল</translation> +<translation id="1067661089446014701">অতিৰিক্ত সুৰক্ষাৰ বাবে, আপোনাৰ Google একাউণ্টত ছেভ কৰাৰ পূৰ্বে আপুনি আপোনাৰ ডিভাইচত পাছৱৰ্ডসমূহ এনক্ৰিপ্ট কৰিব পাৰে</translation> <translation id="1067922213147265141">অন্য Google সেৱা</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> নামৰ ই-ছিমৰ প্ৰ'ফাইলটো আঁতৰাওক</translation> <translation id="1070377999570795893">আপোনাৰ কম্পিউটাৰৰ অন্য প্ৰ’গামে যোগ কৰা এক্সটেনশ্বনে Chrome কার্যপ্ৰণালী সলনি কৰিব পাৰে। @@ -252,6 +253,7 @@ <translation id="1223853788495130632">আপোনাৰ প্ৰশাসকে এই ছেটিঙৰ বাবে এটা বিশেষ মানৰ চুপাৰিছ কৰিছে।</translation> <translation id="1225177025209879837">অনুৰোধৰ ওপৰত প্ৰক্ৰিয়া চলি আছে…</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />"ৰ সৈতে সংযোগ কৰি থাকোঁতে বিশ্বাসযোগ্যতাৰ প্ৰমাণ কৰিব পৰা নগ’ল।</translation> +<translation id="1227993798763400520">কাষ্ট কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।</translation> <translation id="1230417814058465809">সাধাৰণ সুৰক্ষা অন কৰা আছে। আৰু অধিক সুৰক্ষাৰ বাবে বৰ্ধিত সুৰক্ষা ব্যৱহাৰ কৰক।</translation> <translation id="1231733316453485619">ছিংক অন কৰিবনে?</translation> <translation id="1232569758102978740">শিৰোনামবিহীন</translation> @@ -693,6 +695,7 @@ <translation id="1640283014264083726">RSA এনক্ৰিপশ্বনৰ সৈতে PKCS #1 MD4</translation> <translation id="1641113438599504367">সুৰক্ষিত ব্ৰাউজিং</translation> <translation id="1641496881756082050"><ph name="NETWORK_NAME" />ৰ বাবে আৰু অধিক কাৰ্য</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{সঠিককৈ ফৰ্মেট নোহোৱাৰ কাৰণে ১ টা অন্য পাছৱৰ্ড আমদানি কৰা হোৱা নাছিল}one{সঠিককৈ ফৰ্মেট নোহোৱাৰ কাৰণে {NUM_PASSWORDS} টা অন্য পাছৱৰ্ড আমদানি কৰা হোৱা নাছিল}other{সঠিককৈ ফৰ্মেট নোহোৱাৰ কাৰণে {NUM_PASSWORDS} টা অন্য পাছৱৰ্ড আমদানি কৰা হোৱা নাছিল}}</translation> <translation id="1642492862748815878"><ph name="DEVICE" /> আৰু <ph name="NUMBER_OF_DEVICES" /> টা ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰা হৈছে</translation> <translation id="1642494467033190216">অন্য ডিবাগিঙৰ সুবিধা সক্ষম কৰাৰ আগতে এটা rootfs সুৰক্ষা আঁতৰাই ডিভাইচটো ৰিষ্টাৰ্ট কৰিব লাগিব।</translation> <translation id="1643072738649235303">SHA-1ৰ সৈতে X9.62 ECDSA স্বাক্ষৰ</translation> @@ -1122,6 +1125,7 @@ <translation id="2031914984822377766">আপুনি অগ্ৰাধিকাৰ দিয়া <ph name="LINK_BEGIN" />ৱেবছাইটৰ ভাষা<ph name="LINK_END" /> যোগ দিয়ক। সূচীখনৰ শীৰ্ষত থকা ভাষাটো অনুবাদৰ বাবে ব্যৱহাৰ কৰা হ’ব।</translation> <translation id="2033758234986231162">আপোনাৰ ফ’নৰ সৈতে এটা সংযোগ ৰাখিব নোৱাৰি। আপোনাৰ ফ’নটো ওচৰত থকাটো, আনলক কৰি ৰখাটো আৰু ব্লুটুথ তথা ৱাই-ফাই অন কৰি ৰখাটো নিশ্চিত কৰক।</translation> <translation id="2034346955588403444">অন্য ৱাই-ফাই নেটৱৰ্ক যোগ কৰক</translation> +<translation id="2035211704574173780">গ্ৰে’স্কেল</translation> <translation id="203574396658008164">লক স্ক্ৰীণৰ পৰা টোকা লোৱাৰ সুবিধা সক্ষম কৰক</translation> <translation id="2037445849770872822">এই Google একাউণ্টটোৰ বাবে তদাৰকী কৰা সুবিধাটো ছেট কৰা হৈছে। অধিক অভিভাৱকীয় নিয়ন্ত্ৰণ ছেট আপ কৰিবলৈ 'অব্যাহত ৰাখক বাছনি কৰক। @@ -1178,6 +1182,7 @@ <translation id="208634871997892083">সদায় অন থকা ভিপিএন</translation> <translation id="2087822576218954668">প্ৰিণ্ট কৰক: <ph name="PRINT_NAME" /></translation> <translation id="2088092308059522196">আপুনি <ph name="DEVICE_OS" /> ইনষ্টল কৰাৰ পাছতহে পঞ্জীয়ন সমৰ্থন কৰে।</translation> +<translation id="2089090684895656482">কম</translation> <translation id="208928984520943006">যিকোনো সময়তে গৃহ স্ক্রীনলৈ যাবলৈ একেবাৰে তলিৰ পৰা ওপৰলৈ ছোৱাইপ কৰক।</translation> <translation id="2089566709556890888">Google Chromeৰ সহায়ত সুৰক্ষিতভাৱে ব্ৰাউজ কৰক</translation> <translation id="2089795179672254991">কোনো ছাইটে ক্লিপব’ৰ্ড প্ৰতিলিপি হোৱা পাঠ আৰু প্ৰতিচ্ছবিসমূহ চাব খুজিলে অনুমতি লওক</translation> @@ -1841,6 +1846,7 @@ <translation id="2673135533890720193">আপোনাৰ ব্ৰাউজিংৰ ইতিহাস পঢ়ক</translation> <translation id="2674764818721168631">অফ আছে</translation> <translation id="2678063897982469759">পুনঃসক্ষম কৰক</translation> +<translation id="2678100101831051676">কাষ্ট কৰিব পৰা নগ’ল।</translation> <translation id="268053382412112343">ইতি&হাস</translation> <translation id="2681124317993121768">অতিথি প্ৰ’ফাইল সমৰ্থিত নহয়</translation> <translation id="2682498795777673382">আপোনাৰ অভিভাৱকে কৰা আপডে'ট</translation> @@ -2550,6 +2556,7 @@ <translation id="3363202073972776113">এই নতুন প্ৰ’ফাইলটো আপোনাৰ প্ৰতিষ্ঠানে পৰিচালনা কৰিব। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="3364986687961713424">আপোনাৰ প্ৰশাসকৰ পৰা: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">হয় Ctrl নহয় Alt ব্যৱহাৰ কৰক</translation> +<translation id="3368586359109138591">অন্য কোনো ঠাইত ব্যৱহাৰ কৰিবলৈ এটা প্ৰতিলিপি ডাউনল’ড কৰক</translation> <translation id="3368922792935385530">সংযোগ কৰা হ’ল</translation> <translation id="3369067987974711168">এই প’ৰ্টটোৰ বাবে অধিক কাৰ্য দেখুৱাওক</translation> <translation id="3369624026883419694">হ'ষ্টৰ সমস্যা সমাধান কৰি থকা হৈছে...</translation> @@ -2738,6 +2745,7 @@ <translation id="3532273508346491126">ছিংকৰ পৰিচালনা</translation> <translation id="3532521178906420528">নেটৱৰ্ক সংযোগ স্থাপন কৰি থকা হৈছে ...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - অডিঅ’ মিউট কৰা হৈছে</translation> +<translation id="3536492240554502321">ৰঙৰ ঘূৰ্ণন</translation> <translation id="3537881477201137177">এইটো পাছত ছেটিংসমূহত সংশোধন কৰিব পাৰি</translation> <translation id="3538066758857505094">Linux আনইনষ্টল কৰাত আসোঁৱাহ হৈছে। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।</translation> <translation id="354060433403403521">এচি এডাপ্টৰ</translation> @@ -3063,6 +3071,7 @@ <translation id="383669374481694771">এইখিনি হৈছে এই ডিভাইচটোৰ আৰু সেইটোৰ ব্যৱহাৰৰ বিষয়ে (সাধাৰণ তথ্য যেনে- বেটাৰীৰ স্তৰ, ছিষ্টেম আৰু এপৰ কাৰ্যকলাপ আৰু তাত হোৱা আসোঁৱাহৰ)। এই ডেটাখিনি Androidক উন্নত কৰিবলৈ ব্যৱহাৰ কৰা হ’ব আৰু কিছুমান একত্ৰিত তথ্যই Google এপ্ আৰু Android বিকাশকৰ্তাৰ দৰে অংশীদাৰকো তেওঁলোকৰ এপ্ আৰু প্ৰ’ডাক্টক অধিক উন্নত কৰাত সহায় কৰিব।</translation> <translation id="3838085852053358637">এক্সটেনশ্বনটো ল’ড কৰিব পৰা নগ’ল</translation> <translation id="3838486795898716504">অধিক <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">ছেভ কৰা পাছৱৰ্ডসমূহ Google Password Managerত যোগ দিয়ক</translation> <translation id="383891835335927981">কোনো ছাইট জুম ইন বা আউট কৰা হোৱা নাই</translation> <translation id="3839509547554145593">মাউছ স্ক্ৰ’লৰ এক্সিলাৰেশ্বন সক্ষম কৰক</translation> <translation id="3839516600093027468"><ph name="HOST" />এ ক্লিপব’ৰ্ড চোৱাটো সদায় অৱৰোধ কৰক</translation> @@ -3874,6 +3883,7 @@ <translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />" ব্যৱহাৰ কৰিবলৈ পৃষ্ঠাখন পুনৰ ল’ড কৰক</translation> <translation id="4617270414136722281">এক্সটেনশ্বন বিকল্প</translation> <translation id="4617880081511131945">সংযোগ স্থাপন কৰিব নোৱাৰি</translation> +<translation id="4618195822946934889">URLত কেৱল ASCII বৰ্ণহে থাকিব পাৰে</translation> <translation id="4619564267100705184">এয়া আপুনিয়েই বুলি সত্যাপন কৰক</translation> <translation id="4619615317237390068">অন্য ডিভাইচৰ টেব</translation> <translation id="4620809267248568679">এই ছেটিংটো কোনো এক্সটেনশ্বনৰ জৰিয়তে বলৱৎ কৰা হৈছে৷</translation> @@ -4135,6 +4145,7 @@ <translation id="4871568871368204250">ছিংক অফ কৰক</translation> <translation id="4871719318659334896">গোটটো বন্ধ কৰক</translation> <translation id="4872192066608821120">পাছৱৰ্ড আমদানি কৰিবলৈ, এটা CSV ফাইল বাছনি কৰক</translation> +<translation id="4872212987539553601">অন-ডিভাইচ এনক্ৰিপশ্বন ছেট আপ কৰক</translation> <translation id="4873312501243535625">মিডিয়া ফাইল পৰীক্ষক</translation> <translation id="4876273079589074638">আমাৰ অভিযন্তাই এই ক্ৰেশ্ব অনুসন্ধান আৰু সমাধান কৰাত সহায় কৰক। যদি আপুনি পাৰে সঠিক পদক্ষেপৰ সূচী প্ৰস্তুত কৰক। কোনো বিৱৰণ চুটি নহয়!</translation> <translation id="4876895919560854374">স্ক্ৰীণ লক আৰু আনলক কৰে</translation> @@ -5072,6 +5083,7 @@ <translation id="5800351251499368110">ছাইডৰ পেনেলত থকা সন্ধানৰ টুলবাৰ বন্ধ কৰক। ছাইডৰ পেনেলত সন্ধানৰ টুলবাৰ খোলা আছে।</translation> <translation id="5801568494490449797">অগ্ৰাধিকাৰসমূহ</translation> <translation id="5804241973901381774">অনুমতি</translation> +<translation id="5805268472388605531">উচ্চাৰণ চিহ্ন আৰু বিশেষ বৰ্ণ চাবলৈ কীব’ৰ্ডৰ কীবোৰ টিপি ধৰি ৰাখক</translation> <translation id="5805697420284793859">ৱিণ্ড‘ পৰিচালক</translation> <translation id="5806447147478173900">প্ৰদৰ্শিত ছাইটসমূহে ব্যৱহাৰ কৰা মুঠ ষ্ট’ৰেজ: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">০° (ডিফ’ল্ট)</translation> @@ -5713,6 +5725,7 @@ <translation id="642469772702851743">এই ডিভাইচটো (SN: <ph name="SERIAL_NUMBER" />) গৰাকীজনে লক কৰিছিল।</translation> <translation id="6425556984042222041">পাঠৰ পৰা কথনৰ হাৰ</translation> <translation id="642729974267661262">ধ্বনি প্লে’ কৰাৰ অনুমতি নাই</translation> +<translation id="6427608534767366138">"<ph name="NETWORK_ID" />"ৰ বাবে প্ৰ’ক্সী বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণৰ আৱশ্যক</translation> <translation id="6429384232893414837">আপডে’টৰ আসোঁৱাহ</translation> <translation id="6430814529589430811">Base64-এনক’ড কৰা ASCII, একক প্ৰমাণপত্ৰ</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" />এ এই কম্পিউটাৰৰ সকলো ব্যৱহাৰকাৰীৰ বাবে স্বয়ংক্ৰিয় আপডে’ট ছেট আপ কৰিব।</translation> @@ -6433,6 +6446,7 @@ <translation id="7093220653036489319">দ্ৰুত উত্তৰ</translation> <translation id="7093416310351037609">ডেটাৰ সুৰক্ষা আৰু নিৰাপত্তাৰ বাবে, আপোনাৰ প্ৰতিষ্ঠানটোৱে আটাইবোৰ যোগ্য ডাউনল’ড প্ৰতিষ্ঠানটোৰ <ph name="WEB_DRIVE" /> একাউণ্টত ছেভ কৰিব লাগিব।</translation> <translation id="7093866338626856921">এই ডিভাইচসমূহৰ সৈতে ডেটা বিনিময় কৰক: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">আপোনাৰ <ph name="DEVICE_NAME" />ত কাষ্ট কৰাৰ অনুৰোধ গ্ৰহণ কৰক।</translation> <translation id="7098389117866926363">USB-C ডিভাইচ (পিছফালৰ বাওঁফালৰ প’র্ট)</translation> <translation id="7098447629416471489">ছেভ কৰি থোৱা অন্য সন্ধান ইঞ্জিনসমূহ ইয়াত দেখা যাব</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{এপ্ আঁতৰাওক}one{এপ্সমূহ আঁতৰাওক}other{এপ্সমূহ আঁতৰাওক}}</translation> @@ -6533,6 +6547,7 @@ <translation id="7212097698621322584">আপোনাৰ বৰ্তমানৰ পিনটো সলনি কৰিবলৈ সেইটো দিয়ক। আপুনি যদি নিজৰ পিনটো নাজানে, আপুনি সুৰক্ষা চাবিটো ৰিছেট কৰি এটা নতুন পিন সৃষ্টি কৰিব লাগিব।</translation> <translation id="7213903639823314449">ঠিকনাৰ বাৰত ব্যৱহাৰ কৰা সন্ধান ইঞ্জিন</translation> <translation id="721490496276866468">পাছৱৰ্ড আমদানি কৰক</translation> +<translation id="7218514093816577632">আপোনাৰ <ph name="DEVICE_NAME" />ত জাননী লাভ কৰাৰ সুবিধাটো অন থকাটো নিশ্চিত কৰক।</translation> <translation id="7219473482981809164">ডাউনল’ড কৰিবলৈ আমি বহুকেইটা প্ৰ’ফাইল বিচাৰি পাইছোঁ। আগবঢ়াৰ আগতে আপুনি ডাউনল’ড কৰিবলৈ বিচৰাকেইটা বাছনি কৰক।</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{কোনো দুৰ্বল পাছৱৰ্ড নাই}=1{১ টা দুৰ্বল পাছৱৰ্ড}one{{NUM_WEAK} টা দুৰ্বল পাছৱৰ্ড}other{{NUM_WEAK} টা দুৰ্বল পাছৱৰ্ড}}</translation> <translation id="7220019174139618249">পাছৱৰ্ড "<ph name="FOLDER" />"লৈ ৰপ্তানি কৰিব নোৱাৰি</translation> @@ -7002,6 +7017,7 @@ <translation id="7664620655576155379">অসমৰ্থিত ব্লুটুথ ডিভাইচ: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">সংৰক্ষণৰ আকাৰ</translation> <translation id="7665369617277396874">একাউণ্ট যোগ কৰক</translation> +<translation id="766635563210446220">পাছৱৰ্ড আমদানি কৰিব নোৱাৰি। <ph name="FILENAME" /> পৰীক্ষা কৰক আৰু সেইটো সঠিকভাৱে ফৰ্মেট কৰি থোৱাটো নিশ্চিত কৰক। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{{NUM_WEEKS} সপ্তাহৰ ভিতৰত <ph name="DEVICE_TYPE" /> ঘূৰাই দিয়ক}one{{NUM_WEEKS} সপ্তাহৰ ভিতৰত <ph name="DEVICE_TYPE" /> ঘূৰাই দিয়ক}other{{NUM_WEEKS} সপ্তাহৰ ভিতৰত <ph name="DEVICE_TYPE" /> ঘূৰাই দিয়ক}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" />ৰ বাবে Google পাছৱৰ্ড পৰিচালকত</translation> <translation id="7668648754769651616">সাধ্য সুবিধাসমূহে আপোনাৰ ডিভাইচটো ব্যৱহাৰৰ বাবে অধিক সুবিধাজনক কৰি তোলে। ক্ষিপ্ৰ ছেটিং এক্সেছ কৰিবলৈ, আপোনাৰ স্ক্ৰীনখনৰ একেবাৰে তলত থকা সময় বাছনি কৰক।</translation> @@ -7532,6 +7548,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{এটা ভিডিঅ’}one{# টা ভিডিঅ’}other{# টা ভিডিঅ’}}</translation> <translation id="8143442547342702591">অমান্য এপ্লিকেশ্বন</translation> <translation id="8143609395536282994">আপুনি নিজৰ ডেটা কেনেকৈ পৰিচালনা কৰিব পাৰে:</translation> +<translation id="8145170459658034418">মেম’ৰী সঞ্চয়কাৰী</translation> <translation id="8146177459103116374">যদি আপুনি যদি ইতিমধ্যে এই ডিভাইচত পঞ্জীয়ন কৰিছে তেন্তে আপুনি <ph name="LINK2_START" />পূর্বে থকা ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰিব পাৰিব<ph name="LINK2_END" />।</translation> <translation id="8146287226035613638">আপুনি অগ্ৰাধিকাৰ দিয়া ভাষাসমূহ যোগ দিয়ক আৰু সেইবোৰৰ ক্ৰম নির্ধাৰণ কৰক। ৱেবছাইটে যেতিয়া সম্ভৱ হয় তেতিয়া আপুনি অগ্ৰাধিকাৰ দিয়া ভাষাসমূহ দেখুৱাব। এই অগ্ৰাধিকাৰসমূহ আপোনাৰ ব্ৰাউজাৰৰ ছেটিঙৰ সৈতে ছিংক কৰা আছে। <ph name="BEGIN_LINK_LEARN_MORE" />অধিক জানক<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">ছাইন ইন কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক বা আকৌ চেষ্টা কৰক।</translation> @@ -7591,6 +7608,7 @@ <translation id="8198456017687137612">টেব কাষ্ট কৰি থকা হৈছে</translation> <translation id="8199300056570174101">নেটৱৰ্ক (সেৱা) আৰু ডিভাইচৰ বৈশিষ্ট্য</translation> <translation id="8200772114523450471">পুনৰ আৰম্ভ কৰক</translation> +<translation id="8200789660596905522">আপোনাৰ <ph name="DEVICE_NAME" />ত কাষ্ট কৰাৰ অনুৰোধ গ্ৰহণ কৰাটো নিশ্চিত কৰক।</translation> <translation id="8202160505685531999">আপোনাৰ <ph name="DEVICE_TYPE" />ৰ প্ৰ'ফাইল আপডে'ট কৰিবলৈ অনুগ্ৰহ কৰি আপোনাৰ পাছৱৰ্ডটো পুনৰ দিয়ক।</translation> <translation id="8203152941016626022">Nearby Share ব্যৱহাৰ কৰা ডিভাইচৰ নাম</translation> <translation id="8203732864715032075">আপোনালৈ জাননী পঠিয়াই আৰু বার্তাৰ বাবে এই কম্পিউটাৰক ডিফ’ল্ট হিচাপে মনত ৰাখে। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> @@ -7840,6 +7858,7 @@ <translation id="844063558976952706">এই ছাইটটোত সদায়</translation> <translation id="8441313165929432954">টেডাৰিং সক্ষম/অক্ষম কৰক</translation> <translation id="8443795068008423036">অনুগ্ৰহ কৰি আপোনাৰ ডিভাইচটো আপ টু ডে’ট হৈ থকাটো নিশ্চিত কৰক আৰু পুনৰ চেষ্টা কৰক</translation> +<translation id="8443986842926457191">URLটোত ২০৪৮ টাতকৈ অধিক বৰ্ণ আছে</translation> <translation id="8446884382197647889">অধিক জানক</translation> <translation id="8447409163267621480">হয় Ctrl নহয় Alt অন্তৰ্ভুক্ত কৰক</translation> <translation id="844850004779619592">কোনো নিৰ্দেশনা পোৱা নগ’ল</translation> @@ -7905,6 +7924,7 @@ <translation id="851263357009351303"><ph name="HOST" />ক সদায়েই প্ৰতিচ্ছবি দেখুৱাবলৈ অনুমতি দিয়ক</translation> <translation id="8513108775083588393">স্বয়ং-ঘূৰ্ণন</translation> <translation id="8514746246728959655">বেলেগ এটা সুৰক্ষা চাবি ব্যৱহাৰ কৰি চাওক</translation> +<translation id="8519895319663397036">পাছৱৰ্ড আমদানি কৰিব নোৱাৰি। ফাইলটোৰ আকাৰ ১৫০ কেবিতকৈ কম হ’ব লাগিব।</translation> <translation id="8523493869875972733">সালসলনিসমূহ ৰাখক</translation> <translation id="8523849605371521713">নীতিয়ে যোগ দিয়া</translation> <translation id="8524783101666974011">কাৰ্ডসমূহ আপোনাৰ Google Accountত ছেভ কৰক</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 2f585bcc..540e48d2 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Скоро ще е време за почивка</translation> <translation id="1062628064301375934">Помогнете ни да изградим мрежа, която предлага по-голяма поверителност</translation> <translation id="1067048845568873861">Дата на създаване</translation> +<translation id="1067661089446014701">За допълнителна сигурност можете да шифровате паролите на устройството си, преди да бъдат запазени в профила ви в Google</translation> <translation id="1067922213147265141">Други услуги на Google</translation> <translation id="1069355737714877171">Премахване на потребителския профил (<ph name="PROFILE_NAME" />) на електронната SIM карта</translation> <translation id="1070377999570795893">Друга програма на компютъра ви добави разширение, което може да промени начина на работа на Chrome. @@ -251,6 +252,7 @@ <translation id="1223853788495130632">Администраторът ви препоръчва конкретна стойност за тази настройка.</translation> <translation id="1225177025209879837">Заявката се обработва...</translation> <translation id="1227507814927581609">Удостоверяването не бе успешно при установяването на връзка с/ъс <ph name="DEVICE_NAME" />.</translation> +<translation id="1227993798763400520">Предаването не бе успешно. Моля, опитайте отново.</translation> <translation id="1230417814058465809">Режимът за стандартна защита е включен. За още по-голяма сигурност използвайте подобрената защита.</translation> <translation id="1231733316453485619">Да се включи ли синхронизирането?</translation> <translation id="1232569758102978740">Неозаглавен</translation> @@ -692,6 +694,7 @@ <translation id="1640283014264083726">PKCS 1 MD4 с RSA шифроване</translation> <translation id="1641113438599504367">Безопасно сърфиране</translation> <translation id="1641496881756082050">Още действия за „<ph name="NETWORK_NAME" />“</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Още 1 парола не бе импортирана поради неправилно форматиране}other{Още {NUM_PASSWORDS} пароли не бяха импортирани поради неправилно форматиране}}</translation> <translation id="1642492862748815878">Установена е връзка с(ъс) <ph name="DEVICE" /> и още <ph name="NUMBER_OF_DEVICES" /> устройства с Bluetooth</translation> <translation id="1642494467033190216">Преди активирането на останалите функции за отстраняване на грешки трябва да се премахне защитата на rootfs и да се рестартира.</translation> <translation id="1643072738649235303">Подпис по X9.62 ECDSA с SHA-1</translation> @@ -1120,6 +1123,7 @@ <translation id="2031914984822377766">Добавете предпочитаните от вас <ph name="LINK_BEGIN" />езици за уебсайтове<ph name="LINK_END" />. Най-горният език в списъка ще се използва за преводи.</translation> <translation id="2033758234986231162">Не може да се поддържа връзка с телефона ви. Той трябва да е наблизо, да е отключен и с включени функции за Bluetooth и Wi-Fi.</translation> <translation id="2034346955588403444">Добавяне на друга Wi-Fi мрежа</translation> +<translation id="2035211704574173780">Сива скала</translation> <translation id="203574396658008164">Активиране на функцията за водене на бележки от заключения екран</translation> <translation id="2037445849770872822">Контролирането е настроено за този профил в Google. Ако искате да конфигурирате още родителски контроли, изберете „Напред“. @@ -1840,6 +1844,7 @@ <translation id="2673135533890720193">Да чете историята на сърфирането ви</translation> <translation id="2674764818721168631">Изключено</translation> <translation id="2678063897982469759">Повторно активиране</translation> +<translation id="2678100101831051676">Предаването не е възможно.</translation> <translation id="268053382412112343">&Хронология</translation> <translation id="2681124317993121768">Потребителските профили на гост не се поддържат</translation> <translation id="2682498795777673382">Актуализация от родителя ви</translation> @@ -2549,6 +2554,7 @@ <translation id="3363202073972776113">Този нов потребителски профил ще се управлява от организацията ви. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="3364986687961713424">От администратора ви: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Използвайте или Ctrl, или Alt</translation> +<translation id="3368586359109138591">Изтеглете копие, за да го използвате на друго място</translation> <translation id="3368922792935385530">Има връзка</translation> <translation id="3369067987974711168">Показване на още действия за този порт</translation> <translation id="3369624026883419694">Получава се разрешение от хоста...</translation> @@ -2737,6 +2743,7 @@ <translation id="3532273508346491126">Управление на синхронизирането</translation> <translation id="3532521178906420528">Установява се връзка с мрежата...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – звукът е заглушен</translation> +<translation id="3536492240554502321">Завъртане на нюансите</translation> <translation id="3537881477201137177">Можете да промените това по-късно в „Настройки“</translation> <translation id="3538066758857505094">Грешка при деинсталирането на Linux. Моля, опитайте отново.</translation> <translation id="354060433403403521">Адаптер за променлив ток (AC)</translation> @@ -3062,6 +3069,7 @@ <translation id="383669374481694771">Това е обща информация за устройството и употребата му (например за нивото на батерията, активността на системата и приложенията, както и за грешките). Тези данни ще се използват за подобряването на Android, а част от обобщената информация ще помогне и на приложенията и партньорите ни, например програмисти за Android, да усъвършенстват приложенията и продуктите си.</translation> <translation id="3838085852053358637">Зареждането на разширението не бе успешно</translation> <translation id="3838486795898716504">Още от „<ph name="PAGE_TITLE" />“</translation> +<translation id="3838487810283346084">Добавяне на запазените пароли към Google Мениджър на пароли</translation> <translation id="383891835335927981">Няма сайтове с увеличен или намален мащаб</translation> <translation id="3839509547554145593">Активиране на ускорено превъртане с мишката</translation> <translation id="3839516600093027468">Забраняване винаги на <ph name="HOST" /> да преглежда буферната памет</translation> @@ -3875,6 +3883,7 @@ <translation id="4617019240346358451">Презаредете страницата, за да използвате <ph name="EXTENSION_NAME" /></translation> <translation id="4617270414136722281">Опции за разширението</translation> <translation id="4617880081511131945">Не може да се установи връзка</translation> +<translation id="4618195822946934889">URL адресът може да съдържа само ASCII знаци</translation> <translation id="4619564267100705184">Потвърдете, че сте вие</translation> <translation id="4619615317237390068">Раздели от други устройства</translation> <translation id="4620809267248568679">Тази настройка е наложена от разширение.</translation> @@ -4136,6 +4145,7 @@ <translation id="4871568871368204250">Изключване на синхронизирането</translation> <translation id="4871719318659334896">Затваряне на групата</translation> <translation id="4872192066608821120">За да импортирате пароли, изберете CSV файл</translation> +<translation id="4872212987539553601">Настройване на локалното шифроване</translation> <translation id="4873312501243535625">Проверка на медийни файлове</translation> <translation id="4876273079589074638">Помогнете на инженерите ни да открият и отстранят причината за този срив. Ако е възможно, посочете точните стъпки. Всяка подробност е важна!</translation> <translation id="4876895919560854374">Заключване и отключване на екрана</translation> @@ -5075,6 +5085,7 @@ <translation id="5800351251499368110">Затваряне на лентата за търсене в страничния панел. Тя е отворена.</translation> <translation id="5801568494490449797">Предпочитания</translation> <translation id="5804241973901381774">Разрешения</translation> +<translation id="5805268472388605531">Натиснете и задръжте клавиш на клавиатурата, за да видите съответните диакритични и специални знаци</translation> <translation id="5805697420284793859">Мениджър на прозорците</translation> <translation id="5806447147478173900">Общо хранилище, използвано от посочените сайтове: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (по подразбиране)</translation> @@ -5716,6 +5727,7 @@ <translation id="642469772702851743">Това устройство (сериен № <ph name="SERIAL_NUMBER" />) бе заключено от собственика.</translation> <translation id="6425556984042222041">Скорост на синтезирания говор</translation> <translation id="642729974267661262">Сайтове без разрешение за възпроизвеждане на звук</translation> +<translation id="6427608534767366138">За „<ph name="NETWORK_ID" />“ се изисква удостоверяване чрез прокси сървър</translation> <translation id="6429384232893414837">Грешка при актуализирането</translation> <translation id="6430814529589430811">ASCII с кодиране Base64, единичен сертификат</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> ще настрои автоматични актуализации за всички потребители на този компютър.</translation> @@ -6434,6 +6446,7 @@ <translation id="7093220653036489319">Бързи отговори</translation> <translation id="7093416310351037609">С цел безопасност и сигурност на данните организацията ви изисква всички отговарящи на условията изтегляния да се запазват в профила ѝ в(ъв) <ph name="WEB_DRIVE" />.</translation> <translation id="7093866338626856921">Обмен на данни с устройствата със следните имена: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Приемете заявката за предаване на устройството си <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Устройство с USB-C (левият порт на гърба)</translation> <translation id="7098447629416471489">Тук ще се покажат другите запазени търсещи машини</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Премахване на приложението}other{Премахване на приложенията}}</translation> @@ -6534,6 +6547,7 @@ <translation id="7212097698621322584">Въведете текущия си ПИН код, за да го промените. Ако не го знаете, трябва да нулирате ключа за сигурност, след което да създадете нов ПИН код.</translation> <translation id="7213903639823314449">Търсеща машина, използвана в адресната лента</translation> <translation id="721490496276866468">Импортиране на пароли</translation> +<translation id="7218514093816577632">Уверете се, че известията са включени на устройството ви <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Открихме няколко профила, които могат да бъдат изтеглени. Преди да продължите, изберете кои да бъдат изтеглени.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Няма ненадеждни пароли}=1{1 ненадеждна парола}other{{NUM_WEAK} ненадеждни пароли}}</translation> <translation id="7220019174139618249">Паролите не могат да бъдат експортирани в папката „<ph name="FOLDER" />“</translation> @@ -7003,6 +7017,7 @@ <translation id="7664620655576155379">Неподдържано устройство с Bluetooth: <ph name="DEVICE_NAME" />.</translation> <translation id="7665082356120621510">Запазване на място</translation> <translation id="7665369617277396874">Добавяне на профил</translation> +<translation id="766635563210446220">Импортирането на паролите не е възможно. Проверете дали файлът <ph name="FILENAME" /> е форматиран правилно. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Върнете <ph name="DEVICE_TYPE" /> в рамките на {NUM_WEEKS} седмица}other{Върнете <ph name="DEVICE_TYPE" /> в рамките на {NUM_WEEKS} седмици}}</translation> <translation id="7668423670802040666">В мениджъра на паролите в Google за <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Функциите за достъпност улесняват използването на устройството ви. За достъп до бързите настройки изберете часа в долната част на екрана.</translation> @@ -7535,6 +7550,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{видеоклип}other{# видеоклипа}}</translation> <translation id="8143442547342702591">Невалидно приложение</translation> <translation id="8143609395536282994">Как можете да управлявате данните си:</translation> +<translation id="8145170459658034418">Икономия на памет</translation> <translation id="8146177459103116374">Ако вече сте регистрирани на това устройство, можете <ph name="LINK2_START" />да влезете като съществуващ потребител<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Добавете и подредете предпочитаните от вас езици. Когато е възможно, уебсайтовете ще се показват на тях. Тези предпочитания се синхронизират с настройките на браузъра. <ph name="BEGIN_LINK_LEARN_MORE" />Научете повече<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Влизането не бе успешно. Моля, свържете се с администратора си или опитайте отново.</translation> @@ -7594,6 +7610,7 @@ <translation id="8198456017687137612">Разделът се предава</translation> <translation id="8199300056570174101">Свойства на мрежата (услугата) и устройството</translation> <translation id="8200772114523450471">Възобновяване</translation> +<translation id="8200789660596905522">Не забравяйте да приемете заявката за предаване на устройството си <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Моля, въведете отново паролата си, за да актуализирате потребителския си профил за <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Име на устройството за „Споделяне наблизо“</translation> <translation id="8203732864715032075">Функция, която ви изпраща известия и по подразбиране запомня този компютър за Messages. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> @@ -7845,6 +7862,7 @@ <translation id="844063558976952706">Винаги на този сайт</translation> <translation id="8441313165929432954">Активиране/деактивиране на тетъринга</translation> <translation id="8443795068008423036">Проверете дали устройството ви е актуално и опитайте отново</translation> +<translation id="8443986842926457191">URL адресът е повече от 2048 знака</translation> <translation id="8446884382197647889">Научете повече</translation> <translation id="8447409163267621480">Използвайте или Ctrl, или Alt</translation> <translation id="844850004779619592">Няма намерени команди</translation> @@ -7910,6 +7928,7 @@ <translation id="851263357009351303">Да се разреши на <ph name="HOST" /> винаги да показва изображения</translation> <translation id="8513108775083588393">Автоматично</translation> <translation id="8514746246728959655">Опитайте с друг ключ за сигурност</translation> +<translation id="8519895319663397036">Импортирането на паролите не е възможно. Размерът на файла трябва да е по-малък от 150 КБ.</translation> <translation id="8523493869875972733">Запазване на промените</translation> <translation id="8523849605371521713">Добавено от правило</translation> <translation id="8524783101666974011">Запазване на картите в профила ви в Google</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 67fb87a..e90bf9f 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Ja gairebé és l'hora de fer una pausa</translation> <translation id="1062628064301375934">Ajuda'ns a crear un web més privat</translation> <translation id="1067048845568873861">Creada</translation> +<translation id="1067661089446014701">Per augmentar la seguretat, pots encriptar les contrasenyes al dispositiu abans que es desin al teu Compte de Google</translation> <translation id="1067922213147265141">Altres serveis de Google</translation> <translation id="1069355737714877171">Suprimeix el perfil d'eSIM anomenat <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Un altre programa de l'ordinador ha afegit una extensió que pot canviar el funcionament de Chrome. @@ -249,6 +250,7 @@ <translation id="1223853788495130632">L'administrador us recomana un valor específic per a aquesta configuració.</translation> <translation id="1225177025209879837">S'està processant la sol·licitud...</translation> <translation id="1227507814927581609">Ha fallat l'autenticació mentre es connectava a "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">No s'ha pogut emetre. Torna-ho a provar.</translation> <translation id="1230417814058465809">Està activada la protecció estàndard. Per augmentar la seguretat, utilitza la protecció millorada.</translation> <translation id="1231733316453485619">Vols activar la sincronització?</translation> <translation id="1232569758102978740">Sense títol</translation> @@ -1113,6 +1115,7 @@ <translation id="2031914984822377766">Afegeix els teus <ph name="LINK_BEGIN" />idiomes preferits per als llocs web<ph name="LINK_END" />. S'utilitzarà el primer idioma de la llista per a les traduccions.</translation> <translation id="2033758234986231162">No es pot mantenir la connexió amb el teu telèfon. Comprova que sigui a prop teu, que estigui desbloquejat i que tingui el Bluetooth i la Wi-Fi activats.</translation> <translation id="2034346955588403444">Afegeix una altra xarxa Wi-Fi</translation> +<translation id="2035211704574173780">Escala de grisos</translation> <translation id="203574396658008164">Activa la presa de notes des de la pantalla de bloqueig</translation> <translation id="2037445849770872822">S'ha configurat la supervisió d'aquest Compte de Google. Per configurar més controls parentals, selecciona Continua. @@ -2540,6 +2543,7 @@ <translation id="3363202073972776113">La teva organització gestionarà aquest perfil nou. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="3364986687961713424">De part de l'administrador: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Utilitza Ctrl o Alt</translation> +<translation id="3368586359109138591">Baixa una còpia per utilitzar-la en un altre lloc</translation> <translation id="3368922792935385530">Connectat</translation> <translation id="3369067987974711168">Mostra més accions per a aquest port</translation> <translation id="3369624026883419694">Resolent l'amfitrió...</translation> @@ -2728,6 +2732,7 @@ <translation id="3532273508346491126">Gestió de la sincronització</translation> <translation id="3532521178906420528">S'està establint la connexió a la xarxa...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" />: l'àudio està desactivat</translation> +<translation id="3536492240554502321">Rotació dels tons</translation> <translation id="3537881477201137177">Es pot modificar més endavant des de Configuració</translation> <translation id="3538066758857505094">S'ha produït un error en desinstal·lar Linux. Torna-ho a provar.</translation> <translation id="354060433403403521">Adaptador de CA</translation> @@ -3053,6 +3058,7 @@ <translation id="383669374481694771">Es tracta d'informació general sobre aquest dispositiu i sobre com es fa servir, com ara els errors, el nivell de bateria i l'activitat al sistema i en aplicacions. Les dades s'utilitzaran per millorar Android i part de la informació agregada també ajudarà les aplicacions i els partners de Google, com ara els desenvolupadors d'Android, a millorar les seves aplicacions i els seus productes.</translation> <translation id="3838085852053358637">No s'ha pogut carregar l'extensió</translation> <translation id="3838486795898716504">Més <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Afegeix les contrasenyes desades al gestor de contrasenyes de Google</translation> <translation id="383891835335927981">No s'ha ampliat ni reduït cap lloc</translation> <translation id="3839509547554145593">Activa l'acceleració de desplaçament del ratolí tàctil</translation> <translation id="3839516600093027468">No permetis mai que <ph name="HOST" /> vegi el porta-retalls</translation> @@ -4125,6 +4131,7 @@ <translation id="4871568871368204250">Desactiva la sincronització</translation> <translation id="4871719318659334896">Tanca el grup</translation> <translation id="4872192066608821120">Per importar contrasenyes, selecciona un fitxer CSV</translation> +<translation id="4872212987539553601">Configura l'encriptació al dispositiu</translation> <translation id="4873312501243535625">Comprovador de fitxers multimèdia</translation> <translation id="4876273079589074638">Ajuda els nostres enginyers a investigar i resoldre aquest error. Si pots, enumera els passos amb exactitud. Cap detall no és sobrer!</translation> <translation id="4876895919560854374">Bloqueja i desbloqueja la pantalla</translation> @@ -6423,6 +6430,7 @@ <translation id="7093220653036489319">Respostes ràpides</translation> <translation id="7093416310351037609">Per motius de seguretat de les dades, la teva organització requereix que totes les baixades aptes es desin al compte de <ph name="WEB_DRIVE" /> de la teva organització.</translation> <translation id="7093866338626856921">Intercanviar dades amb els dispositius <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Accepta la sol·licitud d'emissió al teu <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Dispositiu USB-C (port posterior esquerre)</translation> <translation id="7098447629416471489">Els altres motors de cerca desats es mostraran aquí</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Suprimeix l'aplicació}other{Suprimeix les aplicacions}}</translation> @@ -6523,6 +6531,7 @@ <translation id="7212097698621322584">Introdueix el PIN actual per canviar-lo. Si no el saps, hauràs de restablir la clau de seguretat i, a continuació, crear un PIN nou.</translation> <translation id="7213903639823314449">Motor de cerca que s'utilitza a la barra d'adreces.</translation> <translation id="721490496276866468">Importa les contrasenyes</translation> +<translation id="7218514093816577632">Assegura't que les notificacions estiguin activades al teu <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Hem trobat diversos perfils que es poden baixar. Selecciona els que vulguis baixar abans de continuar.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Cap contrasenya poc segura}=1{1 contrasenya poc segura}other{{NUM_WEAK} contrasenyes poc segures}}</translation> <translation id="7220019174139618249">No es poden exportar les contrasenyes a <ph name="FOLDER" /></translation> @@ -6992,6 +7001,7 @@ <translation id="7664620655576155379">Dispositiu Bluetooth no compatible: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Reserva la mida</translation> <translation id="7665369617277396874">Afegeix un compte</translation> +<translation id="766635563210446220">No es poden importar les contrasenyes. Comprova <ph name="FILENAME" /> i assegura't que el format sigui correcte. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Torna el dispositiu <ph name="DEVICE_TYPE" /> en un termini d‘{NUM_WEEKS} setmana}other{Torna el dispositiu <ph name="DEVICE_TYPE" /> en un termini de {NUM_WEEKS} setmanes}}</translation> <translation id="7668423670802040666">Al gestor de contrasenyes de Google per a <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Amb les funcions d'accessibilitat, el teu dispositiu és més fàcil d'utilitzar. Per accedir a Configuració ràpida, selecciona l'hora a la part inferior de la pantalla.</translation> @@ -7524,6 +7534,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{1 vídeo}other{# vídeos}}</translation> <translation id="8143442547342702591">Aplicació no vàlida</translation> <translation id="8143609395536282994">Com pots gestionar les teves dades:</translation> +<translation id="8145170459658034418">Estalvi de memòria</translation> <translation id="8146177459103116374">Si ja esteu registrat en aquest dispositiu, podeu <ph name="LINK2_START" />iniciar la sessió com a usuari existent<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Afegeix i classifica els teus idiomes preferits. Quan sigui possible, els llocs web es mostraran en aquests idiomes. Aquestes preferències se sincronitzen amb la configuració del navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Més informació<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">No s'ha pogut iniciar la sessió. Contacteu amb l'administrador o torneu-ho a provar.</translation> @@ -7583,6 +7594,7 @@ <translation id="8198456017687137612">S'està emetent la pestanya</translation> <translation id="8199300056570174101">Xarxa (servei) i propietats del dispositiu</translation> <translation id="8200772114523450471">Reprèn</translation> +<translation id="8200789660596905522">Assegura't d'acceptar la sol·licitud d'emissió al teu <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Torneu a introduir la contrasenya per actualitzar el vostre perfil del dispositiu <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Nom del dispositiu de Compartició Nearby</translation> <translation id="8203732864715032075">Enviar-te notificacions en aquest ordinador i establir-lo com a predeterminat per a Missatges. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 427ad159d..b8d245f2 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Bron amser i gael seibiant</translation> <translation id="1062628064301375934">Helpwch ni i ddatblygu gwe fwy preifat</translation> <translation id="1067048845568873861">Crëwyd</translation> +<translation id="1067661089446014701">Er mwyn diogelwch ychwanegol, gallwch amgryptio cyfrineiriau ar eich dyfais cyn iddynt gael eu cadw yn eich Cyfrif Google</translation> <translation id="1067922213147265141">Gwasanaethau Google eraill</translation> <translation id="1069355737714877171">Tynnu'r proffil eSIM o'r enw <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Ychwanegodd rhaglen arall ar eich cyfrifiadur estyniad a allai newid y ffordd y mae Chrome yn gweithio. @@ -255,6 +256,7 @@ <translation id="1223853788495130632">Mae eich gweinyddwr yn argymell gwerth penodol ar gyfer y gosodiad hwn.</translation> <translation id="1225177025209879837">Wrthi'n prosesu'r cais...</translation> <translation id="1227507814927581609">Methwyd â dilysu wrth gysylltu i "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">Wedi methu â chastio. Rhowch gynnig arall arni.</translation> <translation id="1230417814058465809">Mae amddiffyniad safonol wedi'i droi ymlaen. Am fwy fyth o ddiogelwch, defnyddiwch well amddiffyniad.</translation> <translation id="1231733316453485619">Troi cysoni ymlaen?</translation> <translation id="1232569758102978740">Di-deitl</translation> @@ -698,6 +700,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 Gydag Amgryptio RSA</translation> <translation id="1641113438599504367">Pori'n Ddiogel</translation> <translation id="1641496881756082050">Rhagor o gamau gweithredu ar gyfer <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Ni fewnforiwyd 1 cyfrinair arall oherwydd ei fod wedi'i fformatio'n anghywir}zero{Ni fewnforiwyd {NUM_PASSWORDS} cyfrinair arall oherwydd eu bod wedi'u fformatio'n anghywir}two{Ni fewnforiwyd {NUM_PASSWORDS} cyfrinair arall oherwydd eu bod wedi'u fformatio'n anghywir}few{Ni fewnforiwyd {NUM_PASSWORDS} cyfrinair arall oherwydd eu bod wedi'u fformatio'n anghywir}many{Ni fewnforiwyd {NUM_PASSWORDS} cyfrinair arall oherwydd eu bod wedi'u fformatio'n anghywir}other{Ni fewnforiwyd {NUM_PASSWORDS} cyfrinair arall oherwydd eu bod wedi'u fformatio'n anghywir}}</translation> <translation id="1642492862748815878">Wedi'i gysylltu i <ph name="DEVICE" /> a <ph name="NUMBER_OF_DEVICES" /> o ddyfeisiau Bluetooth eraill</translation> <translation id="1642494467033190216">Mae angen cael gwared ar amddiffyniad rootfs ac ailgychwyn cyn galluogi nodweddion dadfygio eraill.</translation> <translation id="1643072738649235303">Llofnod X9.62 ECDSA â SHA-1</translation> @@ -1127,6 +1130,7 @@ <translation id="2031914984822377766">Ychwanegu eich <ph name="LINK_BEGIN" />ieithoedd gwefan<ph name="LINK_END" /> a ffefrir. Defnyddir yr iaith o frig y rhestr ar gyfer cyfieithiadau.</translation> <translation id="2033758234986231162">Methu â chynnal cysylltiad â'ch ffôn. Gwnewch yn siŵr bod eich ffôn gerllaw, wedi'i ddatgloi a bod Bluetooth a Wi-Fi ymlaen.</translation> <translation id="2034346955588403444">Ychwanegu rhwydwaith Wi-Fi arall</translation> +<translation id="2035211704574173780">Graddlwyd</translation> <translation id="203574396658008164">Galluogi cymryd nodiadau o'r clo sgrîn</translation> <translation id="2037445849770872822">Mae goruchwyliaeth wedi'i gosod ar gyfer y Cyfrif Google hwn. I osod rhagor o reolaethau rhieni, dewiswch Parhau. @@ -1183,6 +1187,7 @@ <translation id="208634871997892083">VPN ymlaen drwy'r amser</translation> <translation id="2087822576218954668">Argraffu: <ph name="PRINT_NAME" /></translation> <translation id="2088092308059522196">Dim ond ar ôl gosod <ph name="DEVICE_OS" /> y cefnogir cofrestru.</translation> +<translation id="2089090684895656482">Llai</translation> <translation id="208928984520943006">I gyrraedd y sgrîn Hafan ar unrhyw adeg, sweipiwch i fyny o'r gwaelod.</translation> <translation id="2089566709556890888">Pori'n ddiogel gyda Google Chrome</translation> <translation id="2089795179672254991">Gofyn pan fydd gwefan eisiau gweld testun a lluniau sydd wedi'u copïo i'r clipfwrdd (argymhellir)</translation> @@ -1846,6 +1851,7 @@ <translation id="2673135533890720193">Darllen eich hanes pori</translation> <translation id="2674764818721168631">Diffodd</translation> <translation id="2678063897982469759">Ail-alluogi</translation> +<translation id="2678100101831051676">Methu â chastio.</translation> <translation id="268053382412112343">Ha&nes</translation> <translation id="2681124317993121768">Ni chefnogir proffiliau gwestai</translation> <translation id="2682498795777673382">Diweddariad o dy riant</translation> @@ -2555,6 +2561,7 @@ <translation id="3363202073972776113">Bydd y proffil newydd hwn yn cael ei reoli gan eich sefydliad. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Gan eich gweinyddwr: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Defnyddiwch naill ai Ctrl neu Alt</translation> +<translation id="3368586359109138591">Lawrlwytho copi i'w ddefnyddio yn rhywle arall</translation> <translation id="3368922792935385530">Wedi cysylltu</translation> <translation id="3369067987974711168">Dangos rhagor o gamau gweithredu ar gyfer y porth hwn</translation> <translation id="3369624026883419694">Wrthi'n datrys y gwesteiwr...</translation> @@ -2743,6 +2750,7 @@ <translation id="3532273508346491126">Rheoli cysoni</translation> <translation id="3532521178906420528">Wrthi'n sefydlu cysylltiad rhwydwaith ...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - Sain wedi'i ddistewi</translation> +<translation id="3536492240554502321">Cylchdro arlliw</translation> <translation id="3537881477201137177">Gellir addasu hyn yn nes ymlaen yn y Gosodiadau</translation> <translation id="3538066758857505094">Bu gwall wrth ddadosod Linux. Rhowch gynnig arall arni.</translation> <translation id="354060433403403521">Addasydd AC</translation> @@ -3068,6 +3076,7 @@ <translation id="383669374481694771">Dyma wybodaeth gyffredinol am y ddyfais hon a sut mae'n cael ei defnyddio (megis lefel batri, gweithgarwch system ac apiau, a gwallau). Defnyddir y data i wella Android, a bydd rhywfaint o wybodaeth gyfun hefyd yn helpu apiau a phartneriaid Google, megis datblygwyr Android, i wella eu hapiau a'u cynhyrchion.</translation> <translation id="3838085852053358637">Methu â llwytho'r estyniad</translation> <translation id="3838486795898716504">Rhagor o <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Ychwanegu cyfrineiriau sydd wedi'u cadw at Reolwr Cyfrineiriau Google</translation> <translation id="383891835335927981">Nid oes unrhyw wefannau wedi cael eu chwyddo na'u pellhau</translation> <translation id="3839509547554145593">Galluogi cyflymu sgrolio gyda llygoden</translation> <translation id="3839516600093027468">Rhwystro <ph name="HOST" /> bob amser rhag gweld y clipfwrdd</translation> @@ -3880,6 +3889,7 @@ <translation id="4617019240346358451">Ail-lwythwch y dudalen i ddefnyddio "<ph name="EXTENSION_NAME" />"</translation> <translation id="4617270414136722281">Dewisiadau'r estyniad</translation> <translation id="4617880081511131945">Methu â sefydlu cysylltiad</translation> +<translation id="4618195822946934889">Dim ond nodau ASCII y gall yr URL eu cynnwys</translation> <translation id="4619564267100705184">Cadarnhewch mai chi sydd yno</translation> <translation id="4619615317237390068">Tabiau o ddyfeisiau eraill</translation> <translation id="4620809267248568679">Gorfodir y gosodiad hwn gan estyniad.</translation> @@ -4141,6 +4151,7 @@ <translation id="4871568871368204250">Diffodd cysoni</translation> <translation id="4871719318659334896">Cau'r grŵp</translation> <translation id="4872192066608821120">I fewnforio cyfrineiriau, dewiswch ffeil CSV</translation> +<translation id="4872212987539553601">Sefydlu amgryptio ar y ddyfais</translation> <translation id="4873312501243535625">Gwiriwr Ffeiliau Cyfryngau</translation> <translation id="4876273079589074638">Helpwch ein peirianwyr i ymchwilio a thrwsio'r toriad hwn. Rhestrwch yr union gamau os gallwch chi. Nid oes unrhyw fanylion yn rhy fach!</translation> <translation id="4876895919560854374">Cloi a datgloi’r sgrîn</translation> @@ -5078,6 +5089,7 @@ <translation id="5800351251499368110">Cau chwilio yn y panel ochr. Mae chwilio ar agor yn y panel ochr.</translation> <translation id="5801568494490449797">Dewisiadau</translation> <translation id="5804241973901381774">Caniatadau</translation> +<translation id="5805268472388605531">Pwyswch a daliwch fysellau bysellfwrdd i weld acenion a nodau arbennig</translation> <translation id="5805697420284793859">Rheolwr ffenestri</translation> <translation id="5806447147478173900">Cyfanswm y storfa a ddefnyddir gan y gwefannau a ddangosir: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Diofyn)</translation> @@ -5719,6 +5731,7 @@ <translation id="642469772702851743">Cafodd y ddyfais hon (SN: <ph name="SERIAL_NUMBER" />) ei chloi gan y gweinyddwr.</translation> <translation id="6425556984042222041">Cyfradd testun i leferydd</translation> <translation id="642729974267661262">Ni chaniateir chwarae sain</translation> +<translation id="6427608534767366138">Mae angen dilysu dirprwy ar gyfer "<ph name="NETWORK_ID" />"</translation> <translation id="6429384232893414837">Gwall diweddaru</translation> <translation id="6430814529589430811">ASCII sylfaen 64 wedi'i hencodio, tystysgrif sengl</translation> <translation id="6431347207794742960">Bydd <ph name="PRODUCT_NAME" /> yn sefydlu diweddariadau awtomatig ar gyfer holl ddefnyddwyr y cyfrifiadur hwn.</translation> @@ -6445,6 +6458,7 @@ <translation id="7093220653036489319">Atebion cyflym</translation> <translation id="7093416310351037609">Ar gyfer diogelwch data, mae eich sefydliad yn mynnu bod lawrlwythiadau cymwys yn cael eu cadw i gyfrif <ph name="WEB_DRIVE" /> eich sefydliad.</translation> <translation id="7093866338626856921">Cyfnewid data gyda'r dyfeisiau a enwir: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Derbyn cais Cast ar eich <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Dyfais USB-C (porth chwith ar y cefn)</translation> <translation id="7098447629416471489">Bydd peiriannau chwilio eraill a gadwyd yn ymddangos yma</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Tynnu Ap}zero{Tynnu Apiau}two{Tynnu Apiau}few{Tynnu Apiau}many{Tynnu Apiau}other{Tynnu Apiau}}</translation> @@ -6545,6 +6559,7 @@ <translation id="7212097698621322584">Rhowch eich PIN presennol i'w newid. Os nad ydych yn gwybod eich PIN, bydd angen i chi ailosod yr allwedd ddiogelwch a chreu PIN newydd.</translation> <translation id="7213903639823314449">Peiriant chwilio sy'n cael i ddefnyddio yn y bar cyfeiriadau</translation> <translation id="721490496276866468">Mewnforio cyfrineiriau</translation> +<translation id="7218514093816577632">Gwnewch yn siŵr bod hysbysiadau wedi'u troi ymlaen ar eich <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Rydym wedi dod o hyd i sawl proffil sydd ar gael i'w lawrlwytho. Dewiswch y rhai yr hoffech eu lawrlwytho cyn parhau.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Nid oes unrhyw gyfrineiriau gwan}=1{Mae 1 cyfrinair gwan}two{Mae {NUM_WEAK} gyfrinair gwan}few{Mae {NUM_WEAK} chyfrinair gwan}many{Mae {NUM_WEAK} chyfrinair gwan}other{Mae {NUM_WEAK} cyfrinair gwan}}</translation> <translation id="7220019174139618249">Methu ag allforio cyfrineiriau i "<ph name="FOLDER" />"</translation> @@ -6778,6 +6793,7 @@ <translation id="744341768939279100">Creu proffil newydd</translation> <translation id="744366959743242014">Wrthi'n llwytho data, mae'n bosib y bydd hyn yn cymryd hyd at ychydig eiliadau.</translation> <translation id="7443806024147773267">Gallwch gael mynediad at eich cyfrineiriau pryd bynnag y byddwch wedi mewngofnodi i'ch Cyfrif Google</translation> +<translation id="7444046173054089907">Mae'r wefan hon wedi'i rhwystro</translation> <translation id="7444970023873202833">Archwilio rhagor o'ch atgofion yn Google Photos</translation> <translation id="7444983668544353857">Analluogi <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Gosod apiau yn awtomatig</translation> @@ -7013,6 +7029,7 @@ <translation id="7664620655576155379">Dyfais Bluetooth nad yw'n cael ei chefnogi "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Ailwneud newid maint</translation> <translation id="7665369617277396874">Ychwanegu cyfrif</translation> +<translation id="766635563210446220">Methu â mewnforio cyfrineiriau. Gwiriwch <ph name="FILENAME" /> a gwnewch yn siŵr ei fod wedi'i fformatio'n gywir. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Dychwelwch <ph name="DEVICE_TYPE" /> o fewn {NUM_WEEKS} wythnos}zero{Dychwelwch <ph name="DEVICE_TYPE" /> o fewn {NUM_WEEKS} wythnos}two{Dychwelwch <ph name="DEVICE_TYPE" /> o fewn {NUM_WEEKS} wythnos}few{Dychwelwch <ph name="DEVICE_TYPE" /> o fewn {NUM_WEEKS} wythnos}many{Dychwelwch <ph name="DEVICE_TYPE" /> o fewn {NUM_WEEKS} wythnos}other{Dychwelwch <ph name="DEVICE_TYPE" /> o fewn {NUM_WEEKS} wythnos}}</translation> <translation id="7668423670802040666">Yn Rheolwr Cyfrineiriau Google ar gyfer <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Mae nodweddion hygyrchedd yn gwneud eich dyfais yn haws i'w defnyddio. I gael mynediad at y Gosodiadau Cyflym, dewiswch yr amser ar waelod eich sgrîn.</translation> @@ -7544,6 +7561,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{fideo}zero{# fideo}two{# fideo}few{# fideo}many{# fideo}other{# fideo}}</translation> <translation id="8143442547342702591">Ap annilys</translation> <translation id="8143609395536282994">Sut allwch chi reoli'ch data:</translation> +<translation id="8145170459658034418">Arbedwr Cof</translation> <translation id="8146177459103116374">Os ydych eisoes wedi cofrestru ar y ddyfais hon, gallwch <ph name="LINK2_START" />fewngofnodi fel defnyddiwr presennol<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Ychwanegu a threfnu eich ieithoedd a ffefrir. Bydd gwefannau yn ymddangos yn eich ieithoedd a ffefrir, pan fydd hynny'n bosib. Mae'r dewisiadau hyn wedi'u cysoni â gosodiadau eich porwr. <ph name="BEGIN_LINK_LEARN_MORE" />Dysgu rhagor<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Wedi methu â mewngofnodi. Cysylltwch â'ch gweinyddwr neu rhowch gynnig arall arni.</translation> @@ -7603,6 +7621,7 @@ <translation id="8198456017687137612">Wrthi'n castio tab</translation> <translation id="8199300056570174101">Priodweddau'r Rhwydwaith (Gwasanaeth) a'r Ddyfais</translation> <translation id="8200772114523450471">Parhau</translation> +<translation id="8200789660596905522">Gwnewch yn siŵr eich bod yn derbyn y cais Cast ar eich <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Rhowch eich cyfrinair eto i ddiweddaru'ch proffil <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Enw dyfais Rhannu Gerllaw</translation> <translation id="8203732864715032075">Anfon hysbysiadau atoch a chofio'r cyfrifiadur hwn ar gyfer Negeseuon yn ddiofyn. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> @@ -7852,6 +7871,7 @@ <translation id="844063558976952706">Bob amser ar y wefan hon</translation> <translation id="8441313165929432954">Galluogi/Analluogi Rhannu Cysylltiad</translation> <translation id="8443795068008423036">Gwnewch yn siŵr bod eich dyfais yn gyfredol a rhowch gynnig arall arni</translation> +<translation id="8443986842926457191">Mae'r URL yn fwy na 2048 nod</translation> <translation id="8446884382197647889">Dysgu rhagor</translation> <translation id="8447409163267621480">Cynnwys naill ai Ctrl neu Alt</translation> <translation id="844850004779619592">Heb ganfod unrhyw orchmynion</translation> @@ -7917,6 +7937,7 @@ <translation id="851263357009351303">Caniatáu i <ph name="HOST" /> ddangos lluniau bob amser</translation> <translation id="8513108775083588393">Awtogylchdroi</translation> <translation id="8514746246728959655">Rhowch gynnig ar allwedd ddiogelwch wahanol</translation> +<translation id="8519895319663397036">Methu â mewnforio cyfrineiriau. Dylai maint y ffeil fod yn llai na 150 KB.</translation> <translation id="8523493869875972733">Cadw'r Newidiadau</translation> <translation id="8523849605371521713">Ychwanegwyd gan bolisi</translation> <translation id="8524783101666974011">Cadw cardiau yn eich Cyfrif Google</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index e5b5138..0a178e1f9 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Det er snart tid til en pause</translation> <translation id="1062628064301375934">Hjælp os med at skabe et mere privat internet</translation> <translation id="1067048845568873861">Oprettet</translation> +<translation id="1067661089446014701">Øg sikkerheden ved at kryptere adgangskoder på din enhed, før de gemmes på din Google-konto</translation> <translation id="1067922213147265141">Andre Google-tjenester</translation> <translation id="1069355737714877171">Fjern eSIM-profilen ved navn <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Et andet program på din computer har tilføjet en udvidelse, som kan ændre måden, Chrome fungerer på. @@ -252,6 +253,7 @@ <translation id="1223853788495130632">Din administrator anbefaler en bestemt værdi for denne indstilling.</translation> <translation id="1225177025209879837">Behandler anmodning...</translation> <translation id="1227507814927581609">Godkendelsen mislykkedes under oprettelse af forbindelse til "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">Det lykkedes ikke at caste – prøv igen</translation> <translation id="1230417814058465809">Standardbeskyttelse er aktiveret. Du kan øge sikkerheden ved at bruge forbedret beskyttelse.</translation> <translation id="1231733316453485619">Vil du aktivere synkronisering?</translation> <translation id="1232569758102978740">Unavngivet</translation> @@ -696,6 +698,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 med RSA-kryptering</translation> <translation id="1641113438599504367">Beskyttet browsing</translation> <translation id="1641496881756082050">Flere handlinger for <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{1 anden adgangskode blev ikke importeret, fordi den er formateret forkert}one{{NUM_PASSWORDS} anden adgangskode blev ikke importeret, fordi den er formateret forkert}other{{NUM_PASSWORDS} andre adgangskoder blev ikke importeret, fordi de er formateret forkert}}</translation> <translation id="1642492862748815878">Der er oprettet forbindelse til <ph name="DEVICE" /> og <ph name="NUMBER_OF_DEVICES" /> andre Bluetooth-enheder</translation> <translation id="1642494467033190216">Fjernelse af rootfs-beskyttelse og efterfølgende genstart er påkrævet, før du aktiverer andre fejlretningsfunktioner.</translation> <translation id="1643072738649235303">X9.62 ECDSA-signatur med SHA-1</translation> @@ -1125,6 +1128,7 @@ <translation id="2031914984822377766">Tilføj dine foretrukne <ph name="LINK_BEGIN" />sprog for websites<ph name="LINK_END" />. De øverste sprog på listen anvendes til oversættelser.</translation> <translation id="2033758234986231162">Forbindelsen til din telefon kan ikke opretholdes. Sørg for, at din telefon er i nærheden og låst op, og at Bluetooth og Wi-Fi er aktiveret.</translation> <translation id="2034346955588403444">Tilføj andre Wi-Fi-netværk</translation> +<translation id="2035211704574173780">Gråtoner</translation> <translation id="203574396658008164">Aktivér notatskrivning via låseskærmen</translation> <translation id="2037445849770872822">Forældrestyring er konfigureret for denne Google-konto. Hvis du vil konfigurere yderligere forældrestyring, skal du vælge Fortsæt. @@ -1845,6 +1849,7 @@ <translation id="2673135533890720193">Læse din browserhistorik</translation> <translation id="2674764818721168631">Fra</translation> <translation id="2678063897982469759">Genaktiver</translation> +<translation id="2678100101831051676">Det var ikke muligt at caste.</translation> <translation id="268053382412112343">Over&sigt</translation> <translation id="2681124317993121768">Gæsteprofiler understøttes ikke</translation> <translation id="2682498795777673382">Opdatering fra din forælder</translation> @@ -2554,6 +2559,7 @@ <translation id="3363202073972776113">Denne nye profil administreres af din organisation. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Fra din administrator: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Brug enten Ctrl eller Alt</translation> +<translation id="3368586359109138591">Download en kopi, du kan bruge andre steder</translation> <translation id="3368922792935385530">Tilsluttet</translation> <translation id="3369067987974711168">Se flere handlinger for denne port</translation> <translation id="3369624026883419694">Identificerer vært...</translation> @@ -2742,6 +2748,7 @@ <translation id="3532273508346491126">Administration af synkronisering</translation> <translation id="3532521178906420528">Opretter netværksforbindelse...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – lyden er slået fra</translation> +<translation id="3536492240554502321">Skift af farvetone</translation> <translation id="3537881477201137177">Du kan ændre dette senere i indstillingerne</translation> <translation id="3538066758857505094">Der opstod en fejl under installationen af Linux. Prøv igen.</translation> <translation id="354060433403403521">Vekselstrømsadapter</translation> @@ -3067,6 +3074,7 @@ <translation id="383669374481694771">Dette er generelle oplysninger om denne enhed og brugen af den (f.eks. batteriniveau, system- og appaktivitet samt fejl). Dataene bruges til at forbedre Android, og visse samlede oplysninger kan også hjælpe partnere som f.eks. Android-udviklere med at forbedre deres apps og produkter.</translation> <translation id="3838085852053358637">Udvidelsen kunne ikke indlæses</translation> <translation id="3838486795898716504">Flere <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Føj gemte adgangskoder til Google Adgangskodeadministrator</translation> <translation id="383891835335927981">Der er ikke zoomet ind eller ud på nogen websites</translation> <translation id="3839509547554145593">Aktivér acceleration af rulning på mus</translation> <translation id="3839516600093027468">Bloker altid <ph name="HOST" /> fra at se udklipsholderen</translation> @@ -3879,6 +3887,7 @@ <translation id="4617019240346358451">Genindlæs siden for at anvende "<ph name="EXTENSION_NAME" />"</translation> <translation id="4617270414136722281">Valgmuligheder for udvidelser</translation> <translation id="4617880081511131945">Der kan ikke oprettes forbindelse</translation> +<translation id="4618195822946934889">Webadressen må kun indeholde ASCII-tegn</translation> <translation id="4619564267100705184">Bekræft din identitet</translation> <translation id="4619615317237390068">Faner fra andre enheder</translation> <translation id="4620809267248568679">Denne indstilling håndhæves af en udvidelse.</translation> @@ -4140,6 +4149,7 @@ <translation id="4871568871368204250">Deaktiver synkronisering</translation> <translation id="4871719318659334896">Luk gruppe</translation> <translation id="4872192066608821120">Vælg en CSV-fil for at importere adgangskoder</translation> +<translation id="4872212987539553601">Konfigurer kryptering på enheden</translation> <translation id="4873312501243535625">Mediefilkontrol</translation> <translation id="4876273079589074638">Hjælp vores softwareudviklere med at undersøge og løse dette nedbrud. Angiv så vidt muligt præcist, hvad du gjorde. Alle detaljer er vigtige.</translation> <translation id="4876895919560854374">Låse skærmen/låse skærmen op</translation> @@ -5078,6 +5088,7 @@ <translation id="5800351251499368110">Luk søgning i sidepanel. Søgningen er åben i sidepanelet.</translation> <translation id="5801568494490449797">Præferencer</translation> <translation id="5804241973901381774">Tilladelser</translation> +<translation id="5805268472388605531">Hold tastaturtasterne nede for at se accenttegn og specialtegn</translation> <translation id="5805697420284793859">Vinduesadministrator</translation> <translation id="5806447147478173900">Samlet lagerplads, der bruges af de viste websites: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (standard)</translation> @@ -5719,6 +5730,7 @@ <translation id="642469772702851743">Denne enhed (serienummer: <ph name="SERIAL_NUMBER" />) blev låst af ejeren.</translation> <translation id="6425556984042222041">Hastighed ved oplæsning</translation> <translation id="642729974267661262">Har ikke tilladelse til at afspille lyd</translation> +<translation id="6427608534767366138">Proxygodkendelse er påkrævet for "<ph name="NETWORK_ID" />"</translation> <translation id="6429384232893414837">Opdateringsfejl</translation> <translation id="6430814529589430811">Base64-kodet ASCII, enkeltcertifikat</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> konfigurerer automatiske opdateringer for alle brugere af denne computer.</translation> @@ -6439,6 +6451,7 @@ <translation id="7093220653036489319">Hurtig info</translation> <translation id="7093416310351037609">Af hensyn til sikkerheden og databeskyttelse kræver din organisation, at alle kvalificerede downloads gemmes på din organisations <ph name="WEB_DRIVE" />-konto.</translation> <translation id="7093866338626856921">Udveksle data med enhederne ved navn: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Acceptér Cast-anmodningen på din <ph name="DEVICE_NAME" /></translation> <translation id="7098389117866926363">USB-C-enhed (porten bagpå i venstre side)</translation> <translation id="7098447629416471489">Andre gemte søgemaskiner vises her</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Fjern app}one{Fjern app}other{Fjern apps}}</translation> @@ -6539,6 +6552,7 @@ <translation id="7212097698621322584">Angiv din aktuelle pinkode for at ændre den. Hvis du ikke kender din pinkode, skal du nulstille sikkerhedsnøglen og derefter oprette en ny pinkode.</translation> <translation id="7213903639823314449">Den søgemaskine, der bruges i adresselinjen</translation> <translation id="721490496276866468">Importér adgangskoder</translation> +<translation id="7218514093816577632">Sørg for, at notifikationer er aktiveret på din <ph name="DEVICE_NAME" /></translation> <translation id="7219473482981809164">Vi har fundet flere profiler, der kan downloades. Vælg dem, du vil downloade, før du fortsætter.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Ingen svage adgangskoder}=1{1 svag adgangskode}one{{NUM_WEAK} svag adgangskode}other{{NUM_WEAK} svage adgangskoder}}</translation> <translation id="7220019174139618249">Adgangskoderne kan ikke eksporteres til "<ph name="FOLDER" />"</translation> @@ -7008,6 +7022,7 @@ <translation id="7664620655576155379">Ikke-understøttet Bluetooth-enhed: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Reservér størrelse</translation> <translation id="7665369617277396874">Tilføj konto</translation> +<translation id="766635563210446220">Adgangskoderne kan ikke importeres. Tjek <ph name="FILENAME" />, og sørg for, at den er formateret korrekt. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Returner <ph name="DEVICE_TYPE" /> inden for {NUM_WEEKS} uge}one{Returner <ph name="DEVICE_TYPE" /> inden for {NUM_WEEKS} uge}other{Returner <ph name="DEVICE_TYPE" /> inden for {NUM_WEEKS} uger}}</translation> <translation id="7668423670802040666">I Google Adgangskodeadministrator for <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Hjælpefunktioner gør din enhed nemmere at bruge. Du kan få adgang til kvikmenuen ved at vælge klokkeslættet nederst på skærmen.</translation> @@ -7539,6 +7554,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{en video}one{# video}other{# videoer}}</translation> <translation id="8143442547342702591">Ugyldig app</translation> <translation id="8143609395536282994">Sådan kan du administrere dine data</translation> +<translation id="8145170459658034418">Hukommelsessparefunktion</translation> <translation id="8146177459103116374">Hvis du allerede har registreret dig på denne enhed, kan du <ph name="LINK2_START" />logge ind som eksisterende bruger<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Tilføj og rangér dine foretrukne sprog. Websites vises på dine foretrukne sprog, hvis det er muligt. Disse præferencer synkroniseres med dine browserindstillinger. <ph name="BEGIN_LINK_LEARN_MORE" />Få flere oplysninger<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Login mislykkedes. Kontakt din administrator, eller prøv igen.</translation> @@ -7598,6 +7614,7 @@ <translation id="8198456017687137612">Caster fane</translation> <translation id="8199300056570174101">Egenskaber for netværkstjeneste og enhed</translation> <translation id="8200772114523450471">Genoptag</translation> +<translation id="8200789660596905522">Sørg for at acceptere Cast-anmodningen på din <ph name="DEVICE_NAME" /></translation> <translation id="8202160505685531999">Angiv adgangskoden igen for at opdatere din <ph name="DEVICE_TYPE" />-profil.</translation> <translation id="8203152941016626022">Enhedsnavn til Deling tæt på</translation> <translation id="8203732864715032075">Sende dig notifikationer og huske denne computer som standard til Beskeder. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> @@ -7849,6 +7866,7 @@ <translation id="844063558976952706">Altid på dette website</translation> <translation id="8441313165929432954">Aktivér/deaktiver netdeling</translation> <translation id="8443795068008423036">Tjek, at din enhed er opdateret, og prøv igen</translation> +<translation id="8443986842926457191">Webadressen indeholder mere end 2.048 tegn</translation> <translation id="8446884382197647889">Få flere oplysninger</translation> <translation id="8447409163267621480">Skal indeholde enten Ctrl eller Alt</translation> <translation id="844850004779619592">Der blev ikke fundet nogen kommandoer</translation> @@ -7914,6 +7932,7 @@ <translation id="851263357009351303">Tillad altid, at <ph name="HOST" /> viser billeder</translation> <translation id="8513108775083588393">Autoroter</translation> <translation id="8514746246728959655">Prøv med en anden sikkerhedsnøgle</translation> +<translation id="8519895319663397036">Adgangskoderne kan ikke importeres. Filen må maks. være på 150 kB.</translation> <translation id="8523493869875972733">Behold ændringerne</translation> <translation id="8523849605371521713">Tilføjet af politik</translation> <translation id="8524783101666974011">Gem kort på din Google-konto</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 80e36db..24b2525 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Bald ist es Zeit für eine Pause</translation> <translation id="1062628064301375934">Hilf uns, den Datenschutz im Web zu verbessern</translation> <translation id="1067048845568873861">Erstellt</translation> +<translation id="1067661089446014701">Für zusätzliche Sicherheit kannst du Passwörter auf deinem Gerät verschlüsseln lassen, bevor sie in deinem Google-Konto gespeichert werden</translation> <translation id="1067922213147265141">Weitere Google-Dienste</translation> <translation id="1069355737714877171">eSIM-Profil „<ph name="PROFILE_NAME" />“ entfernen</translation> <translation id="1070377999570795893">Ein anderes Programm auf deinem Computer hat eine Erweiterung hinzugefügt, die sich möglicherweise auf die Funktionsweise von Chrome auswirkt. @@ -249,6 +250,7 @@ <translation id="1223853788495130632">Dein Administrator empfiehlt einen bestimmten Wert für diese Einstellung.</translation> <translation id="1225177025209879837">Deine Anfrage wird verarbeitet...</translation> <translation id="1227507814927581609">Beim Herstellen der Verbindung zu "<ph name="DEVICE_NAME" />" ist ein Authentifizierungsfehler aufgetreten.</translation> +<translation id="1227993798763400520">Streamen fehlgeschlagen. Bitte versuche es noch einmal.</translation> <translation id="1230417814058465809">Standardschutz ist aktiviert. Der erweiterte Schutz bietet noch mehr Sicherheit.</translation> <translation id="1231733316453485619">Synchronisierung aktivieren?</translation> <translation id="1232569758102978740">Unbenannt</translation> @@ -1110,6 +1112,7 @@ <translation id="2031914984822377766">Füge die gewünschten <ph name="LINK_BEGIN" />Website-Sprachen<ph name="LINK_END" /> hinzu. Die erste Sprache auf der Liste wird für Übersetzungen verwendet.</translation> <translation id="2033758234986231162">Verbindung mit deinem Smartphone kann nicht aufrechterhalten werden. Dein Smartphone muss sich in der Nähe befinden und entsperrt sein. Außerdem müssen Bluetooth und WLAN aktiviert sein.</translation> <translation id="2034346955588403444">Anderes WLAN hinzufügen</translation> +<translation id="2035211704574173780">Graustufen</translation> <translation id="203574396658008164">Notizen über Sperrbildschirm aktivieren</translation> <translation id="2037445849770872822">Für dieses Google-Konto wurde die Elternaufsicht eingerichtet. Wenn du zusätzliche Jugendschutzeinstellungen konfigurieren möchtest, wähle "Weiter" aus. @@ -2537,6 +2540,7 @@ <translation id="3363202073972776113">Dieses neue Profil wird von deiner Organisation verwaltet. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Von deinem Administrator: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Verwende entweder Strg oder Alt</translation> +<translation id="3368586359109138591">Kopie zur Verwendung an anderer Stelle herunterladen</translation> <translation id="3368922792935385530">Verbunden</translation> <translation id="3369067987974711168">Mehr Aktionen für diesen Port anzeigen</translation> <translation id="3369624026883419694">Host auflösen...</translation> @@ -2725,6 +2729,7 @@ <translation id="3532273508346491126">Synchronisierungsverwaltung</translation> <translation id="3532521178906420528">Netzwerkverbindung wird hergestellt…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – stummgeschaltet</translation> +<translation id="3536492240554502321">Farbton-Rotation</translation> <translation id="3537881477201137177">Das kann später in den Einstellungen geändert werden</translation> <translation id="3538066758857505094">Fehler beim Deinstallieren von Linux. Bitte versuche es noch einmal.</translation> <translation id="354060433403403521">Netzteil</translation> @@ -3050,6 +3055,7 @@ <translation id="383669374481694771">Dies sind allgemeine Informationen zu diesem Gerät und dessen Nutzung, zum Beispiel der Akkustand, System- und App-Aktivitäten und Fehler. Die Daten werden dazu verwendet, Android zu verbessern. Einige aggregierte Daten helfen auch Apps und Partnern von Google, beispielsweise Android-Entwicklern, ihre Apps und Produkte weiter zu verbessern.</translation> <translation id="3838085852053358637">Fehler beim Laden der Erweiterung</translation> <translation id="3838486795898716504">Weitere <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Gespeicherte Passwörter im Google Passwortmanager hinzufügen</translation> <translation id="383891835335927981">Keine Websites wurden vergrößert oder verkleinert</translation> <translation id="3839509547554145593">Scroll-Beschleunigung für Maus aktivieren</translation> <translation id="3839516600093027468">Immer verhindern, dass <ph name="HOST" /> die Zwischenablage abruft</translation> @@ -4123,6 +4129,7 @@ <translation id="4871568871368204250">Synchronisierung ausschalten</translation> <translation id="4871719318659334896">Gruppe schließen</translation> <translation id="4872192066608821120">Wähle eine CSV-Datei aus, um Passwörter zu importieren</translation> +<translation id="4872212987539553601">On-Device-Verschlüsselung einrichten</translation> <translation id="4873312501243535625">Mediendatei-Prüfung</translation> <translation id="4876273079589074638">Unterstütze unsere Entwickler beim Untersuchen und Beheben dieses Absturzes. Beschreibe möglichst genau alle Schritte. Kein noch so kleines Detail ist überflüssig!</translation> <translation id="4876895919560854374">Bildschirm sperren und entsperren</translation> @@ -6419,6 +6426,7 @@ <translation id="7093220653036489319">Schnellinfo</translation> <translation id="7093416310351037609">Für den Schutz deiner Daten und die Sicherheit verlangt deine Organisation, dass alle berechtigten Downloads im <ph name="WEB_DRIVE" />-Konto deiner Organisation gespeichert werden.</translation> <translation id="7093866338626856921">Daten mit den Geräten mit folgenden Namen austauschen: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Akzeptiere die Streaminganfrage auf „<ph name="DEVICE_NAME" />“.</translation> <translation id="7098389117866926363">USB-C-Gerät (linker Port hinten)</translation> <translation id="7098447629416471489">Hier werden andere gespeicherte Suchmaschinen angezeigt</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{App entfernen}other{Apps entfernen}}</translation> @@ -6519,6 +6527,7 @@ <translation id="7212097698621322584">Gib deine aktuelle PIN ein, um sie zu ändern. Falls du deine PIN nicht kennst, musst du den Sicherheitsschlüssel zurücksetzen und dann eine neue PIN erstellen.</translation> <translation id="7213903639823314449">In der Adressleiste verwendete Suchmaschine</translation> <translation id="721490496276866468">Passwörter importieren</translation> +<translation id="7218514093816577632">Achte darauf, dass auf „<ph name="DEVICE_NAME" />“ Benachrichtigungen aktiviert sind.</translation> <translation id="7219473482981809164">Es wurden mehrere Profile zum Download gefunden. Wähle diejenigen aus, die du herunterladen möchtest, bevor du fortfährst.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Keine schwachen Passwörter}=1{1 schwaches Passwort}other{{NUM_WEAK} schwache Passwörter}}</translation> <translation id="7220019174139618249">Passwort kann nicht in "<ph name="FOLDER" />" exportiert werden</translation> @@ -6988,6 +6997,7 @@ <translation id="7664620655576155379">Nicht unterstütztes Bluetooth-Gerät: "<ph name="DEVICE_NAME" />"</translation> <translation id="7665082356120621510">Speicherplatz reservieren</translation> <translation id="7665369617277396874">Konto hinzufügen</translation> +<translation id="766635563210446220">Import der Passwörter nicht möglich. Prüfe, ob <ph name="FILENAME" /> richtig formatiert ist. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> innerhalb von {NUM_WEEKS} Woche zurückgeben}other{<ph name="DEVICE_TYPE" /> innerhalb von {NUM_WEEKS} Wochen zurückgeben}}</translation> <translation id="7668423670802040666">Im Passwortmanager von Google für <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Bedienungshilfen unterstützen dich bei der Nutzung deines Geräts. Durch die Auswahl der Uhrzeit unten auf dem Bildschirm kannst du auf die Schnelleinstellungen zugreifen.</translation> @@ -7519,6 +7529,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{ein Video}other{# Videos}}</translation> <translation id="8143442547342702591">Ungültige Anwendung</translation> <translation id="8143609395536282994">So kannst du deine Daten verwalten:</translation> +<translation id="8145170459658034418">Arbeitsspeicher-Sparmodus</translation> <translation id="8146177459103116374">Wenn du bereits auf diesem Gerät registriert bist, kannst du dich <ph name="LINK2_START" />als vorhandener Nutzer anmelden<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Füge deine bevorzugten Sprachen hinzu und ordne sie nach Priorität. Websites werden dir dann nach Möglichkeit in deinen bevorzugten Sprachen angezeigt. Diese Einstellungen werden mit den Browsereinstellungen synchronisiert. <ph name="BEGIN_LINK_LEARN_MORE" />Weitere Informationen<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Fehler bei der Anmeldung. Bitte wende dich an deinen Administrator oder versuche es noch einmal.</translation> @@ -7578,6 +7589,7 @@ <translation id="8198456017687137612">Tab wird gestreamt</translation> <translation id="8199300056570174101">Netzwerk(dienst) und Geräteeigenschaften</translation> <translation id="8200772114523450471">Fortsetzen</translation> +<translation id="8200789660596905522">Achte darauf, dass du die Streaminganfrage auf „<ph name="DEVICE_NAME" />“ akzeptierst.</translation> <translation id="8202160505685531999">Gib dein Passwort erneut ein, um dein <ph name="DEVICE_TYPE" />-Profil zu aktualisieren.</translation> <translation id="8203152941016626022">Nearby Share-Gerätename</translation> <translation id="8203732864715032075">Messages sendet Benachrichtigungen und merkt sich diesen Computer. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index e14c621..7b6a295 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2189,6 +2189,7 @@ <translation id="2977480621796371840">Remove from group</translation> <translation id="2979639724566107830">Open in new window</translation> <translation id="2981113813906970160">Show large mouse cursor</translation> +<translation id="2981293774053328982">This file contains malware that can compromise your personal or social network accounts</translation> <translation id="2983373101216420412">Case battery level <ph name="PERCENTAGE" />%.</translation> <translation id="2985348301114641460">Send a request to your administrator to install '<ph name="EXTENSION_NAME" />'?</translation> <translation id="2987620471460279764">Text shared from other device</translation> @@ -3774,6 +3775,7 @@ <translation id="4514610446763173167">Toggle video to play or pause</translation> <translation id="451515744433878153">Remove</translation> <translation id="4515872537870654449">Contact Dell for service. The dock will shut down if the fan isn't working.</translation> +<translation id="4518840066030486079">Shift key mode style</translation> <translation id="4519331665958994620">Sites can ask to use your camera</translation> <translation id="4519935350946509010">Connection error.</translation> <translation id="4520385623207007473">Cookies in use</translation> @@ -3869,6 +3871,7 @@ <translation id="4598345735110653698">Manage passkeys</translation> <translation id="4598556348158889687">Storage management</translation> <translation id="4598776695426288251">Wi-Fi available via multiple devices</translation> +<translation id="4600071396330666617">Number of suggestions</translation> <translation id="4601426376352205922">Mark as Unread</translation> <translation id="4602466770786743961">Always allow <ph name="HOST" /> to access your camera and microphone</translation> <translation id="4606551464649945562">Do not allow sites to create a 3D map of your surroundings or track camera position</translation> @@ -4315,6 +4318,7 @@ <translation id="5043913660911154449">Or specify your printer PPD <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Incorrect password</translation> <translation id="504561833207953641">Opening in existing browser session.</translation> +<translation id="5049614114599109018">Use input history</translation> <translation id="5051836348807686060">Spellcheck isn’t supported for the languages that you have selected</translation> <translation id="5052499409147950210">Edit site</translation> <translation id="505347685865235222">Unnamed group – <ph name="GROUP_CONTENT_STRING" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index a0b3b91..50230f2a 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -692,6 +692,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 con cifrado RSA</translation> <translation id="1641113438599504367">Navegación segura</translation> <translation id="1641496881756082050">Más acciones de <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{No se ha importado 1 contraseña más porque tiene un formato incorrecto}other{No se han importado {NUM_PASSWORDS} contraseñas más porque tienen un formato incorrecto}}</translation> <translation id="1642492862748815878">Conectado a <ph name="DEVICE" /> y a otros <ph name="NUMBER_OF_DEVICES" /> dispositivos Bluetooth</translation> <translation id="1642494467033190216">Para poder habilitar otras funciones de depuración, es necesario eliminar la protección de rootfs y reiniciar.</translation> <translation id="1643072738649235303">Firma X9.62 ECDSA con SHA-1</translation> @@ -1081,7 +1082,7 @@ <translation id="1995916364271252349">Controla la información que pueden usar y mostrar los sitios (ubicación, cámara, ventanas emergentes y otros)</translation> <translation id="1997433994358798851">Chrome necesita permiso para conectarse a tu dispositivo mediante Bluetooth.</translation> <translation id="1997616988432401742">Tus certificados</translation> -<translation id="1999115740519098545">Al abrir</translation> +<translation id="1999115740519098545">Al iniciar</translation> <translation id="2000419248597011803">Envía algunas cookies y búsquedas desde la barra de direcciones y el cuadro de búsqueda a tu buscador predeterminado</translation> <translation id="2002109485265116295">En tiempo real</translation> <translation id="2003130567827682533">Para activar los datos de "<ph name="NAME" />", conéctate a una red Wi‑Fi</translation> @@ -1830,6 +1831,7 @@ <translation id="2673135533890720193">Leer tu historial de navegación</translation> <translation id="2674764818721168631">Desactivado</translation> <translation id="2678063897982469759">Volver a habilitar</translation> +<translation id="2678100101831051676">No se ha podido enviar.</translation> <translation id="268053382412112343">Hi&storial</translation> <translation id="2681124317993121768">No se admiten perfiles de invitado</translation> <translation id="2682498795777673382">Actualizado por tu padre o madre</translation> @@ -3862,6 +3864,7 @@ <translation id="4617019240346358451">Vuelve a cargar la página para usar <ph name="EXTENSION_NAME" /></translation> <translation id="4617270414136722281">Opciones de extensión</translation> <translation id="4617880081511131945">No se puede establecer conexión</translation> +<translation id="4618195822946934889">La URL solo puede contener caracteres ASCII</translation> <translation id="4619564267100705184">Verificar mi identidad</translation> <translation id="4619615317237390068">Pestañas de otros dispositivos</translation> <translation id="4620809267248568679">Una extensión aplica esta opción.</translation> @@ -5061,6 +5064,7 @@ <translation id="5800351251499368110">Cerrar la búsqueda en el panel lateral. La búsqueda está abierta en el panel lateral.</translation> <translation id="5801568494490449797">Preferencias</translation> <translation id="5804241973901381774">Permisos</translation> +<translation id="5805268472388605531">Mantén pulsadas las teclas del teclado para ver las tildes y los caracteres especiales</translation> <translation id="5805697420284793859">Administrador de ventanas</translation> <translation id="5806447147478173900">Almacenamiento total usado por sitios mostrados: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Predeterminado)</translation> @@ -5702,6 +5706,7 @@ <translation id="642469772702851743">El propietario ha bloqueado este dispositivo (número de serie: <ph name="SERIAL_NUMBER" />).</translation> <translation id="6425556984042222041">Velocidad de conversión de texto a voz</translation> <translation id="642729974267661262">No puede reproducir sonido</translation> +<translation id="6427608534767366138">Se requiere la autenticación de proxy de "<ph name="NETWORK_ID" />"</translation> <translation id="6429384232893414837">Error de actualización</translation> <translation id="6430814529589430811">ASCII codificado en Base64, certificado único</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> configurará actualizaciones automáticas para todos los usuarios de este ordenador.</translation> @@ -7831,6 +7836,7 @@ <translation id="844063558976952706">Siempre en este sitio</translation> <translation id="8441313165929432954">Habilitar/Inhabilitar conexión compartida</translation> <translation id="8443795068008423036">Asegúrate de que tu dispositivo esté actualizado e inténtalo de nuevo</translation> +<translation id="8443986842926457191">La URL contiene más de 2048 caracteres</translation> <translation id="8446884382197647889">Más información</translation> <translation id="8447409163267621480">Incluye Ctrl o Alt</translation> <translation id="844850004779619592">No se han encontrado comandos</translation> @@ -7896,6 +7902,7 @@ <translation id="851263357009351303">Permitir siempre que <ph name="HOST" /> muestre imágenes</translation> <translation id="8513108775083588393">Giro automático</translation> <translation id="8514746246728959655">Prueba con una llave de seguridad diferente</translation> +<translation id="8519895319663397036">No se pueden importar las contraseñas. El tamaño del archivo debe ser inferior a 150 kB.</translation> <translation id="8523493869875972733">Mantener cambios</translation> <translation id="8523849605371521713">Añadida por política</translation> <translation id="8524783101666974011">Guardar las tarjetas en tu cuenta de Google</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 0a14455..009561ea 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -695,6 +695,7 @@ <translation id="1640283014264083726">PKCS 1 MD4 koos RSA krüpteerimisega</translation> <translation id="1641113438599504367">Ohutu sirvimine</translation> <translation id="1641496881756082050">Rohkem toiminguid: <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Veel 1 parooli ei imporditud, kuna see on valesti vormindatud}other{Veel {NUM_PASSWORDS} parooli ei imporditud, kuna need on valesti vormindatud}}</translation> <translation id="1642492862748815878">Ühendatud seadmega <ph name="DEVICE" /> ja veel <ph name="NUMBER_OF_DEVICES" /> Bluetooth-seadmega</translation> <translation id="1642494467033190216">Enne muude silumisfunktsioonide lubamist tuleb eemaldada kaitse rootfs ja seade tuleb taaskäivitada.</translation> <translation id="1643072738649235303">X9.62 ECDSA allkiri SHA-1-ga</translation> @@ -1835,6 +1836,7 @@ <translation id="2673135533890720193">Sirvimisajaloo lugemine</translation> <translation id="2674764818721168631">Väljas</translation> <translation id="2678063897982469759">Luba uuesti</translation> +<translation id="2678100101831051676">Ei saa üle kanda.</translation> <translation id="268053382412112343">&Ajalugu</translation> <translation id="2681124317993121768">Külaliste profiile ei toetata</translation> <translation id="2682498795777673382">Värskendus sinu vanemalt</translation> @@ -3868,6 +3870,7 @@ <translation id="4617019240346358451">Laadige leht uuesti, et laiendust „<ph name="EXTENSION_NAME" />“ kasutada</translation> <translation id="4617270414136722281">Laienduse valikud</translation> <translation id="4617880081511131945">Ei saa ühendust luua</translation> +<translation id="4618195822946934889">URL tohib sisaldada ainult ASCII-süsteemi tähemärke</translation> <translation id="4619564267100705184">Kinnitage, et see olete teie</translation> <translation id="4619615317237390068">Muudest seadmetest pärinevad vahelehed</translation> <translation id="4620809267248568679">Selle seade jõustas laiendus.</translation> @@ -5067,6 +5070,7 @@ <translation id="5800351251499368110">Sulgege külgpaneelil otsing. Otsing on külgpaneelil avatud.</translation> <translation id="5801568494490449797">Eelistused</translation> <translation id="5804241973901381774">Load</translation> +<translation id="5805268472388605531">Vajutage pikalt klaviatuuri klahve, et näha rõhu- ja erimärke</translation> <translation id="5805697420284793859">Aknahaldur</translation> <translation id="5806447147478173900">Kuvatud saitide kasutatav salvestusruum kokku: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (vaikeseade)</translation> @@ -5708,6 +5712,7 @@ <translation id="642469772702851743">Selle seadme (seerianumber: <ph name="SERIAL_NUMBER" />) lukustas omanik.</translation> <translation id="6425556984042222041">Kõnesünteesi kiirus</translation> <translation id="642729974267661262">Pole lubatud heli esitada</translation> +<translation id="6427608534767366138">Võrgu „<ph name="NETWORK_ID" />“ jaoks on vajalik puhverserveri autentimine</translation> <translation id="6429384232893414837">Viga värskendamisel</translation> <translation id="6430814529589430811">Base64 kodeeritud ASCII, üks sertifikaat</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> seadistab automaatsed värskendused selle arvuti kõikide kasutajate jaoks.</translation> @@ -7837,6 +7842,7 @@ <translation id="844063558976952706">Sellel saidil alati</translation> <translation id="8441313165929432954">Jagamise lubamine/keelamine</translation> <translation id="8443795068008423036">Veenduge, et teie seade oleks ajakohane, ja proovige uuesti</translation> +<translation id="8443986842926457191">URL on pikem kui 2048 tähemärki</translation> <translation id="8446884382197647889">Lisateave</translation> <translation id="8447409163267621480">Kaasake Ctrl või Alt</translation> <translation id="844850004779619592">Käske ei leitud</translation> @@ -7902,6 +7908,7 @@ <translation id="851263357009351303">Luba alati saidil <ph name="HOST" /> pilte kuvada</translation> <translation id="8513108775083588393">Aut. pööramine</translation> <translation id="8514746246728959655">Proovige muud turvavõtit</translation> +<translation id="8519895319663397036">Ei saa paroole importida. Faili suurus peab olema alla 150 kB.</translation> <translation id="8523493869875972733">Säilita muudatused</translation> <translation id="8523849605371521713">Reegliga lisatud</translation> <translation id="8524783101666974011">Salvestage kaardid oma Google'i kontole</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 60aa615..3f7f1e15 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Atseden hartzeko garaia izango da laster</translation> <translation id="1062628064301375934">Lagundu sare pribatuagoa sortzen</translation> <translation id="1067048845568873861">Sortze-data</translation> +<translation id="1067661089446014701">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ko kontuan gorde aurretik</translation> <translation id="1067922213147265141">Google-ren beste zerbitzu batzuk</translation> <translation id="1069355737714877171">Aldatu eSIMaren profila (<ph name="PROFILE_NAME" />)</translation> <translation id="1070377999570795893">Ordenagailuko beste programa batek Chrome-ren funtzionamenduari eragin diezaiokeen luzapen bat gehitu du. @@ -249,6 +250,7 @@ <translation id="1223853788495130632">Administratzaileak ezarpen honetarako balio zehatz bat gomendatzen du.</translation> <translation id="1225177025209879837">Eskaera prozesatzen…</translation> <translation id="1227507814927581609">Ezin izan da autentifikatu "<ph name="DEVICE_NAME" />" gailura konektatzen saiatzean.</translation> +<translation id="1227993798763400520">Ezin izan da igorri. Saiatu berriro.</translation> <translation id="1230417814058465809">Babes estandarra dago aktibatuta. Segurtasun handiagoa nahi baduzu, erabili babes hobetua.</translation> <translation id="1231733316453485619">Sinkronizazioa aktibatu nahi duzu?</translation> <translation id="1232569758102978740">Izengabea</translation> @@ -1113,6 +1115,7 @@ <translation id="2031914984822377766">Gehitu <ph name="LINK_BEGIN" />webguneetarako hizkuntza<ph name="LINK_END" /> lehenetsiak. Zerrendako lehen hizkuntza erabiliko da itzulpenetan.</translation> <translation id="2033758234986231162">Ezin da mantendu gailua telefonoarekin konektatuta. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation> <translation id="2034346955588403444">Gehitu beste wifi-sare bat</translation> +<translation id="2035211704574173780">Gris-eskala</translation> <translation id="203574396658008164">Gaitu pantaila blokeatutik oharrak idazteko aukera</translation> <translation id="2037445849770872822">Gainbegiratzea konfiguratu da Google-ko kontu honetan. Guraso-murriztapen gehiago konfiguratzeko, hautatu Egin aurrera. @@ -2339,7 +2342,7 @@ <translation id="3142562627629111859">Talde berria</translation> <translation id="3143515551205905069">Utzi sinkronizazioa bertan behera</translation> <translation id="3143754809889689516">Erreproduzitu hasieratik</translation> -<translation id="3143937294861726703">Memoria-aurrezlea aktibatuta dago</translation> +<translation id="3143937294861726703">Memoria-aurreztailea aktibatuta dago</translation> <translation id="3144647712221361880">Ireki esteka honela:</translation> <translation id="3149510190863420837">Chrome-ren aplikazioak</translation> <translation id="3150693969729403281">Egin segurtasun-egiaztapena</translation> @@ -2540,6 +2543,7 @@ <translation id="3363202073972776113">Zure erakundeak kudeatuko du profil berria. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Zure administratzaileak hau dio: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Erabili Ktrl edo Alt</translation> +<translation id="3368586359109138591">Deskargatu kopia bat beste nonbait erabiltzeko</translation> <translation id="3368922792935385530">Konektatuta</translation> <translation id="3369067987974711168">Erakutsi ataka honekin egin ditzakezun ekintza gehiago</translation> <translation id="3369624026883419694">Ostalaria ebazten…</translation> @@ -2728,6 +2732,7 @@ <translation id="3532273508346491126">Sinkronizazioaren kudeaketa</translation> <translation id="3532521178906420528">Sarera konektatzen…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - Audioa desaktibatuta</translation> +<translation id="3536492240554502321">Ñabarduren errotazioa</translation> <translation id="3537881477201137177">Behar izanez gero aldatu egin daiteke ezarpenetan</translation> <translation id="3538066758857505094">Errore bat gertatu da Linux desinstalatzean. Saiatu berriro.</translation> <translation id="354060433403403521">Korronte alternoaren egokigailua</translation> @@ -3053,6 +3058,7 @@ <translation id="383669374481694771">Gailu honi eta hura erabiltzeko moduari buruzko informazio orokorra da hau (adibidez, bateria-maila, sistemako eta aplikazioetako jarduerak, eta erroreak). Android hobetzeko erabiliko dira datuok. Gainera, multzokatutako datu batzuk oso baliagarriak dira Google-ren aplikazioak hobetzeko eta bazkideei (adibidez, Android-en garatzaileei) euren aplikazio eta produktuak hobetzen laguntzeko.</translation> <translation id="3838085852053358637">Ezin izan da kargatu luzapena</translation> <translation id="3838486795898716504"><ph name="PAGE_TITLE" /> orriaren jarraipena</translation> +<translation id="3838487810283346084">Gehitu gordetako pasahitzak Google-ren Pasahitz-kudeatzailea zerbitzuan</translation> <translation id="383891835335927981">Ez da aplikatu zoomik inongo webgunetan</translation> <translation id="3839509547554145593">Gaitu saguarekin gora/behera bizkorrago egiteko aukera</translation> <translation id="3839516600093027468">Blokeatu beti <ph name="HOST" /> webguneari arbela ikusteko aukera</translation> @@ -4126,6 +4132,7 @@ <translation id="4871568871368204250">Desaktibatu sinkronizazioa</translation> <translation id="4871719318659334896">Itxi taldea</translation> <translation id="4872192066608821120">Pasahitzak inportatzeko, hautatu CSV fitxategi bat</translation> +<translation id="4872212987539553601">Konfiguratu gailuan bertan enkriptatzeko aukera</translation> <translation id="4873312501243535625">Multimedia-fitxategien egiaztatzailea</translation> <translation id="4876273079589074638">Lagundu gure ingeniariei hutsegitea aztertzen eta konpontzen. Ahal baduzu, azaldu zer egin duzun urratsez urrats. Xehetasun txikienek ere garrantzitsuak dira!</translation> <translation id="4876895919560854374">Blokeatu eta desblokeatu pantaila</translation> @@ -6422,6 +6429,7 @@ <translation id="7093220653036489319">Erantzun bizkorrak</translation> <translation id="7093416310351037609">Datuen segurtasuna mantentzeko, deskarga egoki guztiak erakundearen <ph name="WEB_DRIVE" /> zerbitzuko kontuan gordetzea eskatzen du erakundeak.</translation> <translation id="7093866338626856921">Partekatu datuak izen hauek dituzten gailuekin: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Onartu igortzeko eskaera <ph name="DEVICE_NAME" /> gailuan.</translation> <translation id="7098389117866926363">USB-C gailua (ezkerraldeko atzeko ataka)</translation> <translation id="7098447629416471489">Hemen agertuko dira gordetako gainerako bilatzaileak</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Kendu aplikazioa}other{Kendu aplikazioak}}</translation> @@ -6522,6 +6530,7 @@ <translation id="7212097698621322584">PINa aldatzeko, idatzi unekoa lehendabizi. Ez badakizu PINa zein den, segurtasun-giltza berrezarri beharko duzu, eta beste PIN bat sortu.</translation> <translation id="7213903639823314449">Helbide-barran egiten diren bilaketetarako erabiltzen den bilatzailea</translation> <translation id="721490496276866468">Inportatu pasahitzak</translation> +<translation id="7218514093816577632">Ziurtatu jakinarazpenak aktibatuta daudela <ph name="DEVICE_NAME" /> gailuan.</translation> <translation id="7219473482981809164">Deskarga daitezkeen profil bat baino gehiago aurkitu ditugu. Aurrera egin baino lehen, hautatu deskargatu nahi dituzunak.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Ez dago segurua ez den pasahitzik}=1{1 pasahitz ez da segurua}other{{NUM_WEAK} pasahitz ez dira seguruak}}</translation> <translation id="7220019174139618249">Ezin da esportatu pasahitza "<ph name="FOLDER" />" karpetara</translation> @@ -6991,6 +7000,7 @@ <translation id="7664620655576155379">Bluetooth bidezko gailu ez-bateragarria: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Gorde tamaina</translation> <translation id="7665369617277396874">Gehitu kontu bat</translation> +<translation id="766635563210446220">Ezin dira inportatu pasahitzak. Egiaztatu <ph name="FILENAME" /> eta ziurtatu formatu egokia duela. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Itzuli <ph name="DEVICE_TYPE" /> gailua {NUM_WEEKS} asteko epean}other{Itzuli <ph name="DEVICE_TYPE" /> gailua {NUM_WEEKS} asteko epean}}</translation> <translation id="7668423670802040666">Google-ren Pasahitz-kudeatzailea zerbitzuan (<ph name="ACCOUNT" /> kontuan)</translation> <translation id="7668648754769651616">Erabilerraztasun-eginbideei esker, errazagoa da gailua erabiltzea. Ezarpen bizkorrak atzitzeko, hautatu ordua pantailaren behealdean.</translation> @@ -7521,6 +7531,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{bideo bat}other{# bideo}}</translation> <translation id="8143442547342702591">Aplikazioak ez du balio</translation> <translation id="8143609395536282994">Nola kudea ditzakezu datuak?</translation> +<translation id="8145170459658034418">Memoria-aurreztailea</translation> <translation id="8146177459103116374">Dagoeneko gailu honetan erregistratu bazara, <ph name="LINK2_START" />lehendik zegoen erabiltzaile gisa has dezakezu saioa<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Gehitu eta sailkatu gogoko dituzun hizkuntzak. Hizkuntza hobetsietan agertuko dira webguneak, ahal denean. Arakatzailearen ezarpenekin sinkronizatuta daude hobespen horiek. <ph name="BEGIN_LINK_LEARN_MORE" />Lortu informazio gehiago<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Ezin izan da hasi saioa. Jarri harremanetan administratzailearekin edo saiatu berriro.</translation> @@ -7580,6 +7591,7 @@ <translation id="8198456017687137612">Edukia igortzen ari den fitxa</translation> <translation id="8199300056570174101">Sarearen mantentze-zerbitzua eta gailuaren propietateak</translation> <translation id="8200772114523450471">Berrekin</translation> +<translation id="8200789660596905522">Ziurtatu igortzeko eskaera onartzen duzula <ph name="DEVICE_NAME" /> gailuan.</translation> <translation id="8202160505685531999">Idatzi berriro pasahitza <ph name="DEVICE_TYPE" /> gailuko profila eguneratzeko.</translation> <translation id="8203152941016626022">Nearby Share-ko gailuaren izena</translation> <translation id="8203732864715032075">Jaso jakinarazpenak eta ezarri ordenagailua lehenetsi gisa Mezuak aplikazioan gogoratzeko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 321e0338..69a6d9f2 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">تقریباً زمان استراحت است</translation> <translation id="1062628064301375934">به ما کمک کنید وب را خصوصیتر کنیم</translation> <translation id="1067048845568873861">ایجاد شد</translation> +<translation id="1067661089446014701">برای افزایش ایمنی، میتوانید گذرواژهها را قبلاز ذخیره شدن در «حساب Google» در دستگاهتان رمزگذاری کنید</translation> <translation id="1067922213147265141">سایر سرویسهای Google</translation> <translation id="1069355737714877171">حذف نمایه سیمکارت داخلی با نام <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">برنامه دیگری در رایانه شما یک افزونه اضافه کرده است که ممکن است نحوه کارکرد Chrome را تغییر دهد. @@ -252,6 +253,7 @@ <translation id="1223853788495130632">سرپرست شما توصیه میکند که مقدار خاصی را برای این گزینه وارد کنید.</translation> <translation id="1225177025209879837">پردازش درخواست...</translation> <translation id="1227507814927581609">هنگام اتصال به «<ph name="DEVICE_NAME" />» راستیآزمایی ناموفق بود.</translation> +<translation id="1227993798763400520">محتوا پخش نشد. لطفاً دوباره امتحان کنید.</translation> <translation id="1230417814058465809">«محافظت استاندارد» روشن است. برای امنیت بیشتر، از محافظت پیشرفته استفاده کنید.</translation> <translation id="1231733316453485619">همگامسازی روشن شود؟</translation> <translation id="1232569758102978740">بدون عنوان</translation> @@ -693,6 +695,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 با رمزگذاری RSA</translation> <translation id="1641113438599504367">مرور ایمن</translation> <translation id="1641496881756082050">کنشهای بیشتر برای <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{یک گذرواژه دیگر درونبرد نشد زیرا قالببندی آن اشتباه است}one{{NUM_PASSWORDS} گذرواژه دیگر درونبرد نشد زیرا قالببندی آن اشتباه است}other{{NUM_PASSWORDS} گذرواژه دیگر درونبرد نشد زیرا قالببندی آنها اشتباه است}}</translation> <translation id="1642492862748815878">متصل به <ph name="DEVICE" /> و <ph name="NUMBER_OF_DEVICES" /> دستگاه بلوتوث دیگر</translation> <translation id="1642494467033190216">راهاندازی مجدد و برداشتن محافظت ویژگیهای ریشه قبل از فعال کردن ویژگیهای رفعاشکال دیگر لازم است.</translation> <translation id="1643072738649235303">امضای X9.62 ECDSA با SHA-1</translation> @@ -1121,6 +1124,7 @@ <translation id="2031914984822377766"><ph name="LINK_BEGIN" />زبانهای وبسایت<ph name="LINK_END" /> ترجیحیتان را اضافه کنید. زبان اول در فهرست برای ترجمهها استفاده خواهد شد.</translation> <translation id="2033758234986231162">اتصال به تلفن قطع میشود. مطمئن شوید تلفنتان نزدیک باشد، قفل آن باز باشد، و بلوتوث و Wi-Fi روشن باشند.</translation> <translation id="2034346955588403444">افزودن شبکه WiFi دیگر</translation> +<translation id="2035211704574173780">سیاهوسفید</translation> <translation id="203574396658008164">فعال کردن یادداشتبرداری از صفحه درحالت قفل</translation> <translation id="2037445849770872822">برای این «حساب Google» نظارت تنظیم شده است. برای تنظیم کنترلهای والدین بیشتر، «ادامه» را انتخاب کنید. @@ -1841,6 +1845,7 @@ <translation id="2673135533890720193">خواندن سابقه مرور شما</translation> <translation id="2674764818721168631">خاموش</translation> <translation id="2678063897982469759">فعال کردن مجدد</translation> +<translation id="2678100101831051676">پخش محتوا امکانپذیر نیست.</translation> <translation id="268053382412112343">&سابقه</translation> <translation id="2681124317993121768">نمایههای مهمان پشتیبانی نمیشود</translation> <translation id="2682498795777673382">بهروزرسانی ازطرف والدین شما</translation> @@ -2550,6 +2555,7 @@ <translation id="3363202073972776113">سازمانتان این نمایه جدید را مدیریت خواهد کرد. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="3364986687961713424">ازطرف سرپرست: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">یا از Ctrl استفاده کنید یا از Alt</translation> +<translation id="3368586359109138591">بارگیری نسخهای از گذرواژهها برای استفاده در جاهای دیگر</translation> <translation id="3368922792935385530">متصل</translation> <translation id="3369067987974711168">نمایش کنشهای بیشتر برای این درگاه</translation> <translation id="3369624026883419694">در حال تحلیل میزبان...</translation> @@ -2738,6 +2744,7 @@ <translation id="3532273508346491126">مدیریت همگامسازی</translation> <translation id="3532521178906420528">درحال برقراری اتصال شبکه…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - بیصدا شده است</translation> +<translation id="3536492240554502321">چرخش رنگمایه</translation> <translation id="3537881477201137177">بعداً میتوانید این مورد را در «تنظیمات» تغییر دهید</translation> <translation id="3538066758857505094">هنگام حذف نصب Linux خطایی روی داد. لطفاً دوباره امتحان کنید.</translation> <translation id="354060433403403521">آداپتور AC</translation> @@ -3063,6 +3070,7 @@ <translation id="383669374481694771">این اطلاعاتی کلی درباره این دستگاه و نحوه استفاده از آن است (مانند سطح شارژ باتری، فعالیت سیستم و برنامه، و خطاها). از این دادهها برای بهبود Android استفاده خواهد شد و بعضی از اطلاعات انبوهشی نیز به برنامههای Google و شریکان، مانند برنامهنویسان Android کمک خواهد کرد برنامهها و محصولاتشان را بهتر کنند.</translation> <translation id="3838085852053358637">افزونه بار نشد</translation> <translation id="3838486795898716504"><ph name="PAGE_TITLE" /> بیشتر</translation> +<translation id="3838487810283346084">افزودن گذرواژههای ذخیرهشده به «مدیر گذرواژه Google»</translation> <translation id="383891835335927981">هیچ سایتی بزرگنمایی یا کوچکنمایی نشده است</translation> <translation id="3839509547554145593">فعال کردن شتاب پیمایش موشواره</translation> <translation id="3839516600093027468">دسترسی <ph name="HOST" /> به بریدهدان همیشه مسدود باشد</translation> @@ -3875,6 +3883,7 @@ <translation id="4617019240346358451">مجدد بار کردن صفحه برای استفاده از «<ph name="EXTENSION_NAME" />»</translation> <translation id="4617270414136722281">گزینههای افزونه</translation> <translation id="4617880081511131945">امکان برقراری اتصال وجود ندارد</translation> +<translation id="4618195822946934889">نشانی وب تنها میتواند شامل نویسههای ASCII باشد</translation> <translation id="4619564267100705184">تأیید هویت</translation> <translation id="4619615317237390068">برگهها از دستگاههای دیگر</translation> <translation id="4620809267248568679">این تنظیم توسط یک برنامهٔ افزودنی به اجرا گذاشته میشود.</translation> @@ -4136,6 +4145,7 @@ <translation id="4871568871368204250">خاموش کردن همگامسازی</translation> <translation id="4871719318659334896">بستن گروه</translation> <translation id="4872192066608821120">برای وارد کردن گذرواژهها، فایل CSV را انتخاب کنید</translation> +<translation id="4872212987539553601">راهاندازی رمزگذاری دروندستگاهی</translation> <translation id="4873312501243535625">بررسیکننده فایل رسانهای</translation> <translation id="4876273079589074638">به مهندسان ما کمک کنید این خرابی را بررسی و برطرف کنند. در صورت امکان مراحل را دقیق فهرست کنید. هیچ جزئیاتی بیاهمیت نیست!</translation> <translation id="4876895919560854374">قفل و باز کردن قفل صفحه</translation> @@ -5074,6 +5084,7 @@ <translation id="5800351251499368110">جستجو در پانل کناری بسته میشود. جستجو در پانل کناری باز است.</translation> <translation id="5801568494490449797">اولویتها</translation> <translation id="5804241973901381774">مجوزها</translation> +<translation id="5805268472388605531">برای دیدن نشانههای تکیه و نویسههای خاص، کلیدهای صفحهکلید را فشار دهید و نگه دارید</translation> <translation id="5805697420284793859">مدیر پنجره</translation> <translation id="5806447147478173900">مجموع فضای ذخیرهسازی که سایتهای نشاندادهشده استفاده کردهاند: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">۰ درجه (پیشفرض)</translation> @@ -5715,6 +5726,7 @@ <translation id="642469772702851743">این دستگاه (شماره سریال: <ph name="SERIAL_NUMBER" />) توسط مالک قفل شده است.</translation> <translation id="6425556984042222041">نرخ نوشتار به گفتار</translation> <translation id="642729974267661262">اجازه ندارد صدا پخش کند</translation> +<translation id="6427608534767366138">اصالتسنجی پراکسی برای «<ph name="NETWORK_ID" />» الزامی است</translation> <translation id="6429384232893414837">خطای بهروزرسانی</translation> <translation id="6430814529589430811">Base64-ASCII رمزدار، تک گواهی</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> بهروزرسانی را بهصورت خودکار برای تمام کاربران این رایانه راهاندازی میکند.</translation> @@ -6435,6 +6447,7 @@ <translation id="7093220653036489319">پاسخهای سریع</translation> <translation id="7093416310351037609">برای حفظ ایمنی و امنیت دادهها، سازمان شما لازم میداند همه بارگیریهای واجدشرایط در حساب <ph name="WEB_DRIVE" /> سازمانتان ذخیره شود.</translation> <translation id="7093866338626856921">تبادل داده با دستگاههایی با نامهای: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">درخواست پخش در <ph name="DEVICE_NAME" /> را بپذیرید.</translation> <translation id="7098389117866926363">دستگاه USB-C (درگاه عقب سمت چپ)</translation> <translation id="7098447629416471489">سایر موتورهای جستجوی ذخیرهشده در اینجا نشان داده خواهند شد</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{برداشتن برنامه}one{برداشتن برنامه}other{برداشتن برنامهها}}</translation> @@ -6535,6 +6548,7 @@ <translation id="7212097698621322584">پین کنونیتان را برای تغییر پین وارد کنید. اگر پین خود را نمیدانید، باید کلید امنیتی را بازنشانی کنید و سپس پین جدیدی ایجاد کنید.</translation> <translation id="7213903639823314449">موتور جستجوی مورداستفاده در نوار نشانی</translation> <translation id="721490496276866468">درونبردن گذرواژهها</translation> +<translation id="7218514093816577632">مطمئن شوید اعلانها در <ph name="DEVICE_NAME" /> شما روشن است.</translation> <translation id="7219473482981809164">چند نمایه پیدا کردیم که برای بارگیری دردسترس هستند. قبلاز ادامه، نمایههای موردنظرتان را برای بارگیری انتخاب کنید.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{گذرواژه ضعیفی ندارید}=1{۱ گذرواژه ضعیف}one{{NUM_WEAK} گذرواژه ضعیف}other{{NUM_WEAK} گذرواژه ضعیف}}</translation> <translation id="7220019174139618249">گذرواژهها در «<ph name="FOLDER" />» صادر نمیشوند</translation> @@ -7004,6 +7018,7 @@ <translation id="7664620655576155379">دستگاه بلوتوث پشتیبانی نشده: «<ph name="DEVICE_NAME" />».</translation> <translation id="7665082356120621510">اختصاص حجم دیسک</translation> <translation id="7665369617277396874">افزودن حساب</translation> +<translation id="766635563210446220">گذرواژهها وارد نشد. <ph name="FILENAME" /> را بررسی کنید و مطمئن شوید درست قالببندی شده باشد. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> را ظرف {NUM_WEEKS} هفته برگردانید}one{<ph name="DEVICE_TYPE" /> را ظرف {NUM_WEEKS} هفته برگردانید}other{<ph name="DEVICE_TYPE" /> را ظرف {NUM_WEEKS} هفته برگردانید}}</translation> <translation id="7668423670802040666">در «مدیر گذرواژه Google» برای <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">ویژگیهای دسترسپذیری استفاده از دستگاه را راحتتر میکند. برای دسترسی به «تنظیمات فوری»، زمان را در پایین صفحهنمایش انتخاب کنید.</translation> @@ -7535,6 +7550,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{یک ویدیو}one{# ویدیو}other{# ویدیو}}</translation> <translation id="8143442547342702591">برنامه نامعتبر است</translation> <translation id="8143609395536282994">چگونه میتوانید دادههایتان را مدیریت کنید:</translation> +<translation id="8145170459658034418">بهینهسازی حافظه</translation> <translation id="8146177459103116374">اگر قبلاً در این دستگاه ثبتنام کردید، میتوانید <ph name="LINK2_START" />بهعنوان یک کاربر موجود، وارد شوید<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">زبانهای برگزیدهتان را اضافه و رتبهبندی کنید. درصورت امکان، وبسایتها به زبانهای برگزیدهتان نشان داده میشوند. این اولویتها با تنظیمات مرورگرتان همگامسازی میشود. <ph name="BEGIN_LINK_LEARN_MORE" />بیشتر بدانید<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">ورود به سیستم انجام نشد. لطفاً با سرپرستتان تماس بگیرید یا دوباره امتحان کنید.</translation> @@ -7594,6 +7610,7 @@ <translation id="8198456017687137612">فرستادن برگه</translation> <translation id="8199300056570174101">مشخصات دستگاه و شبکه (سرویس)</translation> <translation id="8200772114523450471">ازسرگیری</translation> +<translation id="8200789660596905522">حتماً درخواست پخش در <ph name="DEVICE_NAME" /> را بپذیرید.</translation> <translation id="8202160505685531999">لطفاً برای بهروزرسانی نمایه <ph name="DEVICE_TYPE" /> خود، گذرواژهتان را دوباره وارد کنید.</translation> <translation id="8203152941016626022">نام دستگاه «همرسانی با اطراف»</translation> <translation id="8203732864715032075">ارسال اعلان برای شما و بهخاطرسپردن این رایانه بهعنوان پیشفرض برای «پیامها». <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> @@ -7845,6 +7862,7 @@ <translation id="844063558976952706">همیشه در این سایت</translation> <translation id="8441313165929432954">فعال/ غیرفعال کردن اشتراکگذاری اینترنت</translation> <translation id="8443795068008423036">لطفاً مطمئن شوید دستگاهتان بهروز باشد و دوباره امتحان کنید</translation> +<translation id="8443986842926457191">نشانی وب بیشاز ۲۰۴۸ نویسه دارد</translation> <translation id="8446884382197647889">بیشتر بدانید</translation> <translation id="8447409163267621480">باید شامل Ctrl یا Alt باشد</translation> <translation id="844850004779619592">هیچ فرمانی پیدا نشد</translation> @@ -7910,6 +7928,7 @@ <translation id="851263357009351303">همیشه <ph name="HOST" /> مجاز باشد تصاویر را نشان دهد</translation> <translation id="8513108775083588393">چرخش خودکار</translation> <translation id="8514746246728959655">کلید امنیتی دیگری را امتحان کنید</translation> +<translation id="8519895319663397036">گذرواژهها درونبرد نشد. اندازه فایل باید کمتر از ۱۵۰ کیلوبایت باشد.</translation> <translation id="8523493869875972733">حفظ تغییرات</translation> <translation id="8523849605371521713">بهموجب خطمشی اضافه شد</translation> <translation id="8524783101666974011">ذخیره کردن کارتها در حساب Google</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index f6f3e3e7..a742eebd 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Pian on tauon paikka</translation> <translation id="1062628064301375934">Auta meitä tekemään internetistä yksityisempi</translation> <translation id="1067048845568873861">Luotu</translation> +<translation id="1067661089446014701">Turvallisuuden parantamiseksi voit salata salasanat laitteella ennen niiden tallentamista Google Salasanoihin.</translation> <translation id="1067922213147265141">Muut Google-palvelut</translation> <translation id="1069355737714877171">Poista eSIM-profiili: <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Toinen tietokoneellasi oleva ohjelma on lisännyt laajennuksen, joka voi muuttaa Chromen toimintaa. @@ -251,6 +252,7 @@ <translation id="1223853788495130632">Järjestelmänvalvoja suosittelee tälle asetukselle tiettyä arvoa.</translation> <translation id="1225177025209879837">Käsitellään pyyntöä…</translation> <translation id="1227507814927581609">Todennus epäonnistui yhdistettäessä laitteeseen <ph name="DEVICE_NAME" />.</translation> +<translation id="1227993798763400520">Striimaus epäonnistui. Yritä uudelleen.</translation> <translation id="1230417814058465809">Perustason suojaus on päällä. Käytä parannettua suojausta, jos haluat lisäsuojaa.</translation> <translation id="1231733316453485619">Otetaanko synkronointi käyttöön?</translation> <translation id="1232569758102978740">Nimetön</translation> @@ -1123,6 +1125,7 @@ <translation id="2031914984822377766">Lisää <ph name="LINK_BEGIN" />sivustojen ensisijaiset kielet<ph name="LINK_END" />. Käännöksiin käytetään listan ensimmäistä kieltä.</translation> <translation id="2033758234986231162">Menetimme yhteyden puhelimeesi. Varmista, että puhelimesi on lähellä, sen lukitus on avattuna ja Bluetooth‑ ja Wi-Fi‑yhteydet ovat päällä.</translation> <translation id="2034346955588403444">Lisää muu Wi-Fi-verkko</translation> +<translation id="2035211704574173780">Harmaasävytila</translation> <translation id="203574396658008164">Salli muistiinpanojen tekeminen lukitusnäytöllä</translation> <translation id="2037445849770872822">Tälle Google-tilille on määritetty valvonta. Jos haluat määrittää lisää lapsilukkoja, valitse Jatka. @@ -2552,6 +2555,7 @@ <translation id="3363202073972776113">Organisaatiosi ylläpitää tätä uutta profiilia. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Järjestelmänvalvojalta: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Käytä joko Ctrl- tai Alt-näppäintä</translation> +<translation id="3368586359109138591">Lataa kopio, jota voit käyttää muualla</translation> <translation id="3368922792935385530">Yhdistetty</translation> <translation id="3369067987974711168">Näytä lisää tämän portin toimintoja</translation> <translation id="3369624026883419694">Jäsennetään palvelinta...</translation> @@ -2740,6 +2744,7 @@ <translation id="3532273508346491126">Synkronoinnin ylläpito</translation> <translation id="3532521178906420528">Muodostetaan verkkoyhteyttä...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – ääni mykistetty</translation> +<translation id="3536492240554502321">Sävyn kierto</translation> <translation id="3537881477201137177">Voit muuttaa tätä myöhemmin asetuksista</translation> <translation id="3538066758857505094">Virhe asennettaessa Linuxia. Yritä uudelleen.</translation> <translation id="354060433403403521">Laturi</translation> @@ -3065,6 +3070,7 @@ <translation id="383669374481694771">Nämä ovat yleisiä tietoja tästä laitteesta ja sen käytöstä (esim. akun varaustasosta, järjestelmän ja sovellusten toiminnasta sekä virheistä). Datan avulla Androidia parannetaan, ja koottua dataa käytetään Google-sovellusten, Android-kehittäjien tai muiden kumppanien sovellusten ja tuotteiden parantamiseen.</translation> <translation id="3838085852053358637">Laajennuksen lataus epäonnistui</translation> <translation id="3838486795898716504">Lisää <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Lisää tallennetut salasanat Google Salasanoihin</translation> <translation id="383891835335927981">Zoomausta ei ole käytetty sivustoilla.</translation> <translation id="3839509547554145593">Ota käyttöön hiiren vierityksen kiihdytys</translation> <translation id="3839516600093027468"><ph name="HOST" /> ei saa koskaan nähdä leikepöydän sisältöä</translation> @@ -4135,6 +4141,7 @@ <translation id="4871568871368204250">Poista synkronointi käytöstä</translation> <translation id="4871719318659334896">Sulje ryhmä</translation> <translation id="4872192066608821120">Jos haluat tuoda salasanoja, valitse CSV-tiedosto</translation> +<translation id="4872212987539553601">Ota käyttöön laitepohjainen salaus</translation> <translation id="4873312501243535625">Mediatiedostojen tarkistaja</translation> <translation id="4876273079589074638">Auta tiimiämme tutkimaan kaatumista ja korjaamaan virheet. Kerro toimista niin tarkasti kuin mahdollista. Kaikista yksityiskohdista on hyötyä.</translation> <translation id="4876895919560854374">Lukitse näyttö ja poista sen lukitus</translation> @@ -6432,6 +6439,7 @@ <translation id="7093220653036489319">Pikavastaukset</translation> <translation id="7093416310351037609">Datan suojaamiseksi organisaatiosi edellyttää, että kaikki kelvolliset lataukset tallennetaan organisaation tilille: <ph name="WEB_DRIVE" />.</translation> <translation id="7093866338626856921">Vaihtaa tietoja isäntää <ph name="HOSTNAMES" /> käyttävien laitteiden kanssa.</translation> +<translation id="7094680343477712655">Hyväksy striimauspyyntö laitteella: <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">C-tyypin USB-laite (vasemmanpuoleinen takaportti)</translation> <translation id="7098447629416471489">Tässä näytetään muut tallennetut hakukoneesi.</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Poista sovellus}other{Poista sovellukset}}</translation> @@ -6532,6 +6540,7 @@ <translation id="7212097698621322584">Lisää nykyinen PIN-koodisi muuttaaksesi sen. Jos et tiedä PIN-koodiasi, sinun on nollattava suojausavaimesi ja luotava uusi PIN-koodi.</translation> <translation id="7213903639823314449">Hakukone, jota käytetään osoitepalkissa</translation> <translation id="721490496276866468">Tuo salasanoja</translation> +<translation id="7218514093816577632">Varmista, että ilmoitukset ovat päällä: <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Ladattavissa on useita profiileja. Valitse ladattavat profiilit ennen kuin jatkat.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Ei heikkoja salasanoja}=1{1 heikko salasana}other{{NUM_WEAK} heikkoa salasanaa}}</translation> <translation id="7220019174139618249">Salasanojen tuonti kansioon <ph name="FOLDER" /> epäonnistui.</translation> @@ -7001,6 +7010,7 @@ <translation id="7664620655576155379">Tukematon Bluetooth-laite: <ph name="DEVICE_NAME" />.</translation> <translation id="7665082356120621510">Varaa koko</translation> <translation id="7665369617277396874">Lisää tili</translation> +<translation id="766635563210446220">Salasanojen siirto ei onnistu. Tarkista <ph name="FILENAME" /> ja varmista, että se on muotoiltu oikein. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Palauta <ph name="DEVICE_TYPE" /> {NUM_WEEKS} viikon sisällä}other{Palauta <ph name="DEVICE_TYPE" /> {NUM_WEEKS} viikon sisällä}}</translation> <translation id="7668423670802040666">Googlen Salasanojen ylläpidossa: <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Saavutettavuusominaisuudet helpottavat laitteen käyttöä. Voit avata pika-asetukset valitsemalla kellonajan näytön alareunasta.</translation> @@ -7532,6 +7542,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{video}other{# videota}}</translation> <translation id="8143442547342702591">Virheellinen sovellus</translation> <translation id="8143609395536282994">Miten voit vaikuttaa dataasi:</translation> +<translation id="8145170459658034418">Muistinsäästö</translation> <translation id="8146177459103116374">Jos olet jo rekisteröitynyt tällä laitteella, voit <ph name="LINK2_START" />kirjautua sisään olemassa olevana käyttäjänä<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Lisää haluamasi kielet ja aseta ne järjestykseen. Verkkosivustot näkyvät haluamillasi kielillä, jos mahdollista. Nämä asetukset synkronoidaan selainasetustesi kanssa. <ph name="BEGIN_LINK_LEARN_MORE" />Lue lisää<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Sisäänkirjautuminen epäonnistui. Ota yhteyttä järjestelmänvalvojaan tai yritä uudelleen.</translation> @@ -7591,6 +7602,7 @@ <translation id="8198456017687137612">Välilehteä striimataan</translation> <translation id="8199300056570174101">Verkon ja laitteen ominaisuudet</translation> <translation id="8200772114523450471">Jatka</translation> +<translation id="8200789660596905522">Varmista, että hyväksyt striimauspyynnön laitteella: <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Päivitä <ph name="DEVICE_TYPE" />-profiilisi kirjoittamalla salasanasi uudelleen.</translation> <translation id="8203152941016626022">Lähijakaminen laitteen nimi</translation> <translation id="8203732864715032075">Voit saada ilmoituksia, ja tämä tietokone voidaan muistaa oletuksena Messages-sovellusta käytettäessä. <ph name="LINK_BEGIN" />Lisätietoja<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index d3f7d25..7f067b9 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Halos oras na para magpahinga</translation> <translation id="1062628064301375934">Tulungan kaming bumuo ng mas pribadong web</translation> <translation id="1067048845568873861">Ginawa</translation> +<translation id="1067661089446014701">Para sa karagdagang kaligtasan, puwede mong i-encrypt ang mga password sa iyong device bago i-save ang mga ito sa Google Account mo</translation> <translation id="1067922213147265141">Iba pang serbisyo ng Google</translation> <translation id="1069355737714877171">Alisin ang profile ng eSIM na may pangalang <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Isa pang program sa iyong computer ang nagdagdag extension na maaaring magpabago sa paraan ng paggana ng Chrome. @@ -252,6 +253,7 @@ <translation id="1223853788495130632">Inirerekomenda ng iyong administrator ang isang tukoy na halaga para sa setting na ito.</translation> <translation id="1225177025209879837">Pinoproseso ang kahilingan...</translation> <translation id="1227507814927581609">Nabigo ang pagpapatunay habang kumokonekta sa "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">Hindi na-cast. Pakisubukan ulit.</translation> <translation id="1230417814058465809">Naka-on ang standard na proteksyon. Para sa higit pang seguridad, gamitin ang pinahusay na proteksyon.</translation> <translation id="1231733316453485619">I-on ang pag-sync?</translation> <translation id="1232569758102978740">Walang pamagat</translation> @@ -1126,6 +1128,7 @@ <translation id="2031914984822377766">Idagdag ang iyong mga gustong <ph name="LINK_BEGIN" />wika ng website<ph name="LINK_END" />. Gagamitin ang wika sa itaas mula sa listahan para sa mga pagsasalin.</translation> <translation id="2033758234986231162">Hindi makapagpanatili ng koneksyon sa iyong telepono. Tiyaking ang iyong telepono ay nasa malapit, naka-unlock, at naka-on ang Bluetooth at Wi-Fi.</translation> <translation id="2034346955588403444">Magdagdag ng iba pang Wi-Fi network</translation> +<translation id="2035211704574173780">Greyscale</translation> <translation id="203574396658008164">I-enable ang pagtatala mula sa lock screen</translation> <translation id="2037445849770872822">Na-set up ang patnubay para sa Google Account na ito. Para mag-set up ng higit pang kontrol ng magulang, piliin ang Magpatuloy. @@ -2556,6 +2559,7 @@ <translation id="3363202073972776113">Papamahalaan ng iyong organisasyon ang bagong profile na ito. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Mula sa iyong administrator: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Isa lang sa Ctrl o Alt ang gamitin</translation> +<translation id="3368586359109138591">Mag-download ng kopya na magagamit sa ibang lugar</translation> <translation id="3368922792935385530">Nakakonekta</translation> <translation id="3369067987974711168">Magpakita pa ng mga pagkilos para sa port na ito</translation> <translation id="3369624026883419694">Nilulutas ang host...</translation> @@ -2744,6 +2748,7 @@ <translation id="3532273508346491126">I-sync ang pamamahala</translation> <translation id="3532521178906420528">Kumokonekta sa network ...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - Naka-mute ang audio</translation> +<translation id="3536492240554502321">Rotation ng hue</translation> <translation id="3537881477201137177">Puwede itong baguhin sa ibang pagkakataon sa Mga Setting</translation> <translation id="3538066758857505094">Nagkaroon ng error sa pag-uninstall sa Linux. Pakisubukang muli.</translation> <translation id="354060433403403521">AC adapter</translation> @@ -3069,6 +3074,7 @@ <translation id="383669374481694771">Ito ay pangkalahatang impormasyon tungkol sa device na ito at kung paano ito ginagamit (gaya ng antas ng baterya, aktibidad ng system at app, at mga error). Gagamitin ang data para pahusayin ang Android, at makakatulong din ang ilang pinagsama-samang impormasyon sa mga app at partner ng Google, gaya ng mga developer ng Android, na pahusayin ang kanilang mga app at produkto.</translation> <translation id="3838085852053358637">Hindi na-load ang extension</translation> <translation id="3838486795898716504">Higit pang <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Magdagdag ng mga naka-save na password sa Google Password Manager</translation> <translation id="383891835335927981">Walang site na na-zoom in o na-zoom out</translation> <translation id="3839509547554145593">I-enable ang pag-accelerate sa pag-scroll ng mouse</translation> <translation id="3839516600093027468">Palaging i-block ang <ph name="HOST" /> sa pagtingin sa clipboard</translation> @@ -4143,6 +4149,7 @@ <translation id="4871568871368204250">I-off ang pag-sync</translation> <translation id="4871719318659334896">Isara ang grupo</translation> <translation id="4872192066608821120">Para mag-import ng mga password, pumili ng CSV file</translation> +<translation id="4872212987539553601">I-set up ang on-device na pag-encrypt</translation> <translation id="4873312501243535625">Pangsuri ng Media File</translation> <translation id="4876273079589074638">Tulungan ang aming mga engineer na siyasatin at ayusin ang pag-crash na ito. Maglista ng mga eksaktong hakbang kung maaari. Walang detalye ang masasayang!</translation> <translation id="4876895919560854374">I-lock at i-unlock ang screen</translation> @@ -6444,6 +6451,7 @@ <translation id="7093220653036489319">Instant na impormasyon</translation> <translation id="7093416310351037609">Para sa kaligtasan at seguridad ng data, hinihiling ng iyong organisasyon na i-save ang lahat ng kwalipikadong pag-download sa <ph name="WEB_DRIVE" /> account ng organisasyon mo.</translation> <translation id="7093866338626856921">Makipagpalit ng data sa mga device na pinangalanang: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Tanggapin ang kahilingan sa Pag-cast sa iyong <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">USB-C device (kaliwang port sa likod)</translation> <translation id="7098447629416471489">Lalabas dito ang iba pang na-save na search engine</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Alisin ang App}one{Mag-alis ng mga App}other{Mag-alis ng mga App}}</translation> @@ -6544,6 +6552,7 @@ <translation id="7212097698621322584">Ilagay ang kasalukuyan mong PIN para palitan ito. Kung hindi mo alam ang iyong PIN, kakailanganin mong i-reset ang security key, pagkatapos ay gumawa ng bagong PIN.</translation> <translation id="7213903639823314449">Search engine na ginamit sa address bar</translation> <translation id="721490496276866468">Mag-import ng mga password</translation> +<translation id="7218514093816577632">Tiyaking naka-on ang mga notification sa iyong <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Marami kaming nakitang profile na available na i-download. Piliin ang mga profile na gusto mong i-download bago magpatuloy.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Walang mahinang password}=1{1 mahinang password}one{{NUM_WEAK} mahinang password}other{{NUM_WEAK} na mahinang password}}</translation> <translation id="7220019174139618249">Hindi ma-export ang mga password sa "<ph name="FOLDER" />"</translation> @@ -7013,6 +7022,7 @@ <translation id="7664620655576155379">Hindi sinusuportahang Bluetooth device: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Magreserba ng espasyo</translation> <translation id="7665369617277396874">Magdagdag ng account</translation> +<translation id="766635563210446220">Hindi ma-import ang mga password. Tingnan ang <ph name="FILENAME" /> at tiyaking na-format ito nang tama. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Ibalik ang <ph name="DEVICE_TYPE" /> sa loob ng {NUM_WEEKS} linggo}one{Ibalik ang <ph name="DEVICE_TYPE" /> sa loob ng {NUM_WEEKS} linggo}other{Ibalik ang <ph name="DEVICE_TYPE" /> sa loob ng {NUM_WEEKS} na linggo}}</translation> <translation id="7668423670802040666">Sa Google Password Manager para sa <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Pinapadaling gamitin ng mga feature ng accessibility ang iyong device. Para i-access ang Mga Mabilisang Setting, piliin ang oras sa ibaba ng iyong screen.</translation> @@ -7545,6 +7555,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{isang video}one{# video}other{# na video}}</translation> <translation id="8143442547342702591">Invalid ang application</translation> <translation id="8143609395536282994">Paano mo mapapamahalaan ang iyong data</translation> +<translation id="8145170459658034418">Memory Saver</translation> <translation id="8146177459103116374">Kung nakarehistro ka na sa device na ito, maaari kang <ph name="LINK2_START" />mag-sign in bilang isang umiiral nang user<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Idagdag at i-rank ang iyong mga mas gustong wika. Lalabas ang mga website sa iyong mga mas gustong wika, kapag posible. Naka-sync ang mga kagustuhang ito sa iyong mga setting ng browser. <ph name="BEGIN_LINK_LEARN_MORE" />Matuto pa<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Hindi nakapag-sign in. Mangyaring makipag-ugnayan sa iyong administrator o subukang muli.</translation> @@ -7604,6 +7615,7 @@ <translation id="8198456017687137612">Ikina-cast ang tab</translation> <translation id="8199300056570174101">Mga property ng Network (Serbisyo) at Device</translation> <translation id="8200772114523450471">Resume</translation> +<translation id="8200789660596905522">Tiyaking tanggapin ang kahilingan sa Pag-cast sa iyong <ph name="DEVICE_NAME" /></translation> <translation id="8202160505685531999">Mangyaring ilagay muli ang iyong password upang i-update ang iyong profile sa <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Pangalan ng device sa Nearby Share</translation> <translation id="8203732864715032075">Papadalhan ka ng mga notification at aalalahanin ang computer na ito para sa Messages bilang default. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 2138ee8..3427bef 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">વિરામનો સમય થવા જ આવ્યો છે</translation> <translation id="1062628064301375934">વેબને વધુ ખાનગી બનાવવામાં અમારી સહાય કરો</translation> <translation id="1067048845568873861">બનાવ્યું</translation> +<translation id="1067661089446014701">વધારાની સલામતી માટે, તમારા Google એકાઉન્ટમાં સાચવવામાં આવે એ પહેલાં તમે તેમને તમારા ડિવાઇસમાં એન્ક્રિપ્ટ કરી શકો છો</translation> <translation id="1067922213147265141">અન્ય Google સેવાઓ</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> નામની ઇ-સિમ પ્રોફાઇલ કાઢી નાખો</translation> <translation id="1070377999570795893">તમારા કોમ્પ્યુટર પરના અન્ય પ્રોગ્રામે કોઇ એક્સ્ટેન્શન ઉમેર્યું છે જેનાથી Chromeની કાર્યપદ્ધતિમાં ફેરફાર થઇ શકે છે. @@ -250,6 +251,7 @@ <translation id="1223853788495130632">તમારા એડમિનિસ્ટ્રેટર આ સેટિંગ માટે વિશિષ્ટ મૂલ્યની ભલામણ કરે છે.</translation> <translation id="1225177025209879837">વિનંતી પર પ્રક્રિયા થઈ રહી છે...</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />" થી કનેક્ટ કરવાનો પ્રયાસ કરતી વખતે પ્રમાણીકરણ નિષ્ફળ થયું.</translation> +<translation id="1227993798763400520">કાસ્ટ કરવામાં નિષ્ફળ થયાં. કૃપા કરીને ફરીથી પ્રયાસ કરો.</translation> <translation id="1230417814058465809">માનક સુરક્ષા ચાલુ છે. વધુ સઘન સુરક્ષા માટે, વધારેલા સંરક્ષણનો ઉપયોગ કરો.</translation> <translation id="1231733316453485619">સિંક કરવાનું ચાલુ કરીએ?</translation> <translation id="1232569758102978740">શીર્ષક વિનાનું</translation> @@ -689,6 +691,7 @@ <translation id="1640283014264083726">RSA એન્ક્રિપ્શનવાળું PKCS #1 MD4</translation> <translation id="1641113438599504367">સલામત બ્રાઉઝિંગ</translation> <translation id="1641496881756082050"><ph name="NETWORK_NAME" /> સંબંધિત વધુ ક્રિયાઓ</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{અન્ય 1 પાસવર્ડ આયાત કરવામાં આવ્યો ન હતો કારણ કે તેને અયોગ્ય રીતે ફૉર્મેટ કરવામાં આવ્યો હતો}one{અન્ય {NUM_PASSWORDS} પાસવર્ડ આયાત કરવામાં આવ્યો ન હતો કારણ કે તેને અયોગ્ય રીતે ફૉર્મેટ કરવામાં આવ્યો હતો}other{અન્ય {NUM_PASSWORDS} પાસવર્ડ આયાત કરવામાં આવ્યા ન હતા કારણ કે તેમને અયોગ્ય રીતે ફૉર્મેટ કરવામાં આવ્યા હતા}}</translation> <translation id="1642492862748815878"><ph name="DEVICE" /> અને અન્ય <ph name="NUMBER_OF_DEVICES" /> બ્લૂટૂથ ડિવાઇસ સાથે કનેક્ટેડ છે</translation> <translation id="1642494467033190216">અન્ય ડિબગિંગ સુવિધાઓ સક્ષમ કરતાં પહેલાં rootfs રક્ષણ દૂર કરી અને પુનઃપ્રારંભ કરવું જરૂરી છે.</translation> <translation id="1643072738649235303">SHA-1 સાથે X9.62 ECDSA સહી</translation> @@ -1109,6 +1112,7 @@ <translation id="2031914984822377766">તમારી પસંદગીની <ph name="LINK_BEGIN" />વેબસાઇટની ભાષાઓ<ph name="LINK_END" /> ઉમેરો. આ સૂચિમાંની સૌથી ઉપરની ભાષાનો ઉપયોગ અનુવાદ માટે કરવામાં આવશે.</translation> <translation id="2033758234986231162">તમારા ફોન સાથે કોઈ કનેક્શન જાળવી શકાતું નથી. ખાતરી કરો કે તમારો ફોન નજીકમાં, અનલૉક કરેલો હોય તેમજ તેમાં બ્લૂટૂથ અને વાઇ-ફાઇની સેવા ચાલુ કરવામાં આવી હોય.</translation> <translation id="2034346955588403444">અન્ય WiFi નેટવર્ક ઉમેરો</translation> +<translation id="2035211704574173780">ગ્રેસ્કેલ</translation> <translation id="203574396658008164">લૉક સ્ક્રીનમાંથી નોંધ લેવાનું ચાલુ કરો</translation> <translation id="2037445849770872822">આ Google એકાઉન્ટ માટે નિરીક્ષણ સેટ કરવામાં આવ્યું છે. વધુ પેરેંટલ કન્ટ્રોલ સેટ અપ કરવા માટે, ચાલુ રાખો પસંદ કરો. @@ -1827,6 +1831,7 @@ <translation id="2673135533890720193">તમારો બ્રાઉઝિંગ ઇતિહાસ વાંચો</translation> <translation id="2674764818721168631">બંધ</translation> <translation id="2678063897982469759">ફરી ચાલુ કરો</translation> +<translation id="2678100101831051676">કાસ્ટ કરી શકતા નથી.</translation> <translation id="268053382412112343">Hi&story</translation> <translation id="2681124317993121768">અતિથિની પ્રોફાઇલને સપોર્ટ આપવામાં આવતો નથી</translation> <translation id="2682498795777673382">તમારા માતાપિતા પાસે અપડેટ કરાવો</translation> @@ -2536,6 +2541,7 @@ <translation id="3363202073972776113">આ નવી પ્રોફાઇલ તમારી સંસ્થા દ્વારા મેનેજ કરવામાં આવશે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="3364986687961713424">તમારા વ્યવસ્થાપક તરફથી: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl અથવા Altનો ઉપયોગ કરો</translation> +<translation id="3368586359109138591">બીજે કયાંક ઉપયોગ કરવા માટે, એક કૉપિ ડાઉનલોડ કરો</translation> <translation id="3368922792935385530">કનેક્ટેડ</translation> <translation id="3369067987974711168">આ પોર્ટ માટે વધુ ક્રિયાઓ બતાવો</translation> <translation id="3369624026883419694">હોસ્ટને રીસોલ્વ કરી રહ્યું છે...</translation> @@ -2724,6 +2730,7 @@ <translation id="3532273508346491126">સિંક મેનેજમેન્ટ</translation> <translation id="3532521178906420528">નેટવર્ક કનેક્શન સ્થાપિત કરી રહ્યાં છીએ…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - ઑડિઓ મ્યૂટ કર્યો</translation> +<translation id="3536492240554502321">રંગની છટાનું રોટેશન</translation> <translation id="3537881477201137177">સેટિંગમાં જઈને આમાં ફેરફાર કરી શકાશે</translation> <translation id="3538066758857505094">Linuxને અનઇન્સ્ટૉલ કરતી વખતે ભૂલ આવી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> <translation id="354060433403403521">AC એડેપ્ટર</translation> @@ -3049,6 +3056,7 @@ <translation id="383669374481694771">આ ડિવાઇસ અને તે કેવી રીતે ઉપયોગમાં લેવાય છે તે (જેમ કે બૅટરીનું લેવલ, સિસ્ટમ અને ઍપ પ્રવૃત્તિ તેમજ ભૂલો) વિશેની આ સામાન્ય માહિતી છે. આ ડેટાનો ઉપયોગ Androidને બહેતર બનાવવા માટે કરવામાં આવશે અને અમુક એકીકૃત માહિતી, Google ઍપ અને ભાગીદારો, જેમ કે Android ડેવલપરને પણ તેઓની ઍપ અને પ્રોડક્ટને બહેતર બનાવવામાં સહાયરૂપ થશે.</translation> <translation id="3838085852053358637">એક્સ્ટેન્શન લોડ કરવામાં નિષ્ફળ થયાં</translation> <translation id="3838486795898716504">વધુ <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Google Password Managerમાં સાચવેલા પાસવર્ડ ઉમેરો</translation> <translation id="383891835335927981">કોઈ સાઇટનું ઝૂમ વધારેલું કે ઘટાડેલું નથી</translation> <translation id="3839509547554145593">માઉસ સ્ક્રોલ ઍક્સલરેશન સુવિધા ચાલુ કરો</translation> <translation id="3839516600093027468"><ph name="HOST" />ને હંમેશા ક્લિપબોર્ડ જોવાથી બ્લૉક કરો</translation> @@ -3860,6 +3868,7 @@ <translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />"નો ઉપયોગ કરવા માટે પેજ ફરીથી લોડ કરો</translation> <translation id="4617270414136722281">એક્સ્ટેન્શન વિકલ્પો</translation> <translation id="4617880081511131945">કનેક્શન મેળવી શકાતું નથી</translation> +<translation id="4618195822946934889">URLમાં માત્ર ASCII અક્ષરોનો સમાવેશ થઈ શકે છે</translation> <translation id="4619564267100705184">આ તમે જ છો તેની ચકાસણી કરો</translation> <translation id="4619615317237390068">અન્ય ઉપકરણોમાંથી ટૅબ્સ</translation> <translation id="4620809267248568679">આ સેટિંગ એક એક્સ્ટેંશન દ્વારા લાગુ કરાઈ છે.</translation> @@ -4121,6 +4130,7 @@ <translation id="4871568871368204250">સિંક બંધ કરો</translation> <translation id="4871719318659334896">ગ્રૂપ બંધ કરો</translation> <translation id="4872192066608821120">પાસવર્ડ આયાત કરવા માટે, CSV ફાઇલ પસંદ કરો</translation> +<translation id="4872212987539553601">ડિવાઇસ પર એન્ક્રિપ્શનનું સેટઅપ કરો</translation> <translation id="4873312501243535625">મીડિયા ફાઇલ તપાસનાર</translation> <translation id="4876273079589074638">આ ક્રૅશની તપાસ કરવામાં અને એને ઠીક કરવામાં અમારાં એન્જિનિયરોની મદદ કરો. જો તમે કરી શકો તેમ હોય તો ચોક્કસ પગલાંની સૂચિ બનાવો. કોઈ પણ વિગત નાની નથી હોતી!</translation> <translation id="4876895919560854374">સ્ક્રીન લૉક કરો અને અનલૉક કરો</translation> @@ -5060,6 +5070,7 @@ <translation id="5800351251499368110">બાજુની પૅનલમાંથી શોધની સેવા બંધ કરો. બાજુની પૅનલમાં શોધની સેવા ચાલુ છે.</translation> <translation id="5801568494490449797">પસંદગીઓ</translation> <translation id="5804241973901381774">પરવાનગીઓ</translation> +<translation id="5805268472388605531">ઉચ્ચાર માટેના ચિહ્નો અને વિશેષ અક્ષરો જોવા માટે, કીબોર્ડની કીને દબાવી રાખો</translation> <translation id="5805697420284793859">વિન્ડો મેનેજર</translation> <translation id="5806447147478173900">પ્રદર્શિત થયેલી સાઇટ દ્વારા કરવામાં આવેલો સ્ટોરેજનો કુલ વપરાશ: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (ડિફૉલ્ટ)</translation> @@ -5702,6 +5713,7 @@ <translation id="642469772702851743">આ ઉપકરણ (SN: <ph name="SERIAL_NUMBER" />)ને માલિક દ્વારા લૉક કરવામાં આવ્યું હતું.</translation> <translation id="6425556984042222041">ટેક્સ્ટ ટૂ સ્પીચની ઝડપ</translation> <translation id="642729974267661262">સાઉન્ડ ચલાવવાની મંજૂરી નથી</translation> +<translation id="6427608534767366138">"<ph name="NETWORK_ID" />" માટે પ્રૉક્સીના પ્રમાણીકરણની જરૂર છે</translation> <translation id="6429384232893414837">અપડેટમાં ભૂલ</translation> <translation id="6430814529589430811">Base64-encoded ASCII, એકલ પ્રમાણપત્ર</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> આ કમ્પ્યૂટરના બધા વપરાશકર્તા માટે સ્વચાલિત અપડેટ્સ સેટ કરશે.</translation> @@ -6422,6 +6434,7 @@ <translation id="7093220653036489319">ઝડપી જવાબો</translation> <translation id="7093416310351037609">ડેટાની સલામતી અને સુરક્ષિતતા માટે, તમારી સંસ્થા મુજબ યોગ્યતા ધરાવતા બધા ડાઉનલોડ તમારી સંસ્થાના <ph name="WEB_DRIVE" /> એકાઉન્ટમાં સાચવવા જરૂરી છે.</translation> <translation id="7093866338626856921">આ નામના ઉપકરણ સાથે ડેટા વિનિમય કરો: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">તમારા <ph name="DEVICE_NAME" /> પર કાસ્ટની વિનંતી સ્વીકારો.</translation> <translation id="7098389117866926363">USB-C ડિવાઇસ (પાછળની બાજુએ ડાબું પોર્ટ)</translation> <translation id="7098447629416471489">અન્ય સાચવેલા શોધ એન્જિન અહીં દેખાશે</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{ઍપ કાઢી નાખો}one{ઍપ કાઢી નાખો}other{ઍપ કાઢી નાખો}}</translation> @@ -6522,6 +6535,7 @@ <translation id="7212097698621322584">પિન બદલવા માટે તમારો વર્તમાન પિન દાખલ કરો. જો તમને તમારો પિન યાદ ન હોય, તો તમારે સુરક્ષા કોડ રીસેટ કરવો પડશે, અને પછી નવો પિન બનાવવો પડશે.</translation> <translation id="7213903639823314449">ઍડ્રેસ બારમાં ઉપયોગમાં લેવાયેલું શોધ એન્જિન</translation> <translation id="721490496276866468">પાસવર્ડ આયાત કરો</translation> +<translation id="7218514093816577632">તમારા <ph name="DEVICE_NAME" />માં નોટિફિકેશન ચાલુ કરવામાં આવ્યા હોવાની ખાતરી કરો.</translation> <translation id="7219473482981809164">અમને ડાઉનલોડ કરવા માટે, એકથી વધુ ઉપલબ્ધ પ્રોફાઇલ મળી છે. આગળ વધતા પહેલાં, તમે જે ડાઉનલોડ કરવા ઇચ્છતા હો, તે પ્રોફાઇલ પસંદ કરો.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{એકેય નબળો પાસવર્ડ નથી}=1{1 નબળો પાસવર્ડ}one{{NUM_WEAK} નબળો પાસવર્ડ}other{{NUM_WEAK} નબળા પાસવર્ડ}}</translation> <translation id="7220019174139618249">પાસવર્ડને "<ph name="FOLDER" />"માં મોકલી શકાતો નથી</translation> @@ -6991,6 +7005,7 @@ <translation id="7664620655576155379">સપોર્ટ ન કરતું Bluetooth ડિવાઇસ: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">કદ આરક્ષિત કરો</translation> <translation id="7665369617277396874">એકાઉન્ટ ઉમેરો</translation> +<translation id="766635563210446220">પાસવર્ડ આયાત કરી શકાતા નથી. <ph name="FILENAME" /> ચેક કરો અને તે યોગ્ય રીતે ફૉર્મેટ કરેલું હોવાની ખાતરી કરો. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> {NUM_WEEKS} અઠવાડિયામાં પરત કરો}one{<ph name="DEVICE_TYPE" /> {NUM_WEEKS} અઠવાડિયાંમાં પરત કરો}other{<ph name="DEVICE_TYPE" /> {NUM_WEEKS} અઠવાડિયાંમાં પરત કરો}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" /> માટે Google પાસવર્ડ મેનેજરમાં</translation> <translation id="7668648754769651616">ઍક્સેસિબિલિટી સુવિધાઓ તમારા ડિવાઇસનો ઉપયોગ કરવાનું વધુ સરળ બનાવે છે. ઝડપી સેટિંગ ઍક્સેસ કરવા માટે, તમારી સ્ક્રીનની સૌથી નીચે સમય પસંદ કરો.</translation> @@ -7517,6 +7532,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{એક વીડિયો}one{# વીડિયો}other{# વીડિયો}}</translation> <translation id="8143442547342702591">અમાન્ય ઍપ્લિકેશન</translation> <translation id="8143609395536282994">તમે તમારો ડેટા કેવી રીતે મેનેજ કરી શકો છો:</translation> +<translation id="8145170459658034418">મેમરી સેવર</translation> <translation id="8146177459103116374">જો તમે આ ઉપકરણ પર પહેલાથી નોંધણી કરાવી છે, તો તમે <ph name="LINK2_START" />અસ્તિત્વમાં છે તે વપરાશકર્તા તરીકે સાઇન ઇન<ph name="LINK2_END" /> કરી શકો છો.</translation> <translation id="8146287226035613638">તમારી પસંદગીની ભાષાઓ ઉમેરો અને તેમને રેંકિંગ આપો. જ્યારે શક્ય હશે, ત્યારે વેબસાઇટ તમારી પસંદગીની ભાષાઓમાં બતાવશે. આ પસંદગીઓને તમારા બ્રાઉઝર સેટિંગ સાથે સિંક કરવામાં આવે છે. <ph name="BEGIN_LINK_LEARN_MORE" />વધુ જાણો<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">સાઇન-ઇન નિષ્ફળ થયું. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો અથવા ફરી પ્રયાસ કરો.</translation> @@ -7576,6 +7592,7 @@ <translation id="8198456017687137612">ટૅબ કાસ્ટ કરી રહ્યાં છીએ</translation> <translation id="8199300056570174101">નેટવર્ક (સેવા) અને ઉપકરણના ગુણધર્મો</translation> <translation id="8200772114523450471">રિઝ્યુમે</translation> +<translation id="8200789660596905522">તમારા <ph name="DEVICE_NAME" /> પર કાસ્ટની વિનંતી સ્વીકારવાની ખાતરી કરો.</translation> <translation id="8202160505685531999">તમારી <ph name="DEVICE_TYPE" /> પ્રોફાઇલને અપડેટ કરવા માટે કૃપા કરીને તમારો પાસવર્ડ ફરીથી દાખલ કરો.</translation> <translation id="8203152941016626022">'નજીકના શેર' ડિવાઇસનું નામ</translation> <translation id="8203732864715032075">તમને નોટિફિકેશન મોકલે અને મેસેજ માટે ડિફૉલ્ટ તરીકે આ કમ્પ્યુટરને યાદ રાખે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> @@ -7827,6 +7844,7 @@ <translation id="844063558976952706">હંમેશા આ સાઇટ પર</translation> <translation id="8441313165929432954">ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ કરો/બંધ કરો</translation> <translation id="8443795068008423036">ખાતરી કરો કે તમારું ડિવાઇસ અપ ટૂ ડેટ છે અને ફરી પ્રયાસ કરો</translation> +<translation id="8443986842926457191">URLમાં 2048થી વધુ અક્ષર છે</translation> <translation id="8446884382197647889">વધુ જાણો</translation> <translation id="8447409163267621480">કાં તો Ctrl અથવા Alt શામેલ કરો</translation> <translation id="844850004779619592">કોઈ આદેશ મળ્યો નથી</translation> @@ -7892,6 +7910,7 @@ <translation id="851263357009351303"><ph name="HOST" />ને હંમેશાં છબી બતાવવાની મંજૂરી આપો</translation> <translation id="8513108775083588393">ઑટો રોટેટ</translation> <translation id="8514746246728959655">અલગ સુરક્ષા કોડ અજમાવી જુઓ</translation> +<translation id="8519895319663397036">પાસવર્ડ આયાત કરી શકતા નથી. ફાઇલનું કદ 150 KB કરતાં ઓછું હોવું જોઈએ.</translation> <translation id="8523493869875972733">ફેરફારો રાખો</translation> <translation id="8523849605371521713">પૉલિસી દ્વારા ઉમેરાયેલું</translation> <translation id="8524783101666974011">તમારા Google એકાઉન્ટમાં કાર્ડ સાચવો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 7265f213..2a6d423e 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">ब्रेक लेने का समय होने वाला है</translation> <translation id="1062628064301375934">वेब को निजता के लिहाज़ से ज़्यादा सुरक्षित बनाने में हमारी मदद करें</translation> <translation id="1067048845568873861">निर्मित</translation> +<translation id="1067661089446014701">ज़्यादा सुरक्षा के लिए, अपने Google खाते में पासवर्ड सेव करने से पहले, आपके पास उन्हें अपने डिवाइस पर एन्क्रिप्ट (सुरक्षित) करने की सुविधा भी मौजूद है</translation> <translation id="1067922213147265141">Google की दूसरी सेवाएंं</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> नाम की ई-सिम प्रोफ़ाइल को हटाएं</translation> <translation id="1070377999570795893">आपके कंप्यूटर पर किसी अन्य प्रोग्राम ने ऐसा एक्सटेंशन जोड़ा है जो Chrome के काम करने के तरीके को बदल सकता है. @@ -252,6 +253,7 @@ <translation id="1223853788495130632">आपका व्यवस्थापक इस सेटिंग के लिए किसी विशिष्ट मान की अनुशंसा करता है.</translation> <translation id="1225177025209879837">अनुरोध पूरा करने की प्रक्रिया जारी है...</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />" से कनेक्ट होते समय प्रमाणीकरण विफल रहा.</translation> +<translation id="1227993798763400520">कास्ट नहीं किया जा सका. कृपया फिर से कोशिश करें.</translation> <translation id="1230417814058465809">सामान्य सुरक्षा की सुविधा चालू है. इससे भी ज़्यादा सुरक्षा के लिए, बेहतर सुरक्षा की सुविधा का इस्तेमाल करें.</translation> <translation id="1231733316453485619">क्या सिंक करना चालू करें?</translation> <translation id="1232569758102978740">शीर्षक रहित</translation> @@ -696,6 +698,7 @@ <translation id="1640283014264083726">RSA सुरक्षित करने के तरीके के साथ PKCS #1 MD4</translation> <translation id="1641113438599504367">सुरक्षित ब्राउज़िंग</translation> <translation id="1641496881756082050"><ph name="NETWORK_NAME" /> से जुड़ी और कार्रवाइयां</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{1 अन्य पासवर्ड इंपोर्ट नहीं किया जा सका, क्योंकि इसका फ़ॉर्मैट गलत था}one{{NUM_PASSWORDS} अन्य पासवर्ड इंपोर्ट नहीं किया जा सका, क्योंकि इसका फ़ॉर्मैट गलत था}other{{NUM_PASSWORDS} अन्य पासवर्ड इंपोर्ट नहीं किए जा सके, क्योंकि इनका फ़ॉर्मैट गलत था}}</translation> <translation id="1642492862748815878"><ph name="DEVICE" /> और <ph name="NUMBER_OF_DEVICES" /> अन्य ब्लूटूथ डिवाइसों से कनेक्ट किया गया है</translation> <translation id="1642494467033190216">डीबग करने वाली अन्य सुविधाएं सक्षम करने से पहले rootfs सुरक्षा को निकालने और फिर से प्रारंभ करने की आवश्यकता है.</translation> <translation id="1643072738649235303">SHA-1 के साथ X9.62 ECDSA हस्ताक्षर</translation> @@ -1125,6 +1128,7 @@ <translation id="2031914984822377766"><ph name="LINK_BEGIN" />वेबसाइट पर अपनी पसंदीदा भाषा<ph name="LINK_END" /> जोड़ें. सूची में सबसे ऊपर दी गई भाषा, अनुवाद के लिए इस्तेमाल की जाएगी.</translation> <translation id="2033758234986231162">फ़ोन से कनेक्ट नहीं रखा जा सका. पक्का करें कि आपका फ़ोन आस-पास हो और अनलॉक हो. साथ ही, उसका ब्लूटूथ और वाई-फ़ाई चालू हो.</translation> <translation id="2034346955588403444">अन्य वाई-फ़ाई नेटवर्क जोड़ें</translation> +<translation id="2035211704574173780">स्क्रीन ब्लैक एंड व्हाइट होने की सुविधा चालू करें</translation> <translation id="203574396658008164">लॉक स्क्रीन से नोट लेना चालू करें</translation> <translation id="2037445849770872822">इस Google खाते के लिए निगरानी की सुविधा सेट अप कर दी गई है. ज़्यादा 'माता-पिता के नियंत्रण में' सुविधा को सेट अप करने के लिए, 'जारी रखें' चुनें. @@ -1845,6 +1849,7 @@ <translation id="2673135533890720193">अपना ब्राउज़िंग इतिहास पढ़ें</translation> <translation id="2674764818721168631">बंद है</translation> <translation id="2678063897982469759">फिर से चालू करें</translation> +<translation id="2678100101831051676">कास्ट नहीं हो पा रहा है.</translation> <translation id="268053382412112343">इति&हास</translation> <translation id="2681124317993121768">गेस्ट प्रोफ़ाइल से वीएम सॉफ़्टवेयर इस्तेमाल नहीं किया जा सकता</translation> <translation id="2682498795777673382">आपके अभिभावक की तरफ़ से अपडेट</translation> @@ -2554,6 +2559,7 @@ <translation id="3363202073972776113">इस नई प्रोफ़ाइल को आपका संगठन मैनेज करेगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="3364986687961713424">आपके एडमिन से: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl या फिर Alt का इस्तेमाल करें</translation> +<translation id="3368586359109138591">कहीं और इस्तेमाल करने के लिए, पासवर्ड की कॉपी डाउनलोड करें</translation> <translation id="3368922792935385530">कनेक्ट है</translation> <translation id="3369067987974711168">इस पोर्ट की और कार्रवाइयां दिखाएं</translation> <translation id="3369624026883419694">होस्ट को परिष्कृत कर रहा है...</translation> @@ -2742,6 +2748,7 @@ <translation id="3532273508346491126">सिंक के लिए प्रबंधन</translation> <translation id="3532521178906420528">नेटवर्क कनेक्शन जोड़ा जा रहा है ...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - ऑडियो म्यूट किया गया</translation> +<translation id="3536492240554502321">रंग बदलने की सुविधा चालू करें</translation> <translation id="3537881477201137177">इसे 'सेटिंग' में जाकर बाद में बदला जा सकता है</translation> <translation id="3538066758857505094">Linux अनइंस्टॉल करने में गड़बड़ी हुई. कृपया फिर से कोशिश करें.</translation> <translation id="354060433403403521">AC एडॉप्टर</translation> @@ -3067,6 +3074,7 @@ <translation id="383669374481694771">यह इस डिवाइस और इसके इस्तेमाल से जुड़ी सामान्य जानकारी है, जैसे कि बैटरी कितनी चार्ज है, सिस्टम, और ऐप्लिकेशन की गतिविधि और गड़बड़ियां. डिवाइस से जुड़े इस डेटा का इस्तेमाल Android काे बेहतर बनाने के लिए किया जाएगा. साथ ही, इकट्ठा की गई कुछ जानकारी की मदद से Android डेवलपर जैसे पार्टनर और Google के ऐप्लिकेशन अपने प्रॉडक्ट को बेहतर बना पाएंगे.</translation> <translation id="3838085852053358637">एक्सटेंशन लोड नहीं हो सका</translation> <translation id="3838486795898716504">ज़्यादा <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Google Password Manager में सेव किए गए पासवर्ड जोड़ें</translation> <translation id="383891835335927981">कोई भी साइट ज़ूम इन या ज़ूम आउट नहीं की गई है</translation> <translation id="3839509547554145593">माउस से स्क्रोल करने की रफ़्तार बढ़ाने की सुविधा चालू करें</translation> <translation id="3839516600093027468"><ph name="HOST" /> को क्लिपबोर्ड देखने से हमेशा ब्लॉक करें</translation> @@ -3878,6 +3886,7 @@ <translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />" का इस्तेमाल करने के लिए, इस पेज को फिर से लोड करें</translation> <translation id="4617270414136722281">एक्सटेंशन के विकल्प</translation> <translation id="4617880081511131945">फ़ोन से कनेक्ट नहीं किया जा सका</translation> +<translation id="4618195822946934889">यूआरएल में सिर्फ़ ASCII वर्ण हो सकते हैं</translation> <translation id="4619564267100705184">अपनी पहचान की पुष्टि करें</translation> <translation id="4619615317237390068">अन्य डिवाइस के टैब</translation> <translation id="4620809267248568679">यह सेटिंग किसी एक्सटेंशन द्वारा लागू की गई है.</translation> @@ -4139,6 +4148,7 @@ <translation id="4871568871368204250">सिंक बंद करें</translation> <translation id="4871719318659334896">ग्रुप बंद करें</translation> <translation id="4872192066608821120">पासवर्ड इंपोर्ट करने के लिए, कोई CSV फ़ाइल चुनें</translation> +<translation id="4872212987539553601">डिवाइस पर एन्क्रिप्ट (सुरक्षित) करने का तरीका सेट अप करें</translation> <translation id="4873312501243535625">मीडिया फ़ाइल चेकर</translation> <translation id="4876273079589074638">इस क्रैश की जाँच-पड़ताल करने और इसे ठीक करने में हमारे इंजीनियरों की सहायता करें. अगर हो सके तो सटीक चरणों की सूची बनाएं. कोई भी विवरण छोटा नहीं है!</translation> <translation id="4876895919560854374">स्क्रीन लॉक करना और अनलॉक करना</translation> @@ -5077,6 +5087,7 @@ <translation id="5800351251499368110">साइड पैनल में सर्च टूलबार बंद करें. साइड पैनल में सर्च टूलबार चालू है.</translation> <translation id="5801568494490449797">प्राथमिकताएं</translation> <translation id="5804241973901381774">अनुमतियां</translation> +<translation id="5805268472388605531">उच्चारण के चिह्न और विशेष वर्णों को देखने के लिए, कीबोर्ड के बटन दबाकर रखें</translation> <translation id="5805697420284793859">विंडो मैनेजर</translation> <translation id="5806447147478173900">दिखाई गई साइटों ने कुल इतना स्टोरेज इस्तेमाल किया है: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (डिफ़ॉल्ट)</translation> @@ -5718,6 +5729,7 @@ <translation id="642469772702851743">इस डिवाइस (क्रमांक: <ph name="SERIAL_NUMBER" />) को मालिक ने लॉक कर दिया था.</translation> <translation id="6425556984042222041">लिखाई को बोली में बदलने की दर</translation> <translation id="642729974267661262">आवाज़ चलाने की अनुमति नहीं है</translation> +<translation id="6427608534767366138">"<ph name="NETWORK_ID" />" के लिए, प्रॉक्सी सर्वर की पुष्टि करना ज़रूरी है</translation> <translation id="6429384232893414837">अपडेट में गड़बड़ी</translation> <translation id="6430814529589430811">Base64 में एन्कोड किया गया ASCII, सिर्फ़ एक प्रमाणपत्र</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> इस कंप्यूटर के सभी उपयोगकर्ताओं के लिए स्वचालित अपडेट सेट करेगा.</translation> @@ -6438,6 +6450,7 @@ <translation id="7093220653036489319">हाज़िर जवाब</translation> <translation id="7093416310351037609">आपके डेटा की सुरक्षा के लिए, यह ज़रूरी है कि शर्तें पूरी करने वाले सभी डाउनलोड, संगठन के <ph name="WEB_DRIVE" /> खाते में सेव किए जाएं.</translation> <translation id="7093866338626856921"><ph name="HOSTNAMES" /> नामक डिवाइस से डेटा का लेन-देन करें</translation> +<translation id="7094680343477712655">अपने <ph name="DEVICE_NAME" /> पर, कास्ट करने के अनुरोध को स्वीकार करें.</translation> <translation id="7098389117866926363">USB-C डिवाइस (पीछे बायां पोर्ट)</translation> <translation id="7098447629416471489">सेव किए गए दूसरे सर्च इंजन यहां दिखाई देंगे</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{ऐप्लिकेशन हटाएं}one{ऐप्लिकेशन हटाएं}other{ऐप्लिकेशन हटाएं}}</translation> @@ -6538,6 +6551,7 @@ <translation id="7212097698621322584">अपना मौजूदा पिन डालकर उसे बदलें. अगर आप पिन नहीं जानते हैं, तो आपको सुरक्षा कुंजी रीसेट करनी होगी, फिर एक नया पिन बनाना होगा.</translation> <translation id="7213903639823314449">पता बार में इस्तेमाल किया गया सर्च इंजन</translation> <translation id="721490496276866468">पासवर्ड इंपोर्ट करें</translation> +<translation id="7218514093816577632">पक्का करें कि आपके <ph name="DEVICE_NAME" /> पर सूचनाएं पाने की सुविधा चालू हो.</translation> <translation id="7219473482981809164">हमें ऐसी कई प्रोफ़ाइलें मिली हैं जिन्हें डाउनलोड करना है. आगे बढ़ने से पहले, वह प्रोफ़ाइल चुनें जिसे आप डाउनलोड करना चाहते हैं.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{कोई कमज़ोर पासवर्ड नहीं मिला}=1{1 कमज़ोर पासवर्ड मिला}one{{NUM_WEAK} कमज़ोर पासवर्ड मिला}other{{NUM_WEAK} कमज़ोर पासवर्ड मिले}}</translation> <translation id="7220019174139618249">पासवर्ड "<ph name="FOLDER" />" में निर्यात नहीं किए जा सकते</translation> @@ -7007,6 +7021,7 @@ <translation id="7664620655576155379">असमर्थित ब्लूटूथ डिवाइस: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">साइज़ रिज़र्व करें</translation> <translation id="7665369617277396874">खाता जोड़ें</translation> +<translation id="766635563210446220">पासवर्ड इंपोर्ट नहीं किए जा सके. <ph name="FILENAME" /> की जांच करें और पक्का करें कि इसका फ़ॉर्मैट सही हो. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> को {NUM_WEEKS} हफ़्ते में लौटाएं}one{<ph name="DEVICE_TYPE" /> को {NUM_WEEKS} हफ़्ते में लौटाएं}other{<ph name="DEVICE_TYPE" /> को {NUM_WEEKS} हफ़्तों में लौटाएं}}</translation> <translation id="7668423670802040666">Google पासवर्ड मैनेजर में <ph name="ACCOUNT" /> का पासवर्ड</translation> <translation id="7668648754769651616">सुलभता सुविधाओं से डिवाइस को आसानी से इस्तेमाल करने में मदद मिलती है. फटाफट सेटिंग को ऐक्सेस करने के लिए, स्क्रीन पर सबसे नीचे, समय चुनें.</translation> @@ -7538,6 +7553,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{एक वीडियो}one{# वीडियो}other{# वीडियो}}</translation> <translation id="8143442547342702591">अमान्य ऐप्लिकेशन</translation> <translation id="8143609395536282994">अपना डेटा कैसे मैनेज करें:</translation> +<translation id="8145170459658034418">मेमोरी बचाने वाली सेटिंग</translation> <translation id="8146177459103116374">अगर आप इस डिवाइस पर पहले से रजिस्टर हैं, तो आप <ph name="LINK2_START" />मौजूदा उपयोगकर्ता के रूप में साइन इन<ph name="LINK2_END" /> कर सकते हैं.</translation> <translation id="8146287226035613638">अपनी पसंदीदा भाषाओं को जोड़ें और उन्हें मनमुताबिक क्रम में लगाएं. जब संभव होगा, वेबसाइटें आपकी पसंदीदा भाषाओं में दिखेंगी. इन प्राथमिकताओं को आपके ब्राउज़र की सेटिंग के साथ सिंक किया जाता है. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">साइन इन नहीं हो पाया. कृपया अपने एडमिन से संपर्क करें या फिर से कोशिश करें.</translation> @@ -7597,6 +7613,7 @@ <translation id="8198456017687137612">कास्टिंग टैब</translation> <translation id="8199300056570174101">नेटवर्क (सेवा) और डिवाइस प्रॉपर्टी</translation> <translation id="8200772114523450471">फिर से शुरू करें</translation> +<translation id="8200789660596905522">पक्का करें कि आपने <ph name="DEVICE_NAME" /> पर कास्ट करने के अनुरोध को स्वीकार किया है.</translation> <translation id="8202160505685531999">अपनी <ph name="DEVICE_TYPE" /> प्रोफ़ाइल अपडेट करने के लिए कृपया अपना पासवर्ड फिर से डालें.</translation> <translation id="8203152941016626022">आस-पास शेयर करने की सुविधा और डिवाइस का नाम</translation> <translation id="8203732864715032075">आपको सूचनाएं भेजती है और यह याद रखती है कि मैसेज के लिए यह कंप्यूटर डिफ़ॉल्ट है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> @@ -7848,6 +7865,7 @@ <translation id="844063558976952706">इस साइट पर हमेशा</translation> <translation id="8441313165929432954">टेदरिंग को चालू/बंद करें</translation> <translation id="8443795068008423036">कृपया पक्का करें कि आपका डिवाइस अप-टू-डेट हो और फिर से कोशिश करें</translation> +<translation id="8443986842926457191">यूआरएल 2048 वर्णों से ज़्यादा का है</translation> <translation id="8446884382197647889">ज़्यादा जानें</translation> <translation id="8447409163267621480">Ctrl या Alt में से किसी एक को शामिल करें</translation> <translation id="844850004779619592">कोई निर्देश नहीं मिला</translation> @@ -7913,6 +7931,7 @@ <translation id="851263357009351303"><ph name="HOST" /> को हमेशा चित्र दिखाने की अनुमति दें</translation> <translation id="8513108775083588393">ऑटो-रोटेट</translation> <translation id="8514746246728959655">कोई दूसरी सुरक्षा कुंजी आज़माकर देखें</translation> +<translation id="8519895319663397036">पासवर्ड इंपोर्ट नहीं किए जा सके. फ़ाइल का साइज़ 150 केबी से कम होना चाहिए.</translation> <translation id="8523493869875972733">बदलावों को बनाए रखें</translation> <translation id="8523849605371521713">पॉलिसी द्वारा जोड़ा गया</translation> <translation id="8524783101666974011">अपने Google खाते में कार्ड सेव करें</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 56e421e2d..856d8ba5 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -695,6 +695,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 RSA titkosítással</translation> <translation id="1641113438599504367">Biztonságos Böngészés</translation> <translation id="1641496881756082050">További műveletek a következőhöz: <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{1 további jelszót nem sikerült importálni, mert nem volt megfelelő a formátuma}other{{NUM_PASSWORDS} további jelszót nem sikerült importálni, mert nem volt megfelelő a formátumuk}}</translation> <translation id="1642492862748815878">Csatlakoztatva van a(z) <ph name="DEVICE" /> eszközhöz és <ph name="NUMBER_OF_DEVICES" /> másik Bluetooth-eszközhöz</translation> <translation id="1642494467033190216">A rootfs védelem eltávolítása és újraindítás szükséges a további hibakeresési funkciók engedélyezése előtt.</translation> <translation id="1643072738649235303">X9.62 ECDSA aláírás a következővel: SHA-1</translation> @@ -1843,6 +1844,7 @@ <translation id="2673135533890720193">A böngészési előzmények olvasása</translation> <translation id="2674764818721168631">Ki</translation> <translation id="2678063897982469759">Újraengedélyezés</translation> +<translation id="2678100101831051676">Átküldés sikertelen.</translation> <translation id="268053382412112343">Elő&zmények</translation> <translation id="2681124317993121768">A vendégprofilok nem támogatottak</translation> <translation id="2682498795777673382">Frissítés a szülőtől</translation> @@ -3876,6 +3878,7 @@ <translation id="4617019240346358451">Töltse be újra az oldalt a(z) „<ph name="EXTENSION_NAME" />” használatához</translation> <translation id="4617270414136722281">Bővítménybeállítások</translation> <translation id="4617880081511131945">Nem lehet kapcsolódni</translation> +<translation id="4618195822946934889">Az URL csak ASCII-karakterekből állhat</translation> <translation id="4619564267100705184">Igazolja személyazonosságát</translation> <translation id="4619615317237390068">Más eszközök lapjai</translation> <translation id="4620809267248568679">Ezt a beállítást egy bővítmény kényszeríti ki.</translation> @@ -5077,6 +5080,7 @@ <translation id="5800351251499368110">Oldalsó paneli keresés bezárása. Meg van nyitva a keresés az oldalsó panelen.</translation> <translation id="5801568494490449797">Beállítások</translation> <translation id="5804241973901381774">Engedélyek</translation> +<translation id="5805268472388605531">Az ékezetek és a speciális karakterek megjelenítéséhez tartsa lenyomva a billentyűket</translation> <translation id="5805697420284793859">Ablakkezelő</translation> <translation id="5806447147478173900">A megjelenített webhelyek által felhasznált teljes tárhely: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (alapértelmezett)</translation> @@ -5718,6 +5722,7 @@ <translation id="642469772702851743">Az eszközt (sorozatszám: <ph name="SERIAL_NUMBER" />) zárolta a tulajdonos.</translation> <translation id="6425556984042222041">Szövegfelolvasó sebessége</translation> <translation id="642729974267661262">Nem játszhatnak le hangot</translation> +<translation id="6427608534767366138">Proxyhitelesítés szükséges itt: „<ph name="NETWORK_ID" />”</translation> <translation id="6429384232893414837">Frissítési hiba</translation> <translation id="6430814529589430811">Base64 kódolású ASCII, egyedüli tanúsítvány</translation> <translation id="6431347207794742960">A <ph name="PRODUCT_NAME" /> jelen számítógép összes felhasználója számára beállítja az automatikus frissítéseket.</translation> @@ -7846,6 +7851,7 @@ <translation id="844063558976952706">Ezen a webhelyen mindig</translation> <translation id="8441313165929432954">Internetmegosztás engedélyezése/letiltása</translation> <translation id="8443795068008423036">Győződjön meg arról, hogy eszköze naprakész, majd próbálkozzon újra</translation> +<translation id="8443986842926457191">Az URL több mint 2048 karakterből áll</translation> <translation id="8446884382197647889">További információ</translation> <translation id="8447409163267621480">Használja a Ctrl vagy az Alt gombot</translation> <translation id="844850004779619592">Nem találhatók parancsok</translation> @@ -7911,6 +7917,7 @@ <translation id="851263357009351303"><ph name="HOST" /> mindig mutathasson képeket</translation> <translation id="8513108775083588393">Autom.forgatás</translation> <translation id="8514746246728959655">Próbálkozzon másik biztonsági hardverkulccsal</translation> +<translation id="8519895319663397036">Nem lehet importálni a jelszavakat. A fájl mérete nem érheti el a 150 kB-ot.</translation> <translation id="8523493869875972733">Módosítások megtartása</translation> <translation id="8523849605371521713">Házirend adta hozzá</translation> <translation id="8524783101666974011">Kártyák mentése a Google-fiókjába</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index b3be188..27a6c35 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -692,6 +692,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 con crittografia RSA</translation> <translation id="1641113438599504367">Navigazione sicura</translation> <translation id="1641496881756082050">Altre azioni per <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Non è stata importata 1 altra password perché non è formattata correttamente}other{Non sono state importate {NUM_PASSWORDS} altre password perché non sono formattate correttamente}}</translation> <translation id="1642492862748815878">Connessione a <ph name="DEVICE" /> e altri<ph name="NUMBER_OF_DEVICES" /> dispositivi Bluetooth</translation> <translation id="1642494467033190216">Per poter attivare altre funzioni di debug è necessario rimuovere la protezione rootfs e riavviare.</translation> <translation id="1643072738649235303">Firma X9.62 ECDSA con SHA-1</translation> @@ -1829,6 +1830,7 @@ <translation id="2673135533890720193">Leggere la cronologia di navigazione</translation> <translation id="2674764818721168631">Off</translation> <translation id="2678063897982469759">Riattiva</translation> +<translation id="2678100101831051676">Impossibile trasmettere.</translation> <translation id="268053382412112343">Cr&onologia</translation> <translation id="2681124317993121768">I profili ospite non sono supportati</translation> <translation id="2682498795777673382">Aggiornato da un genitore</translation> @@ -3862,6 +3864,7 @@ <translation id="4617019240346358451">Ricarica la pagina per utilizzare "<ph name="EXTENSION_NAME" />"</translation> <translation id="4617270414136722281">Opzioni estensione</translation> <translation id="4617880081511131945">Impossibile stabilire una connessione</translation> +<translation id="4618195822946934889">L'URL può contenere soltanto caratteri ASCII</translation> <translation id="4619564267100705184">Verifica la tua identità</translation> <translation id="4619615317237390068">Schede di altri dispositivi</translation> <translation id="4620809267248568679">Questa impostazione è applicata da un'estensione.</translation> @@ -5059,6 +5062,7 @@ <translation id="5800351251499368110">Chiudi la ricerca aperta nel riquadro laterale.</translation> <translation id="5801568494490449797">Preferenze</translation> <translation id="5804241973901381774">Autorizzazioni</translation> +<translation id="5805268472388605531">Tieni premuti i tasti della tastiera per vedere accenti e caratteri speciali</translation> <translation id="5805697420284793859">Gestione finestre</translation> <translation id="5806447147478173900">Spazio di archiviazione totale usato dai siti visualizzati: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (valore predefinito)</translation> @@ -5699,6 +5703,7 @@ <translation id="642469772702851743">Questo dispositivo (numero di serie <ph name="SERIAL_NUMBER" />) è stato bloccato dal proprietario.</translation> <translation id="6425556984042222041">Velocità sintesi vocale</translation> <translation id="642729974267661262">Non possono riprodurre suoni</translation> +<translation id="6427608534767366138">L'autenticazione del proxy è obbligatoria per "<ph name="NETWORK_ID" />"</translation> <translation id="6429384232893414837">Errore di aggiornamento</translation> <translation id="6430814529589430811">ASCII con codifica Base64, singolo certificato</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> imposterà gli aggiornamenti automatici per tutti gli utenti di questo computer.</translation> @@ -7828,6 +7833,7 @@ <translation id="844063558976952706">Sempre su questo sito</translation> <translation id="8441313165929432954">Attiva/disattiva tethering</translation> <translation id="8443795068008423036">Assicurati che il dispositivo sia aggiornato e riprova</translation> +<translation id="8443986842926457191">L'URL contiene più di 2048 caratteri</translation> <translation id="8446884382197647889">Scopri di più</translation> <translation id="8447409163267621480">Includi CTRL o ALT</translation> <translation id="844850004779619592">Nessun comando trovato</translation> @@ -7893,6 +7899,7 @@ <translation id="851263357009351303">Consenti sempre la visualizzazione di immagini in <ph name="HOST" /></translation> <translation id="8513108775083588393">Rotazione aut.</translation> <translation id="8514746246728959655">Prova a usare un altro token di sicurezza</translation> +<translation id="8519895319663397036">Impossibile importare le password. Le dimensioni file devono essere minori di 150 kB.</translation> <translation id="8523493869875972733">Mantieni le modifiche</translation> <translation id="8523849605371521713">Aggiunta in base alle norme</translation> <translation id="8524783101666974011">Salva carte nel tuo Account Google</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 81e1312..e30a18f 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">עוד מעט זמן להפסקה</translation> <translation id="1062628064301375934">רוצה לעזור לנו לשפר את הפרטיות באינטרנט?</translation> <translation id="1067048845568873861">נוצר</translation> +<translation id="1067661089446014701">כדי לשפר את הבטיחות, אפשר להצפין את הסיסמאות במכשיר שלך לפני שהן נשמרות בחשבון Google</translation> <translation id="1067922213147265141">שירותי Google אחרים</translation> <translation id="1069355737714877171">הסרה של פרופיל ה-eSIM שנקרא <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">תוכנה אחרת במחשב הוסיפה תוסף שעשוי לשנות את אופן הפעולה של Chrome. @@ -253,6 +254,7 @@ <translation id="1223853788495130632">מנהל המערכת ממליץ על ערך מסוים עבור הגדרה זו.</translation> <translation id="1225177025209879837">עיבוד הבקשה מתבצע...</translation> <translation id="1227507814927581609">האימות נכשל בעת ההתחברות אל "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">ההעברה נכשלה. יש לנסות שוב.</translation> <translation id="1230417814058465809">מופעלת הגנה רגילה. כדי להוסיף שכבת אבטחה, יש להשתמש בהגנה המשופרת.</translation> <translation id="1231733316453485619">להפעיל סנכרון?</translation> <translation id="1232569758102978740">ללא שם</translation> @@ -694,6 +696,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 עם הצפנת RSA</translation> <translation id="1641113438599504367">גלישה בטוחה</translation> <translation id="1641496881756082050">עוד פעולות לרשת <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{סיסמה אחת נוספת לא יובאה כי הפורמט שלה שגוי}two{{NUM_PASSWORDS} סיסמאות נוספות לא יובאו כי הפורמט שלהן שגוי}many{{NUM_PASSWORDS} סיסמאות נוספות לא יובאו כי הפורמט שלהן שגוי}other{{NUM_PASSWORDS} סיסמאות נוספות לא יובאו כי הפורמט שלהן שגוי}}</translation> <translation id="1642492862748815878">קיים חיבור אל <ph name="DEVICE" /> ול-<ph name="NUMBER_OF_DEVICES" /> מכשירי Bluetooth נוספים</translation> <translation id="1642494467033190216">הסרה של הגנת rootfs והפעלה מחדש נדרשות לפני שמפעילים תכונות אחרות של ניפוי באגים.</translation> <translation id="1643072738649235303">חתימת X9.62 ECDSA עם SHA-1</translation> @@ -1123,6 +1126,7 @@ <translation id="2031914984822377766">יש להוסיף את <ph name="LINK_BEGIN" />שפות האתר<ph name="LINK_END" /> המועדפות. השפה המובילה מהרשימה תשמש לתרגומים.</translation> <translation id="2033758234986231162">החיבור לטלפון לא יציב. יש לוודא שהטלפון נמצא בקרבת מקום, שהוא לא נעול ושה-Bluetooth וה-Wi-Fi פועלים.</translation> <translation id="2034346955588403444">הוספת עוד רשת Wi-Fi</translation> +<translation id="2035211704574173780">גוונים של אפור</translation> <translation id="203574396658008164">הפעלת רישום הערות ממסך הנעילה</translation> <translation id="2037445849770872822">הוגדר פיקוח על חשבון Google הזה. כדי להגדיר עוד אפשרויות של בקרת הורים יש ללחוץ על 'המשך'. @@ -1841,6 +1845,7 @@ <translation id="2673135533890720193">לקרוא את היסטוריית הגלישה שלך</translation> <translation id="2674764818721168631">כבוי</translation> <translation id="2678063897982469759">הפעלה מחדש</translation> +<translation id="2678100101831051676">לא ניתן להעביר (cast).</translation> <translation id="268053382412112343">הי&סטוריה</translation> <translation id="2681124317993121768">פרופילים של אורחים אינם נתמכים</translation> <translation id="2682498795777673382">בוצע עדכון על-ידי הורה</translation> @@ -2548,6 +2553,7 @@ <translation id="3363202073972776113">הפרופיל החדש ינוהל על ידי הארגון שלך. <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> <translation id="3364986687961713424">ממנהל המערכת שלך: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">צריך להשתמש ב-Ctrl או ב-Alt</translation> +<translation id="3368586359109138591">הורדת עותק לשימוש במקום אחר</translation> <translation id="3368922792935385530">מחובר</translation> <translation id="3369067987974711168">הצגת פעולות נוספות בנוגע ליציאה הזאת</translation> <translation id="3369624026883419694">המערכת מבררת את כתובת השרת המארח...</translation> @@ -2736,6 +2742,7 @@ <translation id="3532273508346491126">ניהול סנכרון</translation> <translation id="3532521178906420528">מתבצע חיבור לרשת...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - האודיו הושתק</translation> +<translation id="3536492240554502321">סיבוב גוון</translation> <translation id="3537881477201137177">ניתן לשנות זאת מאוחר יותר ב'הגדרות'</translation> <translation id="3538066758857505094">קרתה שגיאה בהסרת ההתקנה של Linux. צריך לנסות שוב.</translation> <translation id="354060433403403521">מתאם AC</translation> @@ -3058,6 +3065,7 @@ <translation id="383669374481694771">זהו מידע כללי על המכשיר הזה ואופן השימוש בו (למשל רמת הסוללה, פעילות המערכת, הפעילות באפליקציות ושגיאות). הנתונים האלה ישמשו כדי לשפר את Android. חלק מהמידע הנצבר יעזור גם לשפר את האפליקציות של Google, וכן יעזור לשותפים של Google (למשל למפתחים של Android) לשפר את האפליקציות והמוצרים שלהם.</translation> <translation id="3838085852053358637">טעינת התוסף נכשלה</translation> <translation id="3838486795898716504"><ph name="PAGE_TITLE" /> נוספים</translation> +<translation id="3838487810283346084">אפשר להוסיף סיסמאות שמורות למנהל הסיסמאות של Google</translation> <translation id="383891835335927981">באף אתר לא השתנה המרחק מהתצוגה</translation> <translation id="3839509547554145593">הפעלה של האצת גלילה בעכבר</translation> <translation id="3839516600093027468">יש למנוע תמיד מ-<ph name="HOST" /> לגשת אל הלוח</translation> @@ -3867,6 +3875,7 @@ <translation id="4617019240346358451">יש לטעון את הדף מחדש כדי להשתמש בתוסף '<ph name="EXTENSION_NAME" />'</translation> <translation id="4617270414136722281">אפשרויות של תוספים</translation> <translation id="4617880081511131945">לא ניתן ליצור חיבור</translation> +<translation id="4618195822946934889">כתובת ה-URL יכולה להכיל רק תווים מסוג ASCII</translation> <translation id="4619564267100705184">אימות הזהות שלך</translation> <translation id="4619615317237390068">כרטיסיות ממכשירים אחרים</translation> <translation id="4620809267248568679">הגדרה זו נאכפת על ידי תוסף.</translation> @@ -4128,6 +4137,7 @@ <translation id="4871568871368204250">כיבוי הסינכרון</translation> <translation id="4871719318659334896">סגירת הקבוצה</translation> <translation id="4872192066608821120">כדי לייבא סיסמאות, צריך לבחור קובץ CSV</translation> +<translation id="4872212987539553601">איך מגדירים הצפנה במכשיר</translation> <translation id="4873312501243535625">בודק קובצי המדיה</translation> <translation id="4876273079589074638">רוצה לעזור למהנדסים שלנו לחקור את הקריסה הזו ולתקן אותה? מומלץ לרשום את השלבים בצורה כמה שיותר מדויקת, גם הפרטים הקטנים ביותר יכולים לעזור.</translation> <translation id="4876895919560854374">נעילה ושחרור של המסך</translation> @@ -5065,6 +5075,7 @@ <translation id="5800351251499368110">סגירת החיפוש בחלונית הצדדית. החיפוש פתוח בחלונית הצדדית.</translation> <translation id="5801568494490449797">העדפות</translation> <translation id="5804241973901381774">הרשאות</translation> +<translation id="5805268472388605531">כדי לראות סימנים דיאקריטיים ותווים מיוחדים, יש להקיש הקשה ארוכה על מקשי המקלדת</translation> <translation id="5805697420284793859">מנהל החלונות</translation> <translation id="5806447147478173900">נפח האחסון הכולל שבשימוש של האתרים המוצגים: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (ברירת מחדל)</translation> @@ -5705,6 +5716,7 @@ <translation id="642469772702851743">מכשיר זה (מספר סידורי: <ph name="SERIAL_NUMBER" />) ננעל על-ידי הבעלים.</translation> <translation id="6425556984042222041">קצב המרת טקסט לדיבור (TTS)</translation> <translation id="642729974267661262">לא מורשים להשמיע צלילים</translation> +<translation id="6427608534767366138">נדרש אימות של שרת proxy עבור <ph name="NETWORK_ID" /></translation> <translation id="6429384232893414837">שגיאת עדכון</translation> <translation id="6430814529589430811">ASCII בקידוד Base64, אישור יחיד</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> יגדיר עדכונים אוטומטיים לכל המשתמשים במחשב זה.</translation> @@ -6426,6 +6438,7 @@ <translation id="7093220653036489319">תשובות מהירות</translation> <translation id="7093416310351037609">כדי לשמור על האבטחה והבטיחות של הנתונים שלך, הארגון דורש שכל ההורדות המתאימות יישמרו בחשבון <ph name="WEB_DRIVE" /> של הארגון.</translation> <translation id="7093866338626856921">החלפת נתונים עם המכשירים ששמותיהם: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">יש לאשר את בקשת ההעברה (cast) במכשיר <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">מכשיר עם יציאת USB-C (יציאה שמאלית מאחור)</translation> <translation id="7098447629416471489">כאן יופיעו מנועי חיפוש אחרים ששמרת</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{הסרת האפליקציה}two{הסרת האפליקציות}many{הסרת האפליקציות}other{הסרת האפליקציות}}</translation> @@ -6526,6 +6539,7 @@ <translation id="7212097698621322584">צריך להזין את קוד האימות הנוכחי כדי לשנות אותו. אם קוד האימות לא ידוע לך, צריך לאפס את מפתח האבטחה ולאחר מכן ליצור קוד אימות חדש.</translation> <translation id="7213903639823314449">מנוע החיפוש שנמצא בשימוש בסרגל הכתובות</translation> <translation id="721490496276866468">ייבוא סיסמאות</translation> +<translation id="7218514093816577632">צריך לוודא שההתראות מופעלות במכשיר <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">מצאנו מספר פרופילים שזמינים להורדה. עליך לבחור את הפרופילים שברצונך להוריד כדי להמשיך.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{אין סיסמאות חלשות}=1{סיסמה חלשה אחת}two{{NUM_WEAK} סיסמאות חלשות}many{{NUM_WEAK} סיסמאות חלשות}other{{NUM_WEAK} סיסמאות חלשות}}</translation> <translation id="7220019174139618249">אי אפשר לייצא סיסמאות אל "<ph name="FOLDER" />"</translation> @@ -6994,6 +7008,7 @@ <translation id="7664620655576155379">מכשיר Bluetooth שאינו נתמך: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">הקצאת שטח קבוע</translation> <translation id="7665369617277396874">חשבון חדש</translation> +<translation id="766635563210446220">לא ניתן לייבא את הסיסמאות. צריך לבדוק את הקובץ <ph name="FILENAME" /> ולוודא שהפורמט שלו תקין. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{יש להחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> בתוך שבוע ({NUM_WEEKS})}two{יש להחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> בתוך שבועיים ({NUM_WEEKS})}many{יש להחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> בתוך {NUM_WEEKS} שבועות}other{יש להחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> בתוך {NUM_WEEKS} שבועות}}</translation> <translation id="7668423670802040666">שמורה במנהל הסיסמאות של Google בחשבון <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">תכונות הנגישות הופכות את השימוש במכשיר לפשוט יותר. כדי לגשת לתפריט הגדרות מהירות, לוחצים על השעה שבתחתית המסך.</translation> @@ -7526,6 +7541,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{סרטון}two{# סרטונים}many{# סרטונים}other{# סרטונים}}</translation> <translation id="8143442547342702591">יישום לא חוקי</translation> <translation id="8143609395536282994">איך אפשר לנהל את הנתונים שלך:</translation> +<translation id="8145170459658034418">מצב חיסכון בזיכרון</translation> <translation id="8146177459103116374">אם נרשמת כבר במכשיר זה, יהיה באפשרותך <ph name="LINK2_START" />להתחבר כמשתמש קיים<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">ניתן להוסיף שפות מועדפות ולדרג אותן. האתרים יוצגו בשפות המועדפות שלך כשזה יהיה אפשרי. ההעדפות האלה מסונכרנות עם הגדרות הדפדפן. <ph name="BEGIN_LINK_LEARN_MORE" />מידע נוסף<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">הכניסה נכשלה. יש ליצור קשר עם מנהל המערכת או לנסות שוב.</translation> @@ -7585,6 +7601,7 @@ <translation id="8198456017687137612">העברת הכרטיסייה</translation> <translation id="8199300056570174101">מאפייני רשת (שירות) ומכשיר</translation> <translation id="8200772114523450471">חידוש</translation> +<translation id="8200789660596905522">צריך לאשר את בקשת ההעברה במכשיר <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">יש להזין שוב את הסיסמה כדי לעדכן את פרופיל <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">הגדרת שם המכשיר לשיתוף בקרבת מקום</translation> <translation id="8203732864715032075">המערכת שולחת לך התראות ומגדירה את המחשב הזה כברירת מחדל לשליחת ההודעות. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> @@ -7835,6 +7852,7 @@ <translation id="844063558976952706">תמיד באתר זה</translation> <translation id="8441313165929432954">הפעלה/השבתה של שיתוף אינטרנט (tethering)</translation> <translation id="8443795068008423036">צריך לוודא שהמכשיר מעודכן ולנסות שוב</translation> +<translation id="8443986842926457191">כתובת ה-URL מכילה יותר מ-2048 תווים</translation> <translation id="8446884382197647889">למידע נוסף</translation> <translation id="8447409163267621480">יש לכלול את Ctrl או Alt</translation> <translation id="844850004779619592">לא נמצאו פקודות</translation> @@ -7900,6 +7918,7 @@ <translation id="851263357009351303">התרה ל-<ph name="HOST" /> להציג תמונות תמיד</translation> <translation id="8513108775083588393">סיבוב אוטומטי</translation> <translation id="8514746246728959655">יש לנסות מפתח אבטחה שונה</translation> +<translation id="8519895319663397036">לא ניתן לייבא את הסיסמאות. גודל הקובץ צריך להיות פחות מ-150KB.</translation> <translation id="8523493869875972733">שמירת השינויים</translation> <translation id="8523849605371521713">נוסף על-ידי מדיניות</translation> <translation id="8524783101666974011">שמירת כרטיסים בחשבון Google</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index b9a883b..3b3c715 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -6718,6 +6718,7 @@ <translation id="7404065585741198296">თქვენი ტელეფონი USB კაბელით</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{უსაფრთხოების შემოწმება შესრულდა 1 საათის წინ}other{უსაფრთხოების შემოწმება შესრულდა {NUM_HOURS} საათის წინ}}</translation> <translation id="740624631517654988">კონტექსტური ფანჯარა დაბლოკილია</translation> +<translation id="7406912950279255498">ფერთა ინვერსიის რეჟიმი</translation> <translation id="7407430846095439694">იმპორტი და მიბმა</translation> <translation id="7407504355934009739">ადამიანთა უმეტესობა ბლოკავს შეტყობინებებს ამ საიტისგან</translation> <translation id="740810853557944681">ბეჭდვის სერვერის დამატება</translation> @@ -7666,6 +7667,7 @@ <ph name="BEGIN_PARAGRAPH3" />ამ ფუნქციის მართვა მფლობელს შეუძლია აქ: პარამეტრები > გაფართოებული > დიაგნოსტიკური და გამოყენების შესახებ მონაცემების Google-ისთვის ავტომატურად გაგზავნა.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />თუ თქვენი შვილისთვის ჩართულია ვებსა და აპებში დამატებითი აქტივობის პარამეტრი, აღნიშნული მონაცემები შეიძლება შეინახოს მის Google ანგარიშში. აღნიშნული ფუნქციებისა და მათი დარეგულირების ხერხების შესახებ დამატებითი ინფორმაციის მიღება შეგიძლიათ მისამართზე: families.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="826905130698769948">კლიენტის სერტიფიკატი არასწორია</translation> +<translation id="8270162672241199380">Steam ინსტალატორი</translation> <translation id="827097179112817503">მთავარი გვერდის ღილაკის ჩვენება</translation> <translation id="8271268254812352141">მიიღეთ განმარტებები, თარგმნეთ ან გადაიყვანეთ საზომი ერთეულები ტექსტზე მარჯვენა დაწკაპუნების ან ხანგრძლივად შეხების მეშვეობით. სათარგმნი ენების მორგება <ph name="LINK_BEGIN" />ვებსაიტების ენების<ph name="LINK_END" /> სექციიდან შეგიძლიათ.</translation> <translation id="8271379370373330993">მშობლებო, მომდევნო რამდენიმე ნაბიჯი თქვენთვისაა. <ph name="DEVICE_TYPE" /> ბავშვს შეგიძლიათ დაუბრუნოთ ანგარიშის დაყენების შემდეგ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 759fd15..554324b 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">곧 휴식 시간입니다</translation> <translation id="1062628064301375934">웹의 개인 정보 보호 개선에 동참해 주세요</translation> <translation id="1067048845568873861">생성됨</translation> +<translation id="1067661089446014701">보안 강화를 위해 비밀번호를 Google 계정에 저장하기 전에 기기에서 암호화할 수 있습니다.</translation> <translation id="1067922213147265141">다른 Google 서비스</translation> <translation id="1069355737714877171">이름이 <ph name="PROFILE_NAME" />인 eSIM 프로필 삭제</translation> <translation id="1070377999570795893">컴퓨터의 다른 프로그램에서 Chrome 작동에 영향을 줄 수 있는 확장 프로그램을 추가했습니다. @@ -251,6 +252,7 @@ <translation id="1223853788495130632">관리자가 이 설정에 대해 특정 값을 추천합니다.</translation> <translation id="1225177025209879837">요청을 처리하는 중...</translation> <translation id="1227507814927581609">'<ph name="DEVICE_NAME" />'에 연결하는 동안 인증에 실패했습니다.</translation> +<translation id="1227993798763400520">전송할 수 없습니다. 다시 시도해 주세요</translation> <translation id="1230417814058465809">표준 보호 모드가 사용 설정되어 있습니다. 보안을 더욱 강화하려면 향상된 보호 모드를 사용하세요.</translation> <translation id="1231733316453485619">동기화를 사용하시겠습니까?</translation> <translation id="1232569758102978740">제목 없음</translation> @@ -695,6 +697,7 @@ <translation id="1640283014264083726">PKCS #1 MD4(RSA 암호화 사용)</translation> <translation id="1641113438599504367">세이프 브라우징</translation> <translation id="1641496881756082050"><ph name="NETWORK_NAME" />의 작업 메뉴 더보기</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{형식이 잘못되어 비밀번호 1개를 가져오지 못했습니다.}other{형식이 잘못되어 비밀번호 {NUM_PASSWORDS}개를 가져오지 못했습니다.}}</translation> <translation id="1642492862748815878"><ph name="DEVICE" /> 외 <ph name="NUMBER_OF_DEVICES" />개 블루투스 기기에 연결되었습니다</translation> <translation id="1642494467033190216">rootfs 보호를 삭제하고 다시 시작해야 다른 디버깅 기능을 사용 설정할 수 있습니다.</translation> <translation id="1643072738649235303">SHA-1을 포함한 X9.62 ECDSA 서명</translation> @@ -1124,6 +1127,7 @@ <translation id="2031914984822377766">선호하는 <ph name="LINK_BEGIN" />웹사이트 언어<ph name="LINK_END" />를 추가하세요. 번역 시 목록의 가장 위에 있는 언어가 사용됩니다.</translation> <translation id="2033758234986231162">휴대전화와 연결을 유지할 수 없습니다. 휴대전화가 근처에 있고, 잠금 해제되어 있으며, 블루투스와 Wi-Fi가 켜져 있는지 확인하세요.</translation> <translation id="2034346955588403444">다른 Wi-Fi 네트워크 추가</translation> +<translation id="2035211704574173780">그레이스케일</translation> <translation id="203574396658008164">잠금 화면에서 메모 작성 사용</translation> <translation id="2037445849770872822">이 Google 계정에 감독 기능이 설정되었습니다. 더 많은 자녀 보호 기능을 설정하려면 계속을 선택하세요. @@ -1845,6 +1849,7 @@ <translation id="2673135533890720193">인터넷 사용 기록 확인</translation> <translation id="2674764818721168631">사용 안함</translation> <translation id="2678063897982469759">다시 사용</translation> +<translation id="2678100101831051676">전송할 수 없습니다</translation> <translation id="268053382412112343">내역(&S)</translation> <translation id="2681124317993121768">게스트 프로필은 지원되지 않습니다.</translation> <translation id="2682498795777673382">보호자가 업데이트한 내용</translation> @@ -2554,6 +2559,7 @@ <translation id="3363202073972776113">이 새 프로필은 조직에서 관리합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="3364986687961713424">관리자의 메시지: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl 또는 Alt 키 중에 하나만 사용하세요</translation> +<translation id="3368586359109138591">다른 곳에서 사용할 사본을 다운로드합니다.</translation> <translation id="3368922792935385530">연결됨</translation> <translation id="3369067987974711168">이 포트에 관한 작업 더보기</translation> <translation id="3369624026883419694">호스트 알아내는 중...</translation> @@ -2742,6 +2748,7 @@ <translation id="3532273508346491126">동기화 관리</translation> <translation id="3532521178906420528">네트워크 연결 설정 중...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - 오디오 음소거</translation> +<translation id="3536492240554502321">색조 회전</translation> <translation id="3537881477201137177">나중에 설정에서 수정할 수 있습니다.</translation> <translation id="3538066758857505094">Linux를 제거하는 동안 문제가 발생했습니다. 다시 시도해 주세요.</translation> <translation id="354060433403403521">AC 어댑터</translation> @@ -3067,6 +3074,7 @@ <translation id="383669374481694771">기기 및 기기 사용 방식에 관한 일반적인 정보(배터리 수준, 시스템 및 앱 활동, 오류 등)입니다. 데이터는 Android를 개선하는 데 사용되며 일부 수집 정보는 Google 앱과 파트너(Android 개발자 등)가 앱 및 제품을 개선하는 데도 도움이 됩니다.</translation> <translation id="3838085852053358637">확장 프로그램을 로드하지 못함</translation> <translation id="3838486795898716504"><ph name="PAGE_TITLE" /> 더보기</translation> +<translation id="3838487810283346084">저장된 비밀번호를 Google 비밀번호 관리자에 추가합니다.</translation> <translation id="383891835335927981">확대 또는 축소된 사이트가 없음</translation> <translation id="3839509547554145593">마우스 스크롤 가속 사용</translation> <translation id="3839516600093027468"><ph name="HOST" />에서 클립보드를 볼 수 없도록 항상 차단</translation> @@ -3877,6 +3885,7 @@ <translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />" 확장 프로그램을 사용하려면 페이지를 새로고침하세요</translation> <translation id="4617270414136722281">확장 프로그램 옵션</translation> <translation id="4617880081511131945">연결을 설정할 수 없음</translation> +<translation id="4618195822946934889">URL에는 ASCII 문자만 포함할 수 있습니다.</translation> <translation id="4619564267100705184">본인 인증</translation> <translation id="4619615317237390068">다른 기기의 탭</translation> <translation id="4620809267248568679">이 설정은 확장 프로그램에서 시행합니다.</translation> @@ -4138,6 +4147,7 @@ <translation id="4871568871368204250">동기화 사용 중지</translation> <translation id="4871719318659334896">그룹 닫기</translation> <translation id="4872192066608821120">비밀번호를 가져오려면 CSV 파일을 선택하세요.</translation> +<translation id="4872212987539553601">온디바이스 암호화 설정</translation> <translation id="4873312501243535625">미디어 파일 검사기</translation> <translation id="4876273079589074638">Google 엔지니어가 이 비정상 종료를 조사하고 해결할 수 있도록 도와주세요. 가능한 경우 단계를 정확히 나열해 주세요. 자세히 설명해 주시면 큰 도움이 됩니다.</translation> <translation id="4876895919560854374">화면 잠금 및 잠금 해제</translation> @@ -5076,6 +5086,7 @@ <translation id="5800351251499368110">측면 패널의 검색을 닫습니다. 측면 패널에 검색이 열려 있습니다.</translation> <translation id="5801568494490449797">환경설정</translation> <translation id="5804241973901381774">권한</translation> +<translation id="5805268472388605531">키보드 키를 길게 누르면 악센트 기호와 특수문자가 표시됩니다</translation> <translation id="5805697420284793859">창 관리자</translation> <translation id="5806447147478173900">표시된 사이트에서 사용 중인 총 저장용량: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0°(기본값)</translation> @@ -5717,6 +5728,7 @@ <translation id="642469772702851743">소유자가 이 기기(SN: <ph name="SERIAL_NUMBER" />)를 잠갔습니다.</translation> <translation id="6425556984042222041">텍스트 음성 변환 속도</translation> <translation id="642729974267661262">소리 재생이 허용되지 않음</translation> +<translation id="6427608534767366138">"<ph name="NETWORK_ID" />"에 프록시 인증이 필요합니다.</translation> <translation id="6429384232893414837">업데이트 오류</translation> <translation id="6430814529589430811">Base64-인코딩 ASCII, 단일 인증서</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" />에서 이 컴퓨터의 모든 사용자에 대해 자동 업데이트를 설정합니다.</translation> @@ -6435,6 +6447,7 @@ <translation id="7093220653036489319">빠른 답변</translation> <translation id="7093416310351037609">조직에서 데이터 안전 및 보안을 위해 조건을 충족하는 다운로드 항목을 모두 조직의 <ph name="WEB_DRIVE" /> 계정에 저장할 것을 요구합니다.</translation> <translation id="7093866338626856921">이름이 <ph name="HOSTNAMES" />인 기기와 데이터 교환</translation> +<translation id="7094680343477712655"><ph name="DEVICE_NAME" />에서 전송 요청 수락</translation> <translation id="7098389117866926363">USB-C 기기(좌측 후면 포트)</translation> <translation id="7098447629416471489">저장한 다른 검색엔진이 여기에 표시됨</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{앱 삭제}other{앱 삭제}}</translation> @@ -6535,6 +6548,7 @@ <translation id="7212097698621322584">PIN을 변경하려면 현재 PIN을 입력하세요. PIN을 모르는 경우 보안 키를 재설정한 다음 새 PIN을 만들어야 합니다.</translation> <translation id="7213903639823314449">주소 표시줄에서 사용되는 검색엔진</translation> <translation id="721490496276866468">비밀번호 가져오기</translation> +<translation id="7218514093816577632"><ph name="DEVICE_NAME" />에 알림이 사용 설정되어 있는지 확인하세요</translation> <translation id="7219473482981809164">다운로드할 수 있는 프로필이 여러 개 확인되었습니다. 계속하기 전에 다운로드할 프로필을 선택하세요.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{취약한 비밀번호 없음}=1{취약한 비밀번호 1개}other{취약한 비밀번호 {NUM_WEAK}개}}</translation> <translation id="7220019174139618249">'<ph name="FOLDER" />'(으)로 비밀번호를 내보낼 수 없음</translation> @@ -7004,6 +7018,7 @@ <translation id="7664620655576155379">지원되지 않는 블루투스 기기(<ph name="DEVICE_NAME" />)입니다.</translation> <translation id="7665082356120621510">용량 예약</translation> <translation id="7665369617277396874">계정 추가</translation> +<translation id="766635563210446220">비밀번호를 가져올 수 없습니다. <ph name="FILENAME" />를 확인하고 형식이 올바른지 확인하세요. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{{NUM_WEEKS}주 이내에 <ph name="DEVICE_TYPE" /> 반납}other{{NUM_WEEKS}주 이내에 <ph name="DEVICE_TYPE" /> 반납}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" />의 Google 비밀번호 관리자에서</translation> <translation id="7668648754769651616">접근성 기능을 사용하면 기기를 더 쉽게 사용할 수 있습니다. 빠른 설정에 액세스하려면 화면 하단의 시간을 선택하세요.</translation> @@ -7537,6 +7552,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{동영상 1개}other{동영상 #개}}</translation> <translation id="8143442547342702591">잘못된 애플리케이션</translation> <translation id="8143609395536282994">데이터 관리 방법:</translation> +<translation id="8145170459658034418">메모리 절약</translation> <translation id="8146177459103116374">이 기기에 이미 등록한 경우 <ph name="LINK2_START" />기존 사용자로 로그인<ph name="LINK2_END" />할 수 있습니다.</translation> <translation id="8146287226035613638">기본 언어를 추가하고 순위를 지정하세요. 가능한 경우 웹사이트가 기본 언어로 표시됩니다. 이러한 환경설정은 브라우저 설정과 동기화됩니다. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">로그인하지 못했습니다. 관리자에게 문의하거나 다시 시도해 보세요.</translation> @@ -7596,6 +7612,7 @@ <translation id="8198456017687137612">탭 전송 중</translation> <translation id="8199300056570174101">네트워크(서비스) 및 기기 속성</translation> <translation id="8200772114523450471">다시 시작</translation> +<translation id="8200789660596905522"><ph name="DEVICE_NAME" />에서 전송 요청을 수락해야 함</translation> <translation id="8202160505685531999"><ph name="DEVICE_TYPE" /> 프로필을 업데이트하려면 비밀번호 다시 입력</translation> <translation id="8203152941016626022">Nearby Share 기기 이름</translation> <translation id="8203732864715032075">알림을 보내고 메시지에서 이 컴퓨터를 기억하도록 기본값으로 설정합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> @@ -7847,6 +7864,7 @@ <translation id="844063558976952706">항상 이 사이트에서</translation> <translation id="8441313165929432954">테더링 사용/사용 중지</translation> <translation id="8443795068008423036">기기가 최신 상태인지 확인하고 다시 시도해 보세요</translation> +<translation id="8443986842926457191">URL이 2,048자(영문 기준)를 초과합니다.</translation> <translation id="8446884382197647889">자세히 알아보기</translation> <translation id="8447409163267621480">Ctrl 또는 Alt 중 하나를 포함해야 합니다</translation> <translation id="844850004779619592">검색된 명령어 없음</translation> @@ -7912,6 +7930,7 @@ <translation id="851263357009351303"><ph name="HOST" />에서 이미지 표시 항상 허용</translation> <translation id="8513108775083588393">자동 회전</translation> <translation id="8514746246728959655">다른 보안 키를 사용해 보세요</translation> +<translation id="8519895319663397036">비밀번호를 가져올 수 없습니다. 파일 크기가 150KB 미만이어야 합니다.</translation> <translation id="8523493869875972733">변경사항 유지</translation> <translation id="8523849605371521713">정책에 의해 추가</translation> <translation id="8524783101666974011">Google 계정에 카드 추가</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index c2458571..0ae8368 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Beveik atėjo laikas padaryti pertrauką</translation> <translation id="1062628064301375934">Padėkite mums kurti privatesnį žiniatinklį</translation> <translation id="1067048845568873861">Sukurtas</translation> +<translation id="1067661089446014701">Kad užtikrintumėte geresnę saugą, galite šifruoti slaptažodžius įrenginyje prieš išsaugodami juos „Google“ paskyroje</translation> <translation id="1067922213147265141">Kitos „Google“ paslaugos</translation> <translation id="1069355737714877171">Pašalinti „eSIM“ kortelės profilį pavadinimu „<ph name="PROFILE_NAME" />“</translation> <translation id="1070377999570795893">Kita kompiuterio programa pridėjo plėtinį, kuris gali pakeisti, kaip veikia „Chrome“. @@ -254,6 +255,7 @@ <translation id="1223853788495130632">Administratorius rekomenduoja naudoti konkrečią šio nustatymo vertę.</translation> <translation id="1225177025209879837">Užklausa apdorojama…</translation> <translation id="1227507814927581609">Autentifikuojant tuo metu, kai buvo prisijungiant prie „<ph name="DEVICE_NAME" />“, įvyko klaida.</translation> +<translation id="1227993798763400520">Nepavyko perduoti. Bandykite dar kartą.</translation> <translation id="1230417814058465809">Įprasta apsauga įjungta. Jei norite apsisaugoti dar labiau, naudokite sustiprintą apsaugą.</translation> <translation id="1231733316453485619">Įjungti sinchronizavimą?</translation> <translation id="1232569758102978740">Be pavadinimo</translation> @@ -698,6 +700,7 @@ <translation id="1640283014264083726">PKCS Nr. 1 MD4 su RSA šifruote</translation> <translation id="1641113438599504367">Saugus naršymas</translation> <translation id="1641496881756082050">Daugiau veiksmų („<ph name="NETWORK_NAME" />“)</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Dar vienas slaptažodis nebuvo importuotas, nes yra netinkamo formato}one{Dar {NUM_PASSWORDS} slaptažodis nebuvo importuotas, nes yra netinkamo formato}few{Dar {NUM_PASSWORDS} slaptažodžiai nebuvo importuoti, nes yra netinkamo formato}many{Dar {NUM_PASSWORDS} slaptažodžio nebuvo importuota, nes yra netinkamo formato}other{Dar {NUM_PASSWORDS} slaptažodžių nebuvo importuota, nes yra netinkamo formato}}</translation> <translation id="1642492862748815878">Prisijungta prie „<ph name="DEVICE" />“ ir dar <ph name="NUMBER_OF_DEVICES" /> „Bluetooth“ įreng.</translation> <translation id="1642494467033190216">Prieš įgalinant kitas derinimo funkcijas reikia pašalinti „rootfs“ apsaugą ir paleisti įrenginį iš naujo.</translation> <translation id="1643072738649235303">X9.62 ECDSA parašas naudojant SHA-1</translation> @@ -1127,6 +1130,7 @@ <translation id="2031914984822377766">Pridėkite pageidaujamas <ph name="LINK_BEGIN" />svetainės kalbas<ph name="LINK_END" />. Bus verčiama į sąrašo viršuje nurodytą kalbą.</translation> <translation id="2033758234986231162">Nepavyko išlaikyti ryšio su telefonu. Įsitikinkite, kad telefonas yra netoliese, atrakintas ir įjungtas „Bluetooth“ bei „Wi-Fi“.</translation> <translation id="2034346955588403444">Pridėti kitą „WiFi“ tinklą</translation> +<translation id="2035211704574173780">Pilkumo tonai</translation> <translation id="203574396658008164">Įgalinti užrašų rašymą užrakinimo ekrane</translation> <translation id="2037445849770872822">Šioje „Google“ paskyroje nustatyta priežiūra. Jei norite nustatyti daugiau tėvų kontrolės nustatymų, pasirinkite „Tęsti“. @@ -1847,6 +1851,7 @@ <translation id="2673135533890720193">Skaityti naršymo istoriją</translation> <translation id="2674764818721168631">Išjungta</translation> <translation id="2678063897982469759">Iš naujo įgalinti</translation> +<translation id="2678100101831051676">Nepavyksta perduoti.</translation> <translation id="268053382412112343">Is&torija</translation> <translation id="2681124317993121768">Svečių profiliai nepalaikomi</translation> <translation id="2682498795777673382">Vieno iš tėvų naujinys</translation> @@ -2556,6 +2561,7 @@ <translation id="3363202073972776113">Šį naują profilį tvarkys jūsų organizacija. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Iš administratoriaus: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Naudokite „Ctrl“ arba „Alt“</translation> +<translation id="3368586359109138591">Atsisiųskite kopiją, jei norite naudoti kitur</translation> <translation id="3368922792935385530">Prijungta</translation> <translation id="3369067987974711168">Rodyti daugiau šio prievado veiksmų</translation> <translation id="3369624026883419694">Ieškoma pagrindinio serverio...</translation> @@ -2744,6 +2750,7 @@ <translation id="3532273508346491126">Sinchronizuoti valdymą</translation> <translation id="3532521178906420528">Užmezgamas tinklo ryšys...</translation> <translation id="353316712352074340">„<ph name="WINDOW_TITLE" />“ – garso įrašas nutildytas</translation> +<translation id="3536492240554502321">Atspalvio kaitaliojimas</translation> <translation id="3537881477201137177">Tai galėsite pakeisti vėliau „Nustatymų“ skiltyje</translation> <translation id="3538066758857505094">Pašalinant „Linux“ įvyko klaida. Bandykite dar kartą.</translation> <translation id="354060433403403521">Kintamosios srovės adapteris</translation> @@ -3069,6 +3076,7 @@ <translation id="383669374481694771">Tai yra bendra informacija apie šį įrenginį ir jo naudojimą (pvz., akumuliatoriaus įkrovos lygį, sistemos ir programų veiklą bei klaidas). Duomenys bus naudojami siekiant patobulinti „Android“, o tam tikra sukaupta informacija taip pat padės „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams, pagerinti savo programas ir produktus.</translation> <translation id="3838085852053358637">Nepavyko įkelti plėtinio</translation> <translation id="3838486795898716504">Daugiau <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Pridėkite išsaugotų slaptažodžių prie „Google“ slaptažodžių tvarkyklės</translation> <translation id="383891835335927981">Nėra svetainių, kurių turinys priartintas arba atitolintas</translation> <translation id="3839509547554145593">Įgalinti slinkimo pele paspartinimą</translation> <translation id="3839516600093027468">Niekada neleisti <ph name="HOST" /> peržiūrėti iškarpinės</translation> @@ -3881,6 +3889,7 @@ <translation id="4617019240346358451">Puslapio įkėlimas iš naujo norint naudoti „<ph name="EXTENSION_NAME" />“</translation> <translation id="4617270414136722281">Plėtinių parinktys</translation> <translation id="4617880081511131945">Nepavyko užmegzti ryšio</translation> +<translation id="4618195822946934889">URL gali sudaryti tik ASCII simboliai</translation> <translation id="4619564267100705184">Patvirtinti tapatybę</translation> <translation id="4619615317237390068">Skirtukai iš kitų įrenginių</translation> <translation id="4620809267248568679">Šį nustatymą paleidžia plėtinys.</translation> @@ -4142,6 +4151,7 @@ <translation id="4871568871368204250">Sinchronizavimo išjungimas</translation> <translation id="4871719318659334896">Uždaryti grupę</translation> <translation id="4872192066608821120">Jei norite importuoti slaptažodžius, pasirinkite CSV failą</translation> +<translation id="4872212987539553601">Šifruotės įrenginyje nustatymas</translation> <translation id="4873312501243535625">Medijos failų tikrinimo priemonė</translation> <translation id="4876273079589074638">Padėkite mūsų inžinieriams ištirti ir ištaisyti šią strigtį. Nurodykite tikslius veiksmus, jei galite. Nėra nesvarbios informacijos!</translation> <translation id="4876895919560854374">Užrakinti ir atrakinti ekraną</translation> @@ -5081,6 +5091,7 @@ <translation id="5800351251499368110">Uždarykite paiešką šoniniame skydelyje. Paieška atidaryta šoniniame skydelyje.</translation> <translation id="5801568494490449797">Nuostatos</translation> <translation id="5804241973901381774">Leidimai</translation> +<translation id="5805268472388605531">Paspauskite ir palaikykite klaviatūros klavišus, kad pamatytumėte kirčio ženklus ir specialiuosius ženklus</translation> <translation id="5805697420284793859">Langų tvarkytuvė</translation> <translation id="5806447147478173900">Iš viso pateiktų svetainių naudojamos vietos saugykloje: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (numatytasis)</translation> @@ -5722,6 +5733,7 @@ <translation id="642469772702851743">Šį įrenginį (serijos Nr. <ph name="SERIAL_NUMBER" />) užrakino savininkas.</translation> <translation id="6425556984042222041">Teksto į kalbą sparta</translation> <translation id="642729974267661262">Neleidžiama leisti garso</translation> +<translation id="6427608534767366138">Būtinas „<ph name="NETWORK_ID" />“ tarpinio serverio autentifikavimas</translation> <translation id="6429384232893414837">Atnaujinimo klaida</translation> <translation id="6430814529589430811">„Base64“ užkoduotas ASCII, vienas sertifikatas</translation> <translation id="6431347207794742960">„<ph name="PRODUCT_NAME" />“ nustatys automatinius naujinius visiems šio kompiuterio naudotojams.</translation> @@ -6446,6 +6458,7 @@ <translation id="7093220653036489319">Spartieji atsakymai</translation> <translation id="7093416310351037609">Duomenų saugumo ir saugos sumetimais jūsų organizacija reikalauja visus tinkamus atsisiuntimus saugoti organizacijos „<ph name="WEB_DRIVE" />“ paskyroje.</translation> <translation id="7093866338626856921">Keistis duomenimis su įrenginiais, kurių pavadinimai: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Priimkite perdavimo užklausą įrenginyje „<ph name="DEVICE_NAME" />“.</translation> <translation id="7098389117866926363">USB-C įrenginys (prievadas kairėje, užpakalinėje dalyje)</translation> <translation id="7098447629416471489">Kiti išsaugoti paieškos varikliai bus rodomi čia</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Pašalinti programą}one{Pašalinti programas}few{Pašalinti programas}many{Pašalinti programas}other{Pašalinti programas}}</translation> @@ -6546,6 +6559,7 @@ <translation id="7212097698621322584">Įveskite dabartinį PIN kodą, jei norite jį pakeisti. Jei dabartinio PIN kodo nežinote, turėsite nustatyti saugos raktą iš naujo ir sukurti naują PIN kodą.</translation> <translation id="7213903639823314449">Adreso juostoje naudojamas paieškos variklis</translation> <translation id="721490496276866468">Slaptažodžių importavimas</translation> +<translation id="7218514093816577632">Įsitikinkite, kad pranešimai įjungti įrenginyje „<ph name="DEVICE_NAME" />“.</translation> <translation id="7219473482981809164">Radome kelis profilius, kuriuos galima atsisiųsti. Prieš tęsdami pasirinkite tuos, kuriuos norite atsisiųsti.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Nėra nesudėtingų slaptažodžių}=1{1 nesudėtingas slaptažodis}one{{NUM_WEAK} nesudėtingas slaptažodis}few{{NUM_WEAK} nesudėtingi slaptažodžiai}many{{NUM_WEAK} nesudėtingo slaptažodžio}other{{NUM_WEAK} nesudėtingų slaptažodžių}}</translation> <translation id="7220019174139618249">Nepavyksta eksportuoti slaptažodžių į aplanką „<ph name="FOLDER" />“</translation> @@ -7015,6 +7029,7 @@ <translation id="7664620655576155379">Nepalaikomas „Bluetooth“ įrenginys: „<ph name="DEVICE_NAME" />“.</translation> <translation id="7665082356120621510">Rezervuoti tam tikro dydžio vietą</translation> <translation id="7665369617277396874">Pridėti paskyrą</translation> +<translation id="766635563210446220">Nepavyko importuoti slaptažodžių. Patikrinkite failą <ph name="FILENAME" /> ir įsitikinkite, kad jis tinkamai suformatuotas. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Grąžinkite „<ph name="DEVICE_TYPE" />“ įrenginį per {NUM_WEEKS} savaitę}one{Grąžinkite „<ph name="DEVICE_TYPE" />“ įrenginį per {NUM_WEEKS} savaitę}few{Grąžinkite „<ph name="DEVICE_TYPE" />“ įrenginį per {NUM_WEEKS} savaites}many{Grąžinkite „<ph name="DEVICE_TYPE" />“ įrenginį per {NUM_WEEKS} savaitės}other{Grąžinkite „<ph name="DEVICE_TYPE" />“ įrenginį per {NUM_WEEKS} savaičių}}</translation> <translation id="7668423670802040666">„Google“ slaptažodžių tvarkytuvė, naudotojas <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Pasitelkus pritaikomumo funkcijas lengviau naudoti įrenginį. Jei norite pasiekti sparčiuosius nustatymus, ekrano apačioje pasirinkite laiką.</translation> @@ -7547,6 +7562,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{vaizdo įrašą}one{# vaizdo įrašą}few{# vaizdo įrašus}many{# vaizdo įrašo}other{# vaizdo įrašų}}</translation> <translation id="8143442547342702591">Netinkama programa</translation> <translation id="8143609395536282994">Kaip galite tvarkyti savo duomenis</translation> +<translation id="8145170459658034418">Atminties taupymo priemonė</translation> <translation id="8146177459103116374">Jei jau esate užsiregistravę šiame įrenginyje, galite <ph name="LINK2_START" />prisijungti kaip esamas naudotojas<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Pridėkite ir išdėstykite pageidaujamas kalbas pirmumo tvarka. Kai bus įmanoma, svetainės bus rodomos pageidaujamomis kalbomis. Šios nuostatos sinchronizuojamos su naršyklės nustatymais. <ph name="BEGIN_LINK_LEARN_MORE" />Sužinokite daugiau<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Nepavyko prisijungti. Susisiekite su administratoriumi arba bandykite dar kartą.</translation> @@ -7606,6 +7622,7 @@ <translation id="8198456017687137612">Perduodamas skirtukas</translation> <translation id="8199300056570174101">Tinklo (paslaugos) ir įrenginio nuosavybės</translation> <translation id="8200772114523450471">Atnaujinti</translation> +<translation id="8200789660596905522">Įsitikinkite, kad priėmėte perdavimo užklausą įrenginyje „<ph name="DEVICE_NAME" />“.</translation> <translation id="8202160505685531999">Iš naujo įveskite slaptažodį, kad galėtumėte atnaujinti „<ph name="DEVICE_TYPE" />“ profilį.</translation> <translation id="8203152941016626022">Bendrinimo netoliese įrenginio pavadinimas</translation> <translation id="8203732864715032075">Siunčia pranešimus ir pagal numatytuosius nustatymus prisimena šį kompiuterį programoje „Messages“. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> @@ -7857,6 +7874,7 @@ <translation id="844063558976952706">Visada šioje svetainėje</translation> <translation id="8441313165929432954">Įrenginio kaip modemo naudojimo įgalinimas ir (arba) išjungimas</translation> <translation id="8443795068008423036">Įsitikinkite, kad įrenginys atnaujintas, ir bandykite dar kartą</translation> +<translation id="8443986842926457191">URL sudaro daugiau nei 2 048 simboliai</translation> <translation id="8446884382197647889">Sužinokite daugiau</translation> <translation id="8447409163267621480">Naudokite „Ctrl“ arba „Alt“</translation> <translation id="844850004779619592">Komandų nerasta</translation> @@ -7922,6 +7940,7 @@ <translation id="851263357009351303">Visada leisti <ph name="HOST" /> rodyti vaizdus</translation> <translation id="8513108775083588393">Auto. pasukti</translation> <translation id="8514746246728959655">Pabandykite naudoti kitą saugos raktą</translation> +<translation id="8519895319663397036">Nepavyko importuoti slaptažodžių. Failas turi būti mažesnis nei 150 KB.</translation> <translation id="8523493869875972733">Palikti pakeitimus</translation> <translation id="8523849605371521713">Pridėta pagal politiką</translation> <translation id="8524783101666974011">Kortelių išsaugojimas „Google“ paskyroje</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 167e1bcc..8ab8598 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -693,6 +693,7 @@ <translation id="1640283014264083726">RSA шифрлэлттэй PKCS # 1 MD4</translation> <translation id="1641113438599504367">Аюулгүй хайлт</translation> <translation id="1641496881756082050"><ph name="NETWORK_NAME" />-н бусад үйлдэл</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Өөр 1 нууц үгний формат буруу байсан тул үүнийг импорт хийгээгүй}other{Өөр {NUM_PASSWORDS} нууц үгний формат буруу байсан тул үүнийг импорт хийгээгүй}}</translation> <translation id="1642492862748815878"><ph name="DEVICE" /> болон бусад <ph name="NUMBER_OF_DEVICES" /> Bluetooth төхөөрөмжтэй холбогдсон</translation> <translation id="1642494467033190216">Бусад алдаа засах тохируулгыг идэвхжүүлэхээс өмнө үндсэн хамгаалалт болон дахин ачаалах үйлдлийг зогсоож арилгах шаардлагатай.</translation> <translation id="1643072738649235303">X9.62 ECDSA SHA-1-тэй гарын үсэг</translation> @@ -1843,6 +1844,7 @@ <translation id="2673135533890720193">Хайлтын хадгалагдсан мэдээллийг уншина</translation> <translation id="2674764818721168631">Унтраалттай</translation> <translation id="2678063897982469759">Дахин идэвхжүүл</translation> +<translation id="2678100101831051676">Дамжуулах боломжгүй.</translation> <translation id="268053382412112343">Түүх</translation> <translation id="2681124317993121768">Зочны профайлуудыг дэмждэггүй</translation> <translation id="2682498795777673382">Таны эцэг эхийн хийсэн шинэчлэлт</translation> @@ -3879,6 +3881,7 @@ <translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />"-г ашиглахын тулд хуудсыг дахин ачаална уу</translation> <translation id="4617270414136722281">Өргөтгөлийн сонголт</translation> <translation id="4617880081511131945">Холболт тогтоож чадсангүй</translation> +<translation id="4618195822946934889">URL зөвхөн ASCII тэмдэгтүүд агуулах боломжтой</translation> <translation id="4619564267100705184">Өөрийгөө мөн болохыг бататгах</translation> <translation id="4619615317237390068">Бусад төхөөрөмжний таб</translation> <translation id="4620809267248568679">Энэ тохиргоог өргөтгөлөөр идэвхжүүлсэн байна.</translation> @@ -5080,6 +5083,7 @@ <translation id="5800351251499368110">Хажуугийн самбарт хайлтыг хаана уу. Хажуугийн самбарт хайлт нээлттэй байна.</translation> <translation id="5801568494490449797">Миний сонголт</translation> <translation id="5804241973901381774">Зөвшөөрлүүд</translation> +<translation id="5805268472388605531">Өргөлтийн тэмдгүүд болон тусгай тэмдэгтүүдийг харахын тулд гарын товч дээр удаана дарна уу</translation> <translation id="5805697420284793859">Цонхны менежер</translation> <translation id="5806447147478173900">Үзүүлсэн сайтуудын хадгалах сангийн ашиглалтын нийт хэмжээ: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (өгөгдмөл)</translation> @@ -5720,6 +5724,7 @@ <translation id="642469772702851743">Энэ төхөөрөмжийг (SN: <ph name="SERIAL_NUMBER" />) эзэмшигч нь түгжсэн байна.</translation> <translation id="6425556984042222041">Бичвэрийг-ярианд-хувиргах хурд</translation> <translation id="642729974267661262">Дуу тоглуулахыг зөвшөөрөөгүй</translation> +<translation id="6427608534767366138">"<ph name="NETWORK_ID" />"-д проксигийн баталгаажуулалт шаардлагатай</translation> <translation id="6429384232893414837">Шинэчлэлтийн алдаа</translation> <translation id="6430814529589430811">Base64-шифрлэлттэй ASCII, дан гэрчилгээ</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> нь компьютерийн бүх хэрэглэгчдэд зориулан автомат шинэчлэлтийг суулгаж өгнө.</translation> @@ -7851,6 +7856,7 @@ <translation id="844063558976952706">Үргэлж энэ сайт дээр</translation> <translation id="8441313165929432954">Модем болгох явцыг идэвхжүүлэх/идэвхгүй болгох</translation> <translation id="8443795068008423036">Таны төхөөрөмж хамгийн шинэ эсэхийг шалгаад, дахин оролдоно уу</translation> +<translation id="8443986842926457191">URL нь 2048-аас дээш тэмдэгттэй байна</translation> <translation id="8446884382197647889">Дэлгэрэнгүй мэдээлэл</translation> <translation id="8447409163267621480">Ctrl эсвэл Alt-н аль нэгийг агуулдаг</translation> <translation id="844850004779619592">Тушаал олдсонгүй</translation> @@ -7916,6 +7922,7 @@ <translation id="851263357009351303"><ph name="HOST" />-д зургуудыг харуулахыг үргэлж зөвшөөр</translation> <translation id="8513108775083588393">Автомат эргэх</translation> <translation id="8514746246728959655">Аюулгүй байдлын өөр түлхүүр туршиж үзнэ үү</translation> +<translation id="8519895319663397036">Нууц үгнүүдийг импорт хийх боломжгүй. Файлын хэмжээ 150 КБ-аас бага байх ёстой.</translation> <translation id="8523493869875972733">Өөрчлөлтийг хадгалах</translation> <translation id="8523849605371521713">Удирдамжийн дагуу нэмсэн</translation> <translation id="8524783101666974011">Google Бүртгэлдээ карт хадгалах</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 94398af..ffd4ad94 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">ခေတ္တနားချိန် ရောက်တော့မည်</translation> <translation id="1062628064301375934">ပုဂ္ဂိုလ်ရေးသီးသန့်ပိုဆန်သည့် ဝဘ်တစ်ခု တည်ဆောက်ရန် ကူညီပါ</translation> <translation id="1067048845568873861">ပြုလုပ်ပြီးပါပြီ</translation> +<translation id="1067661089446014701">လုံခြုံရေးပိုမိုကောင်းမွန်စေရန် သင့်စကားဝှက်များကို Google Account တွင် မသိမ်းမီ သင့်စက်၌ အသွင်ဝှက်နိုင်သည်</translation> <translation id="1067922213147265141">အခြား Google ဝန်ဆောင်မှုများ</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> ဟု အမည်ပေးထားသော eSIM ပရိုဖိုင်ကို ဖယ်ရှားရန်</translation> <translation id="1070377999570795893">သင့်ကွန်ပျူတာသို့ Chrome အလုပ်လုပ်ပုံပြောင်းလဲစေမည့် ပရိုဂရမ်အဆက်တစ်ခုကို အခြားပရိုဂရမ်တစ်ခုမှ ပေါင်းတည့်ခဲ့ပါသည်။ @@ -251,6 +252,7 @@ <translation id="1223853788495130632">ဤဆက်တင်အတွက် သင့်ကြီးကြပ်သူသည် တိကျသည့် တန်ဖိုးအကြံပြုထားသည်။</translation> <translation id="1225177025209879837">တောင်းဆိုချက်ကို စီမံဆောင်ရွက်နေ...</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />"သို့ ချိတ်ဆက်နေစဉ် အထောက်အထား စိစစ်မှု လုပ်မရခဲ့ပါ။</translation> +<translation id="1227993798763400520">ကာစ်လုပ်ခြင်း မအောင်မြင်ပါ။ ထပ်စမ်းကြည့်ပါ။</translation> <translation id="1230417814058465809">ပုံမှန်ကာကွယ်မှုကို ဖွင့်ထားသည်။ ထပ်ဆောင်းလုံခြုံရေးအတွက် အဆင့်မြင့်ကာကွယ်မှုကိုသုံးပါ။</translation> <translation id="1231733316453485619">စင့်ခ်လုပ်ခြင်းကို ဖွင့်မလား။</translation> <translation id="1232569758102978740">ခေါင်းစဉ်မဲ့</translation> @@ -1123,6 +1125,7 @@ <translation id="2031914984822377766">ဦးစားပေး <ph name="LINK_BEGIN" />ဝဘ်ဆိုက် ဘာသာစကားများ<ph name="LINK_END" /> ထည့်ပါ။ ဘာသာပြန်ဆိုချက်များအတွက် စာရင်းထဲမှ ထိပ်ဆုံးဘာသာစကားကို သုံးမည်။</translation> <translation id="2033758234986231162">သင့်ဖုန်းနှင့် ချိတ်ဆက်ထား၍မရပါ။ သင့်ဖုန်းသည် အနီးတွင်ရှိပြီး လော့ခ်ဖွင့်ထားကာ ဘလူးတုသ်နှင့် Wi-Fi ဖွင့်ထားကြောင်း သေချာပါစေ။</translation> <translation id="2034346955588403444">အခြား WiFi ကွန်ရက်များကို ထည့်ပါ</translation> +<translation id="2035211704574173780">အဖြူအမည်း</translation> <translation id="203574396658008164">လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် မှတ်စုရေးခြင်းအက်ပ်ကို ဖွင့်ထားရန်</translation> <translation id="2037445849770872822">ဤ Google အကောင့်အတွက် ကြီးကြပ်မှု ထည့်သွင်းထားသည်။ နောက်ထပ် မိဘ အထိန်းအချုပ်များ ထည့်သွင်းရန် 'ရှေ့ဆက်ရန်' ကိုရွေးပါ။ @@ -2553,6 +2556,7 @@ <translation id="3363202073972776113">ဤပရိုဖိုင်အသစ်ကို သင့်အဖွဲ့အစည်းက စီမံခန့်ခွဲမည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="3364986687961713424">သင်၏ စီမံခန့်ခွဲသူထံမှ- <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl သို့မဟုတ် Alt သုံးရန်</translation> +<translation id="3368586359109138591">အခြားနေရာတွင်သုံးရန် မိတ္တူတစ်ခု ဒေါင်းလုဒ်လုပ်နိုင်သည်</translation> <translation id="3368922792935385530">ချိတ်ဆက်ထားပြီ</translation> <translation id="3369067987974711168">ဤပို့တ်အတွက် နောက်ထပ်လုပ်ဆောင်ချက်များ ပိုပြပါ</translation> <translation id="3369624026883419694">အိမ်ရှင်ကို ဖြေရှင်းနေ...</translation> @@ -2741,6 +2745,7 @@ <translation id="3532273508346491126">စီမံခန့်ခွဲမှု စင့်ခ်လုပ်ရန်</translation> <translation id="3532521178906420528">ကွန်ရက်ချိတ်ဆက်မှု စတင်နေသည် ...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - အသံပိတ်ရန်</translation> +<translation id="3536492240554502321">အရောင်အသွေး လှည့်ရန်</translation> <translation id="3537881477201137177">၎င်းကို 'ဆက်တင်များ' တွင် နောက်မှ မွမ်းမံနိုင်သည်</translation> <translation id="3538066758857505094">Linux ဖြုတ်ရာတွင် အမှားရှိနေသည်။ နောက်မှ ထပ်စမ်းကြည့်ပါ။</translation> <translation id="354060433403403521">AC အဒက်တာ</translation> @@ -3066,6 +3071,7 @@ <translation id="383669374481694771">ဤသည်မှာ ဤစက်၏ ယေဘုယျအချက်အလက်နှင့် ၎င်းကို မည်သို့အသုံးပြုကြောင်း အချက်အလက်များဖြစ်သည် (ဥပမာ ဘက်ထရီပမာဏ၊ စနစ်နှင့် အက်ပ်လုပ်ဆောင်ချက်နှင့် အမှားအယွင်းများ)။ ဤဒေတာများကို Android ပိုမိုကောင်းမွန်လာစေရန်အတွက် အသုံးပြုသွားမည်ဖြစ်ပြီး အချို့သော စုစည်းထားသည့်အချက်အလက်များသည်လည်း Android ဆော့ဖ်ဝဲအင်ဂျင်နီယာကဲ့သို့သော Google အက်ပ်နှင့် ပါတနာများအား ၎င်းတို့၏ အက်ပ်နှင့် ထုတ်ကုန်များ ပိုမိုကောင်းမွန်လာစေရန် အတွက်လည်း အထောက်အကူဖြစ်စေပါသည်။</translation> <translation id="3838085852053358637">နောက်ဆက်တွဲကို ဖွင့်ရာတွင် မအောင်မြင်ပါ</translation> <translation id="3838486795898716504">နောက်ထပ် <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">‘Google စကားဝှက်မန်နေဂျာ’ တွင် သိမ်းထားသည့် စကားဝှက်များကို ထည့်သည်</translation> <translation id="383891835335927981">မည်သည့်ဝဘ်ဆိုက်ကိုမျှ ဇူးမ် ချဲ့ခြင်း သို့မဟုတ် ချုံ့ခြင်း ပြုလုပ်မထားပါ</translation> <translation id="3839509547554145593">မောက်စ်လှိမ့်သည့် အရှိန်မြှင့်စနစ် ဖွင့်ရန်</translation> <translation id="3839516600093027468">ကလစ်ဘုတ်အား ကြည့်ရှုခွင့်ကို <ph name="HOST" /> အတွက် အမြဲပိတ်ရန်</translation> @@ -4139,6 +4145,7 @@ <translation id="4871568871368204250">စင့်ခ်လုပ်ခြင်းကို ပိတ်ရန်</translation> <translation id="4871719318659334896">အုပ်စုကို ပိတ်ရန်</translation> <translation id="4872192066608821120">စကားဝှက်များထည့်ရန် CSV ဖိုင် ရွေးပါ</translation> +<translation id="4872212987539553601">စက်ပေါ်တွင်အသွင်ဝှက်ခြင်းကို စနစ်ထည့်သွင်းခြင်း</translation> <translation id="4873312501243535625">Media File Checker</translation> <translation id="4876273079589074638">ဤ ရပ်တန့်သွားခြင်းကို အင်ဂျင်နီယာများက စစ်ဆေးဖော်ထုတ်ပြီး ပြင်ဆင်နိုင်ရန် ကူညီပါ။ တတ်နိုင်ပါက အဆင့်များကို အတိအကျစာရင်းလုပ်ပေးပါ။ အသေးစိတ်ရရှိနိုင်လေ ပိုကောင်းလေဖြစ်ပါသည်။</translation> <translation id="4876895919560854374">မျက်နှာပြင်အား သော့ခတ်ခြင်းနှင့် ပိတ်ခြင်း</translation> @@ -6436,6 +6443,7 @@ <translation id="7093220653036489319">အမြန်အဖြေများ</translation> <translation id="7093416310351037609">ဒေတာဘေးကင်းမှုနှင့် လုံခြုံမှုအတွက် သင့်အဖွဲ့အစည်းသည် ၎င်း၏ <ph name="WEB_DRIVE" /> အကောင့်တွင် သိမ်းရန် အကျုံးဝင်သောဒေါင်းလုဒ်အားလုံး လိုအပ်သည်။</translation> <translation id="7093866338626856921">ဖော်ပြပါ အမည်ရှိ စက်ကိရိယာများနှင့် ဒေတာများ အလဲအလှယ်ပြုရန်- <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">သင့် <ph name="DEVICE_NAME" /> တွင် ‘ကာစ်လုပ်ရန်’ တောင်းဆိုချက်ကို လက်ခံပါ။</translation> <translation id="7098389117866926363">USB-C ကိရိယာ (ကျောဘက် ဘယ် ပို့တ်)</translation> <translation id="7098447629416471489">သိမ်းဆည်းထားသော အခြားရှာဖွေရေးအင်ဂျင်များကို ဤနေရာတွင် တွေ့ရပါမည်</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{အက်ပ်ကို ဖယ်ရှားရန်}other{အက်ပ်များကို ဖယ်ရှားရန်}}</translation> @@ -6536,6 +6544,7 @@ <translation id="7212097698621322584">သင်၏ လက်ရှိပင်နံပါတ် ပြောင်းရန် ၎င်းကိုထည့်ပါ။ သင်၏ ပင်နံပါတ်ကို မသိလျှင် သင့်လုံခြုံရေးကီးကို ပြင်ဆင်သတ်မှတ်ပြီး ပင်နံပါတ်အသစ် ပြုလုပ်ပါ။</translation> <translation id="7213903639823314449">လိပ်စာဘားတွင် အသုံးပြုသည့် ရှာဖွေရေးအင်ဂျင်</translation> <translation id="721490496276866468">စကားဝှက်များ ထည့်သွင်းပါ</translation> +<translation id="7218514093816577632">သင့် <ph name="DEVICE_NAME" /> တွင် အကြောင်းကြားချက်များ ဖွင့်ထားကြောင်း သေချာပါစေ။</translation> <translation id="7219473482981809164">ဒေါင်းလုဒ်လုပ်နိုင်သော ပရိုဖိုင်အများအပြားကို တွေ့သည်။ ရှေ့မဆက်မီ သင်ဒေါင်းလုဒ်လုပ်လိုသည်များကို ရွေးပါ။</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{လုံခြုံမှုလျော့နည်းသည့် စကားဝှက် မရှိပါ}=1{လုံခြုံမှုလျော့နည်းသည့် စကားဝှက် 1 ခု}other{လုံခြုံမှုလျော့နည်းသည့် စကားဝှက် {NUM_WEAK} ခု}}</translation> <translation id="7220019174139618249">"<ph name="FOLDER" />" သို့ စကားဝှက်ကို မတင်ပို့နိုင်ပါ</translation> @@ -7005,6 +7014,7 @@ <translation id="7664620655576155379">မထောက်ပံ့သည့် ဘလူးတုရှ် စက်ပစ္စည်း: "<ph name="DEVICE_NAME" />"။</translation> <translation id="7665082356120621510">ဖယ်ထားရန်</translation> <translation id="7665369617277396874">အကောင့် ထည့်ရန်</translation> +<translation id="766635563210446220">စကားဝှက်များ ထည့်သွင်း၍မရပါ။ <ph name="FILENAME" /> ကို စစ်ဆေးပြီး မှန်ကန်စွာဖော်မက်လုပ်ထားကြောင်း သေချာပါစေ။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> ကို {NUM_WEEKS} ပတ်အတွင်း ပြန်ပို့ပါ}other{<ph name="DEVICE_TYPE" /> ကို {NUM_WEEKS} ပတ်အတွင်း ပြန်ပို့ပါ}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" /> အတွက် ‘Google စကားဝှက်မန်နေဂျာ’ တွင်</translation> <translation id="7668648754769651616">အများသုံးနိုင်သည့် ဝန်ဆောင်မှုများက သင့်စက်ကို ပိုမိုလွယ်ကူစွာ သုံးနိုင်စေသည်။ ‘အမြန် ဆက်တင်များ’ သုံးရန် ဖန်သားပြင်အောက်ခြေရှိ အချိန်ကို ရွေးပါ။</translation> @@ -7536,6 +7546,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{ဗီဒီယိုတစ်ကား}other{ဗီဒီယို # ကား}}</translation> <translation id="8143442547342702591">မမှန်ကန်သည့် အပလီကေးရှင်း</translation> <translation id="8143609395536282994">သင့်ဒေတာကို စီမံနိုင်ပုံ-</translation> +<translation id="8145170459658034418">မှတ်ဉာဏ် သက်သာသည့်စနစ်</translation> <translation id="8146177459103116374">သင်သည် ဒီကိရိယာမှာ မှတ်ပုံတင်ပြီး ဖြစ်လျှင်၊ သင်သည် <ph name="LINK2_START" />ရှိနေဆဲ အသုံးပြုသူ အဖြစ် လက်မှတ်ထိုး ဝင်နိုင်သည်<ph name="LINK2_END" />။</translation> <translation id="8146287226035613638">သင့်ဦးစားပေး ဘာသာစကားများကို ထည့်ပြီး အဆင့်သတ်မှတ်ပါ။ ပြနိုင်သည့်အခါတွင် ဝဘ်ဆိုက်များက သင့်ဦးစားပေး ဘာသာစကားများဖြင့် ပြသပါမည်။ ဤသတ်မှတ်ချက်များကို သင့်ဘရောင်ဇာဆက်တင်များနှင့် စင့်ခ်လုပ်ထားသည်။ <ph name="BEGIN_LINK_LEARN_MORE" />ပိုမိုလေ့လာရန်<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">လက်မှတ်ထိုးဝင်ခြင်း မအောင်မြင်ပါ။ ထပ်လုပ်ကြည့်ရန် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။</translation> @@ -7595,6 +7606,7 @@ <translation id="8198456017687137612">တဘ်ကို ကာစ်လုပ်နေသည်</translation> <translation id="8199300056570174101">ကွန်ရက် (ဝန်ဆောင်မှု) နှင့် စက်ပစ္စည်း သတ်မှတ်ချက်များ</translation> <translation id="8200772114523450471">ပြန်ဆက်ရန်</translation> +<translation id="8200789660596905522">သင့် <ph name="DEVICE_NAME" /> တွင် ‘ကာစ်လုပ်ရန်’ တောင်းဆိုချက်ကို လက်ခံကြောင်း သေချာပါစေ။</translation> <translation id="8202160505685531999">သင့် <ph name="DEVICE_TYPE" /> ကိုယ်ရေးအကျဉ်းကို အသစ်မွမ်းမံရန် ကျေးဇူးပြု၍ သင့်စကားဝှက်ကို ပြန်လည်ရိုက်ထည့်ပါ။</translation> <translation id="8203152941016626022">'အနီးတစ်ဝိုက် မျှဝေခြင်း' ကိရိယာအမည်</translation> <translation id="8203732864715032075">သတိပေးချက်များကို သင့်ထံ ပို့ပြီး Messages အတွက် ဤကွန်ပျူတာကို ပုံသေမှတ်ထားပေးသည်။ <ph name="LINK_BEGIN" />ပိုမို လေ့လာရန်<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 4097bfa59..572bf9ffc 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Bijna tijd voor pauze</translation> <translation id="1062628064301375934">Help ons het web meer privé te maken</translation> <translation id="1067048845568873861">Gemaakt</translation> +<translation id="1067661089446014701">Voor extra beveiliging kun je wachtwoorden op je apparaat versleutelen voordat ze worden opgeslagen in je Google-account</translation> <translation id="1067922213147265141">Andere Google-services</translation> <translation id="1069355737714877171">E-simkaartprofiel <ph name="PROFILE_NAME" /> verwijderen</translation> <translation id="1070377999570795893">Een ander programma op je computer heeft een extensie toegevoegd die de manier kan wijzigen waarop Chrome werkt. @@ -249,6 +250,7 @@ <translation id="1223853788495130632">Je beheerder raadt een specifieke waarde aan voor deze instelling.</translation> <translation id="1225177025209879837">Je verzoek wordt verwerkt...</translation> <translation id="1227507814927581609">Verificatie mislukt tijdens verbinden met '<ph name="DEVICE_NAME" />'.</translation> +<translation id="1227993798763400520">Kan niet casten. Probeer het opnieuw.</translation> <translation id="1230417814058465809">Standaardbeveiliging staat aan. Gebruik geoptimaliseerde beveiliging voor nog meer bescherming.</translation> <translation id="1231733316453485619">Synchronisatie aanzetten?</translation> <translation id="1232569758102978740">Naamloos</translation> @@ -1113,6 +1115,7 @@ <translation id="2031914984822377766">Voeg de gewenste <ph name="LINK_BEGIN" />talen voor websites<ph name="LINK_END" /> toe. De bovenste taal in de lijst wordt gebruikt voor vertalingen.</translation> <translation id="2033758234986231162">Kan de verbinding met je telefoon niet in stand houden. Zorg dat je telefoon in de buurt en ontgrendeld is en dat bluetooth en wifi aanstaan.</translation> <translation id="2034346955588403444">Ander wifi-netwerk toevoegen</translation> +<translation id="2035211704574173780">Grijstinten</translation> <translation id="203574396658008164">Notities maken vanaf vergrendelscherm aanzetten</translation> <translation id="2037445849770872822">Toezicht is ingesteld voor dit Google-account. Selecteer Doorgaan om meer opties voor ouderlijk toezicht in te stellen. @@ -2540,6 +2543,7 @@ <translation id="3363202073972776113">Dit nieuwe profiel wordt beheerd door je organisatie. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Van je beheerder: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Gebruik Ctrl of Alt</translation> +<translation id="3368586359109138591">Een kopie downloaden om ergens anders te gebruiken</translation> <translation id="3368922792935385530">Verbonden</translation> <translation id="3369067987974711168">Meer acties voor deze poort bekijken</translation> <translation id="3369624026883419694">Host vaststellen</translation> @@ -2728,6 +2732,7 @@ <translation id="3532273508346491126">Synchronisatiebeheer</translation> <translation id="3532521178906420528">Verbinding met netwerk maken...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" />: audio uitgezet</translation> +<translation id="3536492240554502321">Rotatie van tinten</translation> <translation id="3537881477201137177">Dit kan later in Instellingen worden aangepast</translation> <translation id="3538066758857505094">Fout bij verwijderen van Linux. Probeer het opnieuw.</translation> <translation id="354060433403403521">Netspanningsadapter</translation> @@ -3053,6 +3058,7 @@ <translation id="383669374481694771">Dit is algemene informatie over dit apparaat en hoe je het gebruikt (zoals batterijniveau, systeem- en app-activiteit en fouten). De gegevens worden gebruikt om Android te verbeteren voor iedereen. Daarnaast helpen bepaalde verzamelde gegevens Google-apps en -partners, zoals Android-ontwikkelaars, bij de verbetering van hun apps en producten.</translation> <translation id="3838085852053358637">Kan extensie niet laden</translation> <translation id="3838486795898716504">Meer <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Opgeslagen wachtwoorden toevoegen aan Google Wachtwoordmanager</translation> <translation id="383891835335927981">Er zijn geen sites in- of uitgezoomd</translation> <translation id="3839509547554145593">Scrollversnelling voor muis aanzetten</translation> <translation id="3839516600093027468"><ph name="HOST" /> altijd blokkeren voor het klembord</translation> @@ -4124,6 +4130,7 @@ <translation id="4871568871368204250">Synchronisatie uitzetten</translation> <translation id="4871719318659334896">Groep sluiten</translation> <translation id="4872192066608821120">Als je wachtwoorden wilt importeren, selecteer je een csv-bestand.</translation> +<translation id="4872212987539553601">Versleuteling op het apparaat instellen</translation> <translation id="4873312501243535625">Media File Checker</translation> <translation id="4876273079589074638">Help onze engineers om deze crash te onderzoeken en op te lossen. Vermeld indien mogelijk je exacte stappen: elk detail is het vermelden waard.</translation> <translation id="4876895919560854374">Het scherm vergrendelen en ontgrendelen</translation> @@ -6418,6 +6425,7 @@ <translation id="7093220653036489319">Snelle antwoorden</translation> <translation id="7093416310351037609">Vanwege gegevensveiligheid en beveiliging vereist je organisatie dat alle in aanmerking komende downloads worden opgeslagen in het <ph name="WEB_DRIVE" />-account van je organisatie.</translation> <translation id="7093866338626856921">Gegevens uitwisselen met de apparaten met de naam: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Accepteer het castverzoek op je <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">USB-C-apparaat (poort links aan de achterkant)</translation> <translation id="7098447629416471489">Andere opgeslagen zoekmachines zie je hier</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{App verwijderen}other{Apps verwijderen}}</translation> @@ -6518,6 +6526,7 @@ <translation id="7212097698621322584">Voer je huidige pincode in om deze te wijzigen. Als je je pincode niet weet, moet je de beveiligingssleutel resetten en vervolgens een nieuwe pincode maken.</translation> <translation id="7213903639823314449">Zoekmachine gebruikt in adresbalk</translation> <translation id="721490496276866468">Wachtwoorden importeren</translation> +<translation id="7218514093816577632">Zorg dat meldingen aanstaan op je <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">We hebben meerdere beschikbare profielen gevonden om te downloaden. Selecteer de profielen die je wilt downloaden voordat je verdergaat.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Geen zwakke wachtwoorden}=1{1 zwak wachtwoord}other{{NUM_WEAK} zwakke wachtwoorden}}</translation> <translation id="7220019174139618249">Kan geen wachtwoorden exporteren naar '<ph name="FOLDER" />'</translation> @@ -6987,6 +6996,7 @@ <translation id="7664620655576155379">Niet-ondersteund Bluetooth-apparaat: '<ph name="DEVICE_NAME" />'.</translation> <translation id="7665082356120621510">Grootte reserveren</translation> <translation id="7665369617277396874">Account toevoegen</translation> +<translation id="766635563210446220">Kan wachtwoorden niet importeren. Check of <ph name="FILENAME" /> de juiste indeling heeft. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Stuur <ph name="DEVICE_TYPE" /> binnen {NUM_WEEKS} week terug}other{Stuur <ph name="DEVICE_TYPE" /> binnen {NUM_WEEKS} weken terug}}</translation> <translation id="7668423670802040666">In Google Wachtwoordmanager voor <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Met toegankelijkheidsfuncties wordt je apparaat gebruiksvriendelijker. Als je Snelle instellingen wilt openen, selecteer je de tijd onderaan het scherm.</translation> @@ -7516,6 +7526,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{een video}other{# video's}}</translation> <translation id="8143442547342702591">Ongeldige app</translation> <translation id="8143609395536282994">Hoe je je gegevens kunt beheren:</translation> +<translation id="8145170459658034418">Geheugenbesparing</translation> <translation id="8146177459103116374">Als je al bent geregistreerd op dit apparaat, kun je <ph name="LINK2_START" />inloggen als een bestaande gebruiker<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Voeg je voorkeurstalen toe en rangschik ze. Als het mogelijk is, krijg je websites in je voorkeurstalen te zien. Deze voorkeuren worden gesynchroniseerd met je browserinstellingen. <ph name="BEGIN_LINK_LEARN_MORE" />Meer informatie<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Inloggen mislukt. Neem contact op met je beheerder of probeer het opnieuw.</translation> @@ -7575,6 +7586,7 @@ <translation id="8198456017687137612">Tabblad casten</translation> <translation id="8199300056570174101">Eigenschappen van netwerk (service) en apparaat</translation> <translation id="8200772114523450471">Doorgaan</translation> +<translation id="8200789660596905522">Accepteer het castverzoek op je <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Geef je wachtwoord opnieuw op om je <ph name="DEVICE_TYPE" />-profiel te updaten.</translation> <translation id="8203152941016626022">Apparaatnaam voor Dichtbij delen</translation> <translation id="8203732864715032075">je meldingen te sturen en deze computer standaard te gebruiken voor Berichten. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index cb3b187..0854c351 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Wielkimi krokami nadchodzi przerwa</translation> <translation id="1062628064301375934">Pomóż nam zadbać o większą prywatność w sieci</translation> <translation id="1067048845568873861">Utworzono</translation> +<translation id="1067661089446014701">Zanim zapiszesz hasła na koncie Google, zaszyfruj je na urządzeniu, aby zwiększyć ich bezpieczeństwo</translation> <translation id="1067922213147265141">Inne usługi Google</translation> <translation id="1069355737714877171">Usuń profil eSIM o nazwie <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Inny program na Twoim komputerze dodał rozszerzenie, które może zmieniać sposób działania Chrome. @@ -251,6 +252,7 @@ <translation id="1223853788495130632">Administrator zaleca konkretną wartość dla tego ustawienia.</translation> <translation id="1225177025209879837">Przetwarzam żądanie...</translation> <translation id="1227507814927581609">Podczas łączenia się z urządzeniem „<ph name="DEVICE_NAME" />” nie powiodło się uwierzytelnianie.</translation> +<translation id="1227993798763400520">Nie udało się przesłać. Spróbuj ponownie.</translation> <translation id="1230417814058465809">Włączona jest standardowa ochrona. Jeśli zależy Ci na większym bezpieczeństwie, użyj wzmocnionej ochrony.</translation> <translation id="1231733316453485619">Włączyć synchronizację?</translation> <translation id="1232569758102978740">Bez tytułu</translation> @@ -694,6 +696,7 @@ <translation id="1640283014264083726">PKCS #1, MD4 z szyfrowaniem RSA</translation> <translation id="1641113438599504367">Bezpieczne przeglądanie</translation> <translation id="1641496881756082050">Więcej działań dotyczących: <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Nie udało się zaimportować 1 innego hasła, ponieważ jest ono nieprawidłowo sformatowane}few{Nie udało się zaimportować {NUM_PASSWORDS} innych haseł, ponieważ są one nieprawidłowo sformatowane}many{Nie udało się zaimportować {NUM_PASSWORDS} innych haseł, ponieważ są one nieprawidłowo sformatowane}other{Nie udało się zaimportować {NUM_PASSWORDS} innego hasła, ponieważ są one nieprawidłowo sformatowane}}</translation> <translation id="1642492862748815878">Połączono z urządzeniem <ph name="DEVICE" /> i <ph name="NUMBER_OF_DEVICES" /> innymi urządzeniami Bluetooth</translation> <translation id="1642494467033190216">Zanim włączysz inne funkcje debugowania, musisz wyłączyć zabezpieczenie rootfs i ponownie uruchomić urządzenie.</translation> <translation id="1643072738649235303">Podpis X9.62 ECDSA z SHA-1</translation> @@ -1110,6 +1113,7 @@ <translation id="2031914984822377766">Dodaj preferowane <ph name="LINK_BEGIN" />języki stron<ph name="LINK_END" />. Język znajdujący się na samej górze listy będzie wykorzystywany do tłumaczeń.</translation> <translation id="2033758234986231162">Nie można utrzymać połączenia z telefonem. Sprawdź, czy telefon jest wystarczająco blisko, jest odblokowany i ma włączone Bluetooth oraz Wi-Fi.</translation> <translation id="2034346955588403444">Dodaj inną sieć Wi-Fi</translation> +<translation id="2035211704574173780">Skala szarości</translation> <translation id="203574396658008164">Włącz robienie notatek na ekranie blokady</translation> <translation id="2037445849770872822">To konto Google ma ustawiony nadzór. Jeśli chcesz skonfigurować dodatkowe ustawienia kontroli rodzicielskiej, kliknij Dalej. @@ -1816,6 +1820,7 @@ <translation id="2673135533890720193">Odczytywanie historii przeglądania</translation> <translation id="2674764818721168631">Wyłączono</translation> <translation id="2678063897982469759">Włącz ponownie</translation> +<translation id="2678100101831051676">Nie udało się przesłać treści.</translation> <translation id="268053382412112343">Hi&storia</translation> <translation id="2681124317993121768">Profile gości nie są obsługiwane</translation> <translation id="2682498795777673382">Rodzic wprowadził zmianę</translation> @@ -2525,6 +2530,7 @@ <translation id="3363202073972776113">Tym nowym profilem będzie zarządzać Twoja organizacja. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Od administratora: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Użyj klawisza Ctrl lub Alt</translation> +<translation id="3368586359109138591">Pobierz kopię, aby używać jej w innym miejscu</translation> <translation id="3368922792935385530">Połączone</translation> <translation id="3369067987974711168">Pokaż więcej działań dla tego portu</translation> <translation id="3369624026883419694">Łączę z hostem...</translation> @@ -2713,6 +2719,7 @@ <translation id="3532273508346491126">Zarządzanie synchronizacją</translation> <translation id="3532521178906420528">Nawiązuję połączenie sieciowe…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – dźwięk wyciszony</translation> +<translation id="3536492240554502321">Rotacja odcieni</translation> <translation id="3537881477201137177">Można to później zmienić w Ustawieniach</translation> <translation id="3538066758857505094">Błąd podczas odinstalowywania Linuksa. Spróbuj ponownie.</translation> <translation id="354060433403403521">Zasilacz</translation> @@ -3038,6 +3045,7 @@ <translation id="383669374481694771">Są to ogólne informacje o tym urządzeniu i o jego używaniu (takie jak poziom naładowania baterii, aktywność w systemie i aplikacjach oraz błędy). Wykorzystamy je do ulepszania Androida. Niektóre informacje zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida, do tworzenia lepszych aplikacji i produktów.</translation> <translation id="3838085852053358637">Nie udało się wczytać rozszerzenia</translation> <translation id="3838486795898716504">Więcej o <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Dodawaj zapisane hasła do Menedżera haseł Google</translation> <translation id="383891835335927981">Żadna strona nie jest powiększana ani pomniejszana</translation> <translation id="3839509547554145593">Włącz szybkie przewijanie kółkiem myszy</translation> <translation id="3839516600093027468">Zawsze blokuj stronie <ph name="HOST" /> dostęp do schowka</translation> @@ -3849,6 +3857,7 @@ <translation id="4617019240346358451">Aby użyć rozszerzenia „<ph name="EXTENSION_NAME" />”, odśwież stronę</translation> <translation id="4617270414136722281">Opcje rozszerzeń</translation> <translation id="4617880081511131945">Nie można nawiązać połączenia</translation> +<translation id="4618195822946934889">URL może zawierać tylko znaki ASCII</translation> <translation id="4619564267100705184">Potwierdź, że to Ty</translation> <translation id="4619615317237390068">Karty z innych urządzeń</translation> <translation id="4620809267248568679">To ustawienie jest wymuszone przez rozszerzenie.</translation> @@ -4110,6 +4119,7 @@ <translation id="4871568871368204250">Wyłączanie synchronizacji</translation> <translation id="4871719318659334896">Zamknij grupę</translation> <translation id="4872192066608821120">Aby zaimportować hasła, wybierz plik CSV</translation> +<translation id="4872212987539553601">Skonfiguruj szyfrowanie na urządzeniu</translation> <translation id="4873312501243535625">Kontroler plików multimedialnych</translation> <translation id="4876273079589074638">Pomóż naszym inżynierom zbadać i naprawić tę awarię. Jeśli możesz, dokładnie opisz poszczególne czynności. Każdy szczegół jest ważny.</translation> <translation id="4876895919560854374">Blokowanie i odblokowywanie ekranu</translation> @@ -5047,6 +5057,7 @@ <translation id="5800351251499368110">Zamknij pasek narzędzi wyszukiwania w panelu bocznym. Pasek jest otwarty.</translation> <translation id="5801568494490449797">Ustawienia</translation> <translation id="5804241973901381774">Uprawnienia</translation> +<translation id="5805268472388605531">Naciśnij i przytrzymaj klawisze klawiatury, aby wyświetlić znaki akcentu i znaki specjalne</translation> <translation id="5805697420284793859">Menedżer okien</translation> <translation id="5806447147478173900">Łączna ilość miejsca wykorzystywanego przez wyświetlane witryny: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (domyślnie)</translation> @@ -5688,6 +5699,7 @@ <translation id="642469772702851743">To urządzenie (nr seryjny: <ph name="SERIAL_NUMBER" />) zostało zablokowane przez właściciela.</translation> <translation id="6425556984042222041">Szybkość zamiany tekstu na mowę</translation> <translation id="642729974267661262">Nie zezwolono na odtwarzanie dźwięku</translation> +<translation id="6427608534767366138">Uwierzytelnianie serwera proxy jest wymagane w przypadku „<ph name="NETWORK_ID" />”</translation> <translation id="6429384232893414837">Błąd aktualizacji</translation> <translation id="6430814529589430811">Plik ASCII z kodowaniem Base64, jeden certyfikat</translation> <translation id="6431347207794742960">Program <ph name="PRODUCT_NAME" /> skonfiguruje aktualizacje automatyczne dla wszystkich użytkowników tego komputera.</translation> @@ -6408,6 +6420,7 @@ <translation id="7093220653036489319">Szybkie podpowiedzi</translation> <translation id="7093416310351037609">Aby zapewnić bezpieczeństwo danych, Twoja organizacja wymaga, aby wszystkie kwalifikujące się pobrane pliki były zapisywane na jej koncie w usłudze <ph name="WEB_DRIVE" />.</translation> <translation id="7093866338626856921">Wymiana danych z urządzeniami o nazwach: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Zaakceptuj prośbę o przesłanie na Twoje urządzenie <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Urządzenie USB-C (lewy port z tyłu)</translation> <translation id="7098447629416471489">Tutaj pojawią się inne zapisane wyszukiwarki</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Usuń aplikację}few{Usuń aplikacje}many{Usuń aplikacje}other{Usuń aplikacje}}</translation> @@ -6508,6 +6521,7 @@ <translation id="7212097698621322584">Wpisz obecny kod PIN, by go zmienić. Jeśli go nie znasz, musisz zresetować klucz bezpieczeństwa, a potem utworzyć nowy kod PIN.</translation> <translation id="7213903639823314449">Wyszukiwarka używana w pasku adresu</translation> <translation id="721490496276866468">Importuj hasła</translation> +<translation id="7218514093816577632">Upewnij się, że na urządzeniu <ph name="DEVICE_NAME" /> są włączone powiadomienia.</translation> <translation id="7219473482981809164">Do pobrania dostępnych jest wiele profili. Zanim przejdziesz dalej, wybierz profile, które chcesz pobrać.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Brak słabych haseł}=1{1 słabe hasło}few{{NUM_WEAK} słabe hasła}many{{NUM_WEAK} słabych haseł}other{{NUM_WEAK} słabego hasła}}</translation> <translation id="7220019174139618249">Nie można wyeksportować haseł do folderu „<ph name="FOLDER" />”</translation> @@ -6977,6 +6991,7 @@ <translation id="7664620655576155379">Nieobsługiwane urządzenie Bluetooth: „<ph name="DEVICE_NAME" />”.</translation> <translation id="7665082356120621510">Zarezerwuj rozmiar</translation> <translation id="7665369617277396874">Dodaj konto</translation> +<translation id="766635563210446220">Nie udało się zaimportować haseł. Sprawdź, czy plik <ph name="FILENAME" /> jest poprawnie sformatowany. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Zwróć urządzenie <ph name="DEVICE_TYPE" /> w ciągu {NUM_WEEKS} tygodnia}few{Zwróć urządzenie <ph name="DEVICE_TYPE" /> w ciągu {NUM_WEEKS} tygodni}many{Zwróć urządzenie <ph name="DEVICE_TYPE" /> w ciągu {NUM_WEEKS} tygodni}other{Zwróć urządzenie <ph name="DEVICE_TYPE" /> w ciągu {NUM_WEEKS} tygodnia}}</translation> <translation id="7668423670802040666">W menedżerze haseł Google w przypadku konta <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Ułatwienia dostępu upraszczają korzystanie z urządzenia. Aby uzyskać dostęp do Szybkich ustawień, kliknij godzinę u dołu ekranu.</translation> @@ -7509,6 +7524,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{film}few{# filmy}many{# filmów}other{# filmu}}</translation> <translation id="8143442547342702591">Nieprawidłowa aplikacja</translation> <translation id="8143609395536282994">W jaki sposób możesz zarządzać swoimi danymi:</translation> +<translation id="8145170459658034418">Oszczędzanie pamięci</translation> <translation id="8146177459103116374">Jeśli zarejestrowałeś się już na tym urządzeniu, możesz <ph name="LINK2_START" />zalogować się jako istniejący użytkownik<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Dodaj preferowane języki i ustal ich kolejność. Gdy będzie to możliwe, strony internetowe będą się wyświetlać w wybranych językach. Te ustawienia są zsynchronizowane z ustawieniami przeglądarki. <ph name="BEGIN_LINK_LEARN_MORE" />Więcej informacji<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Nie udało się zalogować. Skontaktuj się z administratorem lub spróbuj ponownie.</translation> @@ -7568,6 +7584,7 @@ <translation id="8198456017687137612">Przesyłam kartę</translation> <translation id="8199300056570174101">Właściwości sieci (usługi) i urządzenia</translation> <translation id="8200772114523450471">Wznów</translation> +<translation id="8200789660596905522">Zaakceptuj prośbę o przesłanie na Twoje urządzenie <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Wpisz hasło ponownie, by zaktualizować swój profil na urządzeniu <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Udostępnianie w pobliżu nazwa urządzenia</translation> <translation id="8203732864715032075">Wysyła powiadomienia i sprawia, że ten komputer jest domyślnie używany do obsługi Wiadomości. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> @@ -7819,6 +7836,7 @@ <translation id="844063558976952706">Zawsze w tej witrynie</translation> <translation id="8441313165929432954">Włącz/wyłącz tethering</translation> <translation id="8443795068008423036">Sprawdź, czy urządzenie jest aktualne, i spróbuj ponownie</translation> +<translation id="8443986842926457191">URL zawiera więcej niż 2048 znaków</translation> <translation id="8446884382197647889">Więcej informacji</translation> <translation id="8447409163267621480">Uwzględnij Ctrl lub Alt</translation> <translation id="844850004779619592">Nie znaleziono poleceń</translation> @@ -7884,6 +7902,7 @@ <translation id="851263357009351303">Zawsze zezwalaj na pokazywanie grafik w witrynie <ph name="HOST" /></translation> <translation id="8513108775083588393">Autoobracanie</translation> <translation id="8514746246728959655">Użyj innego klucza bezpieczeństwa</translation> +<translation id="8519895319663397036">Nie udało się zaimportować haseł. Rozmiar pliku powinien być mniejszy niż 150 KB.</translation> <translation id="8523493869875972733">Zachowaj zmiany</translation> <translation id="8523849605371521713">Dodane przez zasady</translation> <translation id="8524783101666974011">Zapisz karty na koncie Google</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 11a919f..c4b9c176 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Se apropie timpul pentru o pauză</translation> <translation id="1062628064301375934">Ajută-ne să creăm un web mai privat</translation> <translation id="1067048845568873861">Creat</translation> +<translation id="1067661089446014701">Pentru siguranță suplimentară, criptează parolele pe dispozitiv înainte să se salveze în Contul Google</translation> <translation id="1067922213147265141">Alte servicii Google</translation> <translation id="1069355737714877171">Elimină profilul eSIM numit <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Un alt program de pe computerul tău a adăugat o extensie care poate schimba modul în care funcționează Chrome. @@ -250,6 +251,7 @@ <translation id="1223853788495130632">Administratorul dvs. recomandă o valoare specifică pentru această setare.</translation> <translation id="1225177025209879837">Se procesează solicitarea...</translation> <translation id="1227507814927581609">Autentificarea nu a reușit în timpul conectării la „<ph name="DEVICE_NAME" />”.</translation> +<translation id="1227993798763400520">Nu s-a putut proiecta. Încearcă din nou.</translation> <translation id="1230417814058465809">Protecția standard este activată. Pentru securitate sporită, folosește protecția îmbunătățită.</translation> <translation id="1231733316453485619">Activezi sincronizarea?</translation> <translation id="1232569758102978740">Fără titlu</translation> @@ -1114,6 +1116,7 @@ <translation id="2031914984822377766">Adaugă <ph name="LINK_BEGIN" />limbile preferate pentru site-uri<ph name="LINK_END" />. Prima limbă din listă va fi folosită pentru traduceri.</translation> <translation id="2033758234986231162">Nu se poate păstra conexiunea cu telefonul. Asigură-te că telefonul este în apropiere, deblocat, cu funcțiile Bluetooth și Wi-Fi activate.</translation> <translation id="2034346955588403444">Adaugă altă rețea Wi-Fi</translation> +<translation id="2035211704574173780">Tonuri de gri</translation> <translation id="203574396658008164">Activează scrierea de note din ecranul de blocare</translation> <translation id="2037445849770872822">S-a configurat supravegherea pentru acest Cont Google. Ca să configurezi în continuare controlul parental, selectează Continuă. @@ -2541,6 +2544,7 @@ <translation id="3363202073972776113">Acest profil nou va fi gestionat de organizația ta. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="3364986687961713424">De la administrator: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Folosește Ctrl sau Alt</translation> +<translation id="3368586359109138591">Descarcă o copie pentru a o folosi în altă parte</translation> <translation id="3368922792935385530">Conectat</translation> <translation id="3369067987974711168">Afișează mai multe acțiuni pentru port</translation> <translation id="3369624026883419694">Se rezolvă gazda...</translation> @@ -2729,6 +2733,7 @@ <translation id="3532273508346491126">Gestionarea sincronizării</translation> <translation id="3532521178906420528">Se stabilește conexiunea la rețea...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – sunetul a fost dezactivat</translation> +<translation id="3536492240554502321">Rotirea nuanțelor</translation> <translation id="3537881477201137177">Aceasta poate fi modificată mai târziu din Setări</translation> <translation id="3538066758857505094">A apărut o eroare la dezinstalarea Linux. Încearcă din nou.</translation> <translation id="354060433403403521">Adaptor c.a.</translation> @@ -3054,6 +3059,7 @@ <translation id="383669374481694771">Acestea sunt informații generale despre dispozitiv și despre modul în care îl folosești (de exemplu, nivelul bateriei, activitatea pe sistem și în aplicații și erorile). Datele vor fi folosite pentru îmbunătățirea Android și unele informații cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android, să își îmbunătățească aplicațiile și produsele.</translation> <translation id="3838085852053358637">Extensia nu s-a încărcat</translation> <translation id="3838486795898716504">Mai multe <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Adaugă parolele salvate în Managerul de parole Google</translation> <translation id="383891835335927981">Nu s-a mărit sau micșorat niciun site</translation> <translation id="3839509547554145593">Activează accelerarea derulării mouse-ului</translation> <translation id="3839516600093027468">Blochează întotdeauna accesul <ph name="HOST" /> la clipboard</translation> @@ -4127,6 +4133,7 @@ <translation id="4871568871368204250">Dezactivează sincronizarea</translation> <translation id="4871719318659334896">Închide grupul</translation> <translation id="4872192066608821120">Pentru a importa parole, selectează un fișier CSV</translation> +<translation id="4872212987539553601">Configurează criptarea pe dispozitiv</translation> <translation id="4873312501243535625">Verificator de fișiere media</translation> <translation id="4876273079589074638">Ajută-i pe inginerii noștri să investigheze și să remedieze această blocare. Dacă poți, indică pașii exacți. Orice detaliu este important!</translation> <translation id="4876895919560854374">Blochează și deblochează ecranul</translation> @@ -6428,6 +6435,7 @@ <translation id="7093220653036489319">Răspunsuri rapide</translation> <translation id="7093416310351037609">Pentru siguranța și securitatea datelor, organizația ta solicită ca toate descărcările eligibile să fie salvate în contul său <ph name="WEB_DRIVE" />.</translation> <translation id="7093866338626856921">Fă schimb de date cu dispozitivele numite: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Acceptă solicitarea de proiectare pe <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Dispozitiv USB-C (portul din stânga în spate)</translation> <translation id="7098447629416471489">Alte motoare de căutare salvate vor fi afișate aici</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Elimină aplicația}few{Elimină aplicații}other{Elimină aplicații}}</translation> @@ -6528,6 +6536,7 @@ <translation id="7212097698621322584">Introdu codul PIN actual pentru a-l schimba. Dacă nu știi codul PIN, trebuie să resetezi cheia de securitate, apoi să creezi un nou cod PIN.</translation> <translation id="7213903639823314449">Motorul de căutare folosit în bara de adrese</translation> <translation id="721490496276866468">Importă parole</translation> +<translation id="7218514093816577632">Asigură-te că notificările sunt activate pe <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Am detectat mai multe profiluri disponibile pentru descărcare. Selectează-le pe cele pe care vrei să le descarci înainte de a continua.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Nicio parolă slabă}=1{O parolă slabă}few{{NUM_WEAK} parole slabe}other{{NUM_WEAK} de parole slabe}}</translation> <translation id="7220019174139618249">Nu se pot exporta parole în „<ph name="FOLDER" />”</translation> @@ -6997,6 +7006,7 @@ <translation id="7664620655576155379">Dispozitiv Bluetooth neacceptat: „<ph name="DEVICE_NAME" />”.</translation> <translation id="7665082356120621510">Rezervă o dimensiune</translation> <translation id="7665369617277396874">Adaugă un cont</translation> +<translation id="766635563210446220">Nu se pot importa parolele. Verifică <ph name="FILENAME" /> și asigură-te că este formatat corect. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Returnează acest <ph name="DEVICE_TYPE" /> în cel mult {NUM_WEEKS} săptămână}few{Returnează acest <ph name="DEVICE_TYPE" /> în cel mult {NUM_WEEKS} săptămâni}other{Returnează acest <ph name="DEVICE_TYPE" /> în cel mult {NUM_WEEKS} de săptămâni}}</translation> <translation id="7668423670802040666">În Manager de parole Google pentru <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Funcțiile de accesibilitate fac dispozitivul mai ușor de folosit. Pentru a accesa Setările rapide, selectează ora din partea de jos a ecranului.</translation> @@ -7528,6 +7538,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{un videoclip}few{# videoclipuri}other{# de videoclipuri}}</translation> <translation id="8143442547342702591">Aplicație nevalidă</translation> <translation id="8143609395536282994">Cum îți poți gestiona datele:</translation> +<translation id="8145170459658034418">Economisirea memoriei</translation> <translation id="8146177459103116374">Dacă v-ați înregistrat deja pe acest dispozitiv, puteți să vă <ph name="LINK2_START" />conectați ca utilizator existent<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Adaugă și ordonează limbile preferate. Site-urile se vor afișa în limbile tale preferate, dacă este posibil. Aceste preferințe se sincronizează cu setările browserului. <ph name="BEGIN_LINK_LEARN_MORE" />Află mai multe<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Conectarea nu a reușit. Contactează administratorul sau încearcă din nou.</translation> @@ -7587,6 +7598,7 @@ <translation id="8198456017687137612">Se proiectează fila</translation> <translation id="8199300056570174101">Proprietăți pentru dispozitiv și rețea (serviciu)</translation> <translation id="8200772114523450471">Reia</translation> +<translation id="8200789660596905522">Asigură-te că accepți solicitarea de proiectare pe <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Reintrodu parola pentru a actualiza profilul <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">numele dispozitivului în Trimiterea în apropiere</translation> <translation id="8203732864715032075">Îți trimite notificări și are ca setare prestabilită reținerea acestui computer pentru Messages <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 8cec967..bcd0199 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Скоро перерыв</translation> <translation id="1062628064301375934">Помогите нам обеспечивать конфиденциальность в интернете</translation> <translation id="1067048845568873861">Создано</translation> +<translation id="1067661089446014701">Чтобы повысить безопасность, вы можете включить шифрование паролей на устройстве до их сохранения в вашем аккаунте Google.</translation> <translation id="1067922213147265141">Другие сервисы Google</translation> <translation id="1069355737714877171">Удалить профиль eSIM с именем "<ph name="PROFILE_NAME" />"</translation> <translation id="1070377999570795893">Одна из программ на вашем компьютере установила расширение, которое может влиять на работу Chrome. @@ -252,6 +253,7 @@ <translation id="1223853788495130632">Администратор рекомендует выбрать определенное значение для этого параметра.</translation> <translation id="1225177025209879837">Обработка запроса...</translation> <translation id="1227507814927581609">При подключении к "<ph name="DEVICE_NAME" />" произошла ошибка аутентификации.</translation> +<translation id="1227993798763400520">Не удалось начать трансляцию. Повторите попытку</translation> <translation id="1230417814058465809">Стандартная защита включена. Для большей безопасности используйте улучшенную защиту.</translation> <translation id="1231733316453485619">Включить синхронизацию?</translation> <translation id="1232569758102978740">Без имени</translation> @@ -1114,6 +1116,7 @@ <translation id="2031914984822377766">Добавьте <ph name="LINK_BEGIN" />языки для сайтов<ph name="LINK_END" />. Для перевода будет использоваться первый язык в списке.</translation> <translation id="2033758234986231162">Подключение к телефону прервано. Убедитесь, что он находится рядом, разблокирован и на нем включены функции Bluetooth и Wi-Fi.</translation> <translation id="2034346955588403444">Добавить сеть Wi-Fi</translation> +<translation id="2035211704574173780">Оттенки серого</translation> <translation id="203574396658008164">Делать заметки, когда экран заблокирован</translation> <translation id="2037445849770872822">Для этого аккаунта Google настроен родительский контроль. Чтобы изменить некоторые параметры, нажмите "Продолжить". @@ -2540,6 +2543,7 @@ <translation id="3363202073972776113">Новым профилем будет управлять ваша организация. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Сообщение от администратора: "<ph name="ADMIN_MESSAGE" />"</translation> <translation id="3365598184818502391">Необходимо использовать Ctrl или Alt</translation> +<translation id="3368586359109138591">Скачивайте копию сохраненных паролей для использования на других устройствах.</translation> <translation id="3368922792935385530">Подключено</translation> <translation id="3369067987974711168">Показать ещё действия для этого порта</translation> <translation id="3369624026883419694">Определение хоста...</translation> @@ -2728,6 +2732,7 @@ <translation id="3532273508346491126">Управление синхронизацией</translation> <translation id="3532521178906420528">Подключение к сети…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" />: звук отключен</translation> +<translation id="3536492240554502321">Смена оттенка</translation> <translation id="3537881477201137177">Этот параметр можно изменить позже в настройках.</translation> <translation id="3538066758857505094">Не удалось удалить Linux. Повторите попытку.</translation> <translation id="354060433403403521">Зарядное устройство</translation> @@ -3053,6 +3058,7 @@ <translation id="383669374481694771">Мы будем получать общие сведения о работе устройства, например об уровне заряда батареи, ошибках и действиях в системе и приложениях. Они помогут нам усовершенствовать Android, а наши партнеры смогут использовать некоторые агрегированные данные, чтобы улучшать свои приложения и другие продукты.</translation> <translation id="3838085852053358637">Ошибка загрузки</translation> <translation id="3838486795898716504">Другие страницы с заголовком <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Добавляйте сохраненные пароли в Google Менеджер паролей.</translation> <translation id="383891835335927981">Нет сайтов с измененным масштабом</translation> <translation id="3839509547554145593">Включить ускорение прокрутки мыши</translation> <translation id="3839516600093027468">Никогда не открывать сайту <ph name="HOST" /> доступ к буферу обмена</translation> @@ -4125,6 +4131,7 @@ <translation id="4871568871368204250">Отключение синхронизации</translation> <translation id="4871719318659334896">Закрыть группу</translation> <translation id="4872192066608821120">Чтобы импортировать пароли, выберите CSV-файл.</translation> +<translation id="4872212987539553601">Настройка шифрования на устройстве</translation> <translation id="4873312501243535625">Проверка медиафайлов</translation> <translation id="4876273079589074638">Опишите свои действия максимально подробно, чтобы наши специалисты смогли быстрее выяснить причину сбоя и устранить ее.</translation> <translation id="4876895919560854374">Блокировка и разблокировка экрана</translation> @@ -6428,6 +6435,7 @@ <translation id="7093220653036489319">Быстрые ответы</translation> <translation id="7093416310351037609">В целях безопасности и защиты данных ваша организация требует, чтобы все скачанные файлы сохранялись в аккаунте сервиса "<ph name="WEB_DRIVE" />".</translation> <translation id="7093866338626856921">Обмен данными с устройствами <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Примите запрос на трансляцию на устройстве <ph name="DEVICE_NAME" /></translation> <translation id="7098389117866926363">Устройство USB-C (порт слева на задней панели)</translation> <translation id="7098447629416471489">Здесь появятся другие сохраненные поисковые системы</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Удалить приложение}one{Удалить приложения}few{Удалить приложения}many{Удалить приложения}other{Удалить приложения}}</translation> @@ -6528,6 +6536,7 @@ <translation id="7212097698621322584">Сначала введите текущий PIN-код. Если вы его не знаете, сбросьте настройки электронного ключа и установите новый PIN-код.</translation> <translation id="7213903639823314449">Поисковая система, используемая в адресной строке.</translation> <translation id="721490496276866468">Импорт паролей</translation> +<translation id="7218514093816577632">Убедитесь, что уведомления на устройстве <ph name="DEVICE_NAME" /> включены</translation> <translation id="7219473482981809164">Доступно несколько профилей. Выберите, какие нужно скачать.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Нет простых паролей}=1{1 простой пароль}one{{NUM_WEAK} простой пароль}few{{NUM_WEAK} простых пароля}many{{NUM_WEAK} простых паролей}other{{NUM_WEAK} простого пароля}}</translation> <translation id="7220019174139618249">Не удалось экспортировать пароли в папку "<ph name="FOLDER" />"</translation> @@ -6997,6 +7006,7 @@ <translation id="7664620655576155379">Устройство Bluetooth "<ph name="DEVICE_NAME" />" не поддерживается.</translation> <translation id="7665082356120621510">Зарезервировать диск</translation> <translation id="7665369617277396874">Добавить аккаунт</translation> +<translation id="766635563210446220">Не удалось импортировать пароли. Убедитесь, что у файла <ph name="FILENAME" /> правильный формат. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Верните <ph name="DEVICE_TYPE" /> в течение {NUM_WEEKS} недели}one{Верните <ph name="DEVICE_TYPE" /> в течение {NUM_WEEKS} недели}few{Верните <ph name="DEVICE_TYPE" /> в течение {NUM_WEEKS} недель}many{Верните <ph name="DEVICE_TYPE" /> в течение {NUM_WEEKS} недель}other{Верните <ph name="DEVICE_TYPE" /> в течение {NUM_WEEKS} недели}}</translation> <translation id="7668423670802040666">В Диспетчере паролей Google для аккаунта <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Специальные возможности упрощают использование устройства. Чтобы открыть быстрые настройки, нажмите на время в нижней части экрана.</translation> @@ -7528,6 +7538,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{видео}one{# видео}few{# видео}many{# видео}other{# видео}}</translation> <translation id="8143442547342702591">Недействительное приложение</translation> <translation id="8143609395536282994">Как управлять своими данными</translation> +<translation id="8145170459658034418">Экономия памяти</translation> <translation id="8146177459103116374">Вы уже зарегистрированы на этом устройстве и можете <ph name="LINK2_START" />войти, используя свои регистрационные данные<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Добавьте и упорядочьте предпочтительные языки. Сайты будут по возможности показываться на них. Эти настройки синхронизированы с настройками браузера. <ph name="BEGIN_LINK_LEARN_MORE" />Подробнее…<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Не удалось выполнить вход. Обратитесь к системному администратору или повторите попытку.</translation> @@ -7587,6 +7598,7 @@ <translation id="8198456017687137612">Трансляция вкладки</translation> <translation id="8199300056570174101">Настройки сети и устройства</translation> <translation id="8200772114523450471">Возобновить</translation> +<translation id="8200789660596905522">Трансляция возможна только при принятии запроса на устройстве <ph name="DEVICE_NAME" /></translation> <translation id="8202160505685531999">Чтобы обновить профиль устройства <ph name="DEVICE_TYPE" />, введите пароль ещё раз</translation> <translation id="8203152941016626022">Обмен с окружением: название устройства</translation> <translation id="8203732864715032075">Показывать на этом компьютере уведомления о сообщениях, полученных на телефоне. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index f5003e28..3d5ade1 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Už je takmer čas na prestávku</translation> <translation id="1062628064301375934">Pomôžte nám vytvoriť súkromnejší internet</translation> <translation id="1067048845568873861">Vytvorené</translation> +<translation id="1067661089446014701">Heslá v zariadení môžete zašifrovať ešte pred ich uložením do účtu Google, čím zvýšite bezpečnosť</translation> <translation id="1067922213147265141">Ďalšie služby Googlu</translation> <translation id="1069355737714877171">Odstrániť profil eSIM karty s názvom <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Iný program v počítači pridal rozšírenie, ktoré môže zmeniť spôsob fungovania prehliadača Chrome. @@ -251,6 +252,7 @@ <translation id="1223853788495130632">Váš správca odporúča pre toto nastavenie konkrétnu hodnotu.</translation> <translation id="1225177025209879837">Prebieha spracovanie žiadosti...</translation> <translation id="1227507814927581609">Overenie totožnosti počas pripájania k zariadeniu <ph name="DEVICE_NAME" /> zlyhalo.</translation> +<translation id="1227993798763400520">Prenos zlyhal. Skúste to znova.</translation> <translation id="1230417814058465809">Je zapnutá štandardná ochrana. Lepšie zabezpečenie dosiahnete používaním rozšírenej ochrany.</translation> <translation id="1231733316453485619">Chcete zapnúť synchronizáciu?</translation> <translation id="1232569758102978740">Bez názvu</translation> @@ -1115,6 +1117,7 @@ <translation id="2031914984822377766">Pridajte preferované <ph name="LINK_BEGIN" />jazyky webu<ph name="LINK_END" />. Pri prekladoch sa použije prvý jazyk zoznamu.</translation> <translation id="2033758234986231162">Pripojenie s vaším telefónom sa nedá udržať. Uistite sa, že telefón máte nablízku, odomknutý a so zapnutým rozhraním Bluetooth a pripojením Wi‑Fi.</translation> <translation id="2034346955588403444">Pridať inú sieť Wi‑Fi</translation> +<translation id="2035211704574173780">Odtiene sivej</translation> <translation id="203574396658008164">Povoliť písanie poznámok na uzamknutej obrazovke</translation> <translation id="2037445849770872822">V tomto účte Google je nastavený dohľad. Ak chcete nastaviť ďalšiu rodičovskú kontrolu, vyberte Pokračovať. @@ -2542,6 +2545,7 @@ <translation id="3363202073972776113">Tento nový profil bude spravovať vaša organizácia. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Od správcu: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Použite Ctrl alebo Alt</translation> +<translation id="3368586359109138591">Stiahnite si kópiu a použite ju inde</translation> <translation id="3368922792935385530">Pripojené</translation> <translation id="3369067987974711168">Zobraziť ďalšie akcie pre tento port</translation> <translation id="3369624026883419694">Rozpoznávanie hostiteľa...</translation> @@ -2730,6 +2734,7 @@ <translation id="3532273508346491126">Synchronizovať správu</translation> <translation id="3532521178906420528">Nadväzuje sa pripojenie k sieti…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – Vypnuté zvuky</translation> +<translation id="3536492240554502321">Striedanie odtieňov</translation> <translation id="3537881477201137177">Môžete to neskôr upraviť v Nastaveniach</translation> <translation id="3538066758857505094">Pri odinštalovaní systému Linux sa vyskytla chyba. Skúste to znova.</translation> <translation id="354060433403403521">Sieťový napájací adaptér</translation> @@ -3055,6 +3060,7 @@ <translation id="383669374481694771">Toto sú všeobecné informácie o tomto zariadení a jeho používaní (napríklad stav batérie, aktivita v systéme a aplikáciách a chyby). Údaje sa použijú na zlepšenie Androidu a niektoré súhrnné informácie pomôžu tiež aplikáciám Google a partnerom (napríklad vývojárom pre Android) zlepšiť svoje aplikácie a produkty.</translation> <translation id="3838085852053358637">Načítanie rozšírenia zlyhalo</translation> <translation id="3838486795898716504">Ďalšie <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Pridanie uložených hesiel do Správcu hesiel Google</translation> <translation id="383891835335927981">Žiadne weby neboli priblížené ani oddialené</translation> <translation id="3839509547554145593">Povoliť zrýchlenie pri posúvaní myšou</translation> <translation id="3839516600093027468">Webu <ph name="HOST" /> vždy blokovať zobrazenie schránky</translation> @@ -4128,6 +4134,7 @@ <translation id="4871568871368204250">Vypnutie synchronizácie</translation> <translation id="4871719318659334896">Zavrieť skupinu</translation> <translation id="4872192066608821120">Ak chcete importovať heslá, vyberte súbor CSV</translation> +<translation id="4872212987539553601">Nastavenie šifrovania v zariadení</translation> <translation id="4873312501243535625">Media File Checker</translation> <translation id="4876273079589074638">Pomôžte našim programátorom prešetriť toto zlyhanie a vyriešiť ho. Ak je to možné, uveďte presné kroky. Poskytnite čo najpodrobnejšie informácie.</translation> <translation id="4876895919560854374">Zamknúť alebo odomknúť obrazovku</translation> @@ -6431,6 +6438,7 @@ <translation id="7093220653036489319">Rýchle odpovede</translation> <translation id="7093416310351037609">Vaša organizácia vyžaduje, aby boli všetky sťahované súbory spĺňajúce podmienky ukladané do jej účtu <ph name="WEB_DRIVE" />, čím sa zaistí ochrana a zabezpečenie údajov.</translation> <translation id="7093866338626856921">Vymieňať údaje so zariadeniami s nasledujúcimi názvami: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Prijmite žiadosť o prenos v zariadení <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Zariadenie USB-C (ľavý port vzadu)</translation> <translation id="7098447629416471489">Tu sa zobrazia ďalšie uložené vyhľadávače</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Odstrániť aplikáciu}few{Odstrániť aplikácie}many{Odstrániť aplikácie}other{Odstrániť aplikácie}}</translation> @@ -6531,6 +6539,7 @@ <translation id="7212097698621322584">Zadajte svoj aktuálny kód PIN a zmeňte ho. Ak ho nepoznáte, musíte resetovať bezpečnostný kľúč a potom vytvoriť nový PIN.</translation> <translation id="7213903639823314449">Vyhľadávač používaný v paneli s adresou</translation> <translation id="721490496276866468">Importovať heslá</translation> +<translation id="7218514093816577632">Nezabudnite zapnúť upozornenia v zariadení <ph name="DEVICE_NAME" />.</translation> <translation id="7219473482981809164">Našli sme viacero profilov k dispozícii na stiahnutie. Pred pokračovaním vyberte, ktoré chcete stiahnuť.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Žiadne slabé heslá}=1{1 slabé heslo}few{{NUM_WEAK} slabé heslá}many{{NUM_WEAK} weak passwords}other{{NUM_WEAK} slabých hesiel}}</translation> <translation id="7220019174139618249">Heslá sa nedajú exportovať do priečinka <ph name="FOLDER" /></translation> @@ -6720,6 +6729,7 @@ <translation id="7404065585741198296">Telefón s káblom USB</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{Kontrola bezpečnosti prebehla pred hodinou}few{Kontrola bezpečnosti prebehla pred {NUM_HOURS} hodinami}many{Kontrola bezpečnosti prebehla pred {NUM_HOURS} hodiny}other{Kontrola bezpečnosti prebehla pred {NUM_HOURS} hodinami}}</translation> <translation id="740624631517654988">Zablokované vyskakovacie okno</translation> +<translation id="7406912950279255498">Režim inverzie farieb</translation> <translation id="7407430846095439694">Importovať a spojiť</translation> <translation id="7407504355934009739">Väčšina ľudí blokuje upozornenia z tohto webu</translation> <translation id="740810853557944681">Pridanie tlačového servera</translation> @@ -7000,6 +7010,7 @@ <translation id="7664620655576155379">Nepodporované zariadenie Bluetooth: <ph name="DEVICE_NAME" />.</translation> <translation id="7665082356120621510">Rezervovať veľkosť</translation> <translation id="7665369617277396874">Pridať účet</translation> +<translation id="766635563210446220">Heslá sa nedajú importovať. Skontrolujte, či má súbor <ph name="FILENAME" /> správny formát. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Vráťte <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňa}few{Vráťte <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňov}many{Vráťte <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňa}other{Vráťte <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňov}}</translation> <translation id="7668423670802040666">V správcovi hesiel Google pre účet <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Funkcie dostupnosti zjednodušujú používanie zariadenia. Ak chcete získať prístup k rýchlym nastaveniam, vyberte v dolnej časti obrazovky čas.</translation> @@ -7531,6 +7542,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{video}few{# videá}many{# videos}other{# videí}}</translation> <translation id="8143442547342702591">Neplatná aplikácia</translation> <translation id="8143609395536282994">Ako môžete spravovať svoje údaje:</translation> +<translation id="8145170459658034418">Šetrič pamäte</translation> <translation id="8146177459103116374">Ak ste sa na tomto zariadení už zaregistrovali, môžete sa <ph name="LINK2_START" />prihlásiť ako existujúci používateľ<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Pridajte a usporiadajte svoje preferované jazyky. Ak to bude možné, weby sa budú zobrazovať vo vašich preferovaných jazykoch. Tieto predvoľby sú synchronizované s nastaveniami vášho prehliadača. <ph name="BEGIN_LINK_LEARN_MORE" />Ďalšie informácie<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Prihlásenie zlyhalo. Kontaktujte svojho správcu alebo to skúste znova.</translation> @@ -7590,6 +7602,7 @@ <translation id="8198456017687137612">Karta prenosu</translation> <translation id="8199300056570174101">Vlastnosti siete (služba) a zariadenia</translation> <translation id="8200772114523450471">Pokračovať</translation> +<translation id="8200789660596905522">Nezabudnite prijať žiadosť o prenos v zariadení <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Zadajte znova svoje heslo a aktualizujte tak profil zariadenia <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Názov zariadenia pri Zdieľaní nablízku</translation> <translation id="8203732864715032075">Odosiela upozornenia a predvolene si zapamätá tento počítač pre Správy. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> @@ -7666,6 +7679,7 @@ <ph name="BEGIN_PARAGRAPH3" />Vlastník môže túto funkciu ovládať v časti Nastavenia > Rozšírené > Automaticky odosielať diagnostiky a údaje o používaní Googlu.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Ak máte zapnutú dodatočnú aktivitu na internete a v aplikáciách, tieto údaje sa môžu ukladať do vášho účtu Google. Na families.google.com<ph name="END_PARAGRAPH4" /> môžete zobraziť alebo odstrániť údaje a zmeniť nastavenia účtu.</translation> <translation id="826905130698769948">Neplatný certifikát klienta</translation> +<translation id="8270162672241199380">Inštalátor aplikácie Steam</translation> <translation id="827097179112817503">Zobrazovať tlačidlo domovskej stránky</translation> <translation id="8271268254812352141">Získavajte definície, preklady alebo prevody jednotiek kliknutím pravým tlačidlom alebo pridržaním textu. Jazyky prekladu si prispôsobíte v sekcii <ph name="LINK_BEGIN" />Jazyky webu<ph name="LINK_END" />.</translation> <translation id="8271379370373330993">Nasledujúce kroky sú určené pre rodičov. Po založení účtu môžete zariadenie <ph name="DEVICE_TYPE" /> vrátiť dieťaťu.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index a308d51..b355b19 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Skoraj je že čas za odmor</translation> <translation id="1062628064301375934">Pomagajte nam oblikovati zasebnejši splet</translation> <translation id="1067048845568873861">Ustvarjeno</translation> +<translation id="1067661089446014701">Zaradi dodatne varnosti lahko šifrirate gesla v napravi, preden se shranijo v računu Google.</translation> <translation id="1067922213147265141">Druge Googlove storitve</translation> <translation id="1069355737714877171">Odstrani profil za eSIM z imenom <ph name="PROFILE_NAME" /></translation> <translation id="1070377999570795893">Drug program v računalniku je dodal razširitev, ki lahko spremeni način delovanja Chroma. @@ -254,6 +255,7 @@ <translation id="1223853788495130632">Skrbnik priporoča za to nastavitev posebno vrednost.</translation> <translation id="1225177025209879837">Obdelava zahteve ...</translation> <translation id="1227507814927581609">Med povezovanjem z napravo »<ph name="DEVICE_NAME" />« ni uspelo preverjanje pristnosti.</translation> +<translation id="1227993798763400520">Predvajanje ni uspelo. Poskusite znova.</translation> <translation id="1230417814058465809">Standardna zaščita je vklopljena. Za večjo varnost uporabite izboljšano zaščito.</translation> <translation id="1231733316453485619">Želite vklopiti sinhronizacijo?</translation> <translation id="1232569758102978740">Brez naslova</translation> @@ -698,6 +700,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 s šifriranjem RSA</translation> <translation id="1641113438599504367">Varno brskanje</translation> <translation id="1641496881756082050">Več dejanj za <ph name="NETWORK_NAME" /></translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Uvoženo ni bilo še 1 geslo, ker ni pravilno oblikovano.}one{Uvoženo ni bilo še {NUM_PASSWORDS} drugo geslo, ker ni pravilno oblikovano.}two{Uvoženi nista bili še {NUM_PASSWORDS} drugi gesli, ker nista pravilno oblikovani.}few{Uvožena niso bila še {NUM_PASSWORDS} druga gesla, ker niso pravilno oblikovana.}other{Uvoženih ni bilo še {NUM_PASSWORDS} drugih gesel, ker niso pravilno oblikovana.}}</translation> <translation id="1642492862748815878">Povezano z napravo <ph name="DEVICE" /> in še toliko drugimi napravami Bluetooth: <ph name="NUMBER_OF_DEVICES" /></translation> <translation id="1642494467033190216">Pred omogočanjem drugih funkcij za odpravljanje napak je treba odstraniti zaščito rootfs in znova zagnati napravo.</translation> <translation id="1643072738649235303">Podpis X9.62 ECDSA z algoritmom SHA-1</translation> @@ -1127,6 +1130,7 @@ <translation id="2031914984822377766">Dodajte <ph name="LINK_BEGIN" />prednostne jezike spletnih mest<ph name="LINK_END" />. Prvouvrščeni jezik na seznamu bo uporabljen za prevode.</translation> <translation id="2033758234986231162">Povezave s telefonom ni mogoče ohraniti. Poskrbite, da je telefon v bližini, odklenjen in ima vklopljeno povezavo Bluetooth ter omrežje Wi-Fi.</translation> <translation id="2034346955588403444">Dodaj drugo omrežje Wi-Fi</translation> +<translation id="2035211704574173780">Sivine</translation> <translation id="203574396658008164">Omogoči ustvarjanje zapiskov na zaklenjenem zaslonu</translation> <translation id="2037445849770872822">Za ta račun Google je nastavljen nadzor. Če želite nastaviti več starševskega nadzora, izberite »Naprej«. @@ -1847,6 +1851,7 @@ <translation id="2673135533890720193">Branje zgodovine brskanja</translation> <translation id="2674764818721168631">Izklopljeno</translation> <translation id="2678063897982469759">Znova omogoči</translation> +<translation id="2678100101831051676">Ni mogoče predvajati.</translation> <translation id="268053382412112343">Z&godovina</translation> <translation id="2681124317993121768">Profili gosta niso podprti.</translation> <translation id="2682498795777673382">Starš je izvedel posodobitev</translation> @@ -2556,6 +2561,7 @@ <translation id="3363202073972776113">Ta novi profil bo upravljala vaša organizacija. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Od skrbnika: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Uporabite Ctrl ali Alt</translation> +<translation id="3368586359109138591">Prenos kopije, ki jo lahko uporabite drugje.</translation> <translation id="3368922792935385530">Povezano</translation> <translation id="3369067987974711168">Pokaži več dejanj za ta vrata</translation> <translation id="3369624026883419694">Razrešujem gostitelja ...</translation> @@ -2744,6 +2750,7 @@ <translation id="3532273508346491126">Upravljanje sinhronizacije</translation> <translation id="3532521178906420528">Vzpostavljanje omrežne povezave …</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – zvok utišan</translation> +<translation id="3536492240554502321">Vrtenje odtenka</translation> <translation id="3537881477201137177">To je mogoče spremeniti pozneje v nastavitvah</translation> <translation id="3538066758857505094">Napaka pri odstranjevanju Linuxa. Poskusite znova.</translation> <translation id="354060433403403521">Napajalnik na izmenični tok</translation> @@ -3069,6 +3076,7 @@ <translation id="383669374481694771">Gre za splošne podatke o tej napravi in njeni uporabi, kot so raven napolnjenosti baterije, dejavnost sistema in aplikacije ter napake. Ti podatki bodo uporabljeni za izboljšanje sistema Android. Nekateri združeni podatki bodo pomagali tudi Googlovim aplikacijam in partnerjem, na primer razvijalcem za Android, izboljšati aplikacije in izdelke.</translation> <translation id="3838085852053358637">Ni bilo mogoče naložiti razširitve</translation> <translation id="3838486795898716504">Več <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Dodajte gesla v Googlovega upravitelja gesel.</translation> <translation id="383891835335927981">Nobeno spletno mesto ni povečano ali pomanjšano</translation> <translation id="3839509547554145593">Omogoči pospeševalnik drsenja z miško</translation> <translation id="3839516600093027468">Vedno prepreči naslovu <ph name="HOST" /> ogled odložišča</translation> @@ -3376,7 +3384,7 @@ <translation id="4115002065223188701">Omrežje zunaj dosega</translation> <translation id="4115378294792113321">Škrlatna</translation> <translation id="4116704186509653070">Znova odpri</translation> -<translation id="4117714603282104018">Povratne informacije s tresenjem za sledilno ploščico</translation> +<translation id="4117714603282104018">Tipni odziv sledilne ploščice</translation> <translation id="4118579674665737931">Znova zaženite napravo in poskusite znova.</translation> <translation id="412022815379960229">Začnite raziskovati svoje spomine iz Googla Foto, ko ste prijavljeni.</translation> <translation id="4120388883569225797">Tega varnostnega ključa ni mogoče ponastaviti</translation> @@ -3881,6 +3889,7 @@ <translation id="4617019240346358451">Znova naložite stran, če želite uporabljati razširitev »<ph name="EXTENSION_NAME" />«</translation> <translation id="4617270414136722281">Možnosti razširitev</translation> <translation id="4617880081511131945">Povezave ni mogoče vzpostaviti</translation> +<translation id="4618195822946934889">URL lahko vsebuje samo znake ASCII</translation> <translation id="4619564267100705184">Potrditev identitete</translation> <translation id="4619615317237390068">Zavihki iz drugih naprav</translation> <translation id="4620809267248568679">To nastavitev je vsilila razširitev.</translation> @@ -4142,6 +4151,7 @@ <translation id="4871568871368204250">Izklop sinhronizacije</translation> <translation id="4871719318659334896">Zapri skupino</translation> <translation id="4872192066608821120">Če želite uvoziti gesla, izberite datoteko CSV.</translation> +<translation id="4872212987539553601">Nastavitev šifriranja v napravi</translation> <translation id="4873312501243535625">Pripomoček za preverjanje predstavnostnih datotek</translation> <translation id="4876273079589074638">Pomagajte našim tehnikom preučiti in odpraviti to zrušitev. Natančno navedite svoje korake, če lahko. Pomembna je vsaka podrobnost.</translation> <translation id="4876895919560854374">Zaklepanje in odklepanje zaslona</translation> @@ -5082,6 +5092,7 @@ <translation id="5800351251499368110">Zapri iskanje v stranskem podoknu. Iskanje je odprto v stranskem podoknu.</translation> <translation id="5801568494490449797">Nastavitve</translation> <translation id="5804241973901381774">Dovoljenja</translation> +<translation id="5805268472388605531">Pridržite tipke na tipkovnici, če si želite ogledati naglasna znamenja in posebne znake.</translation> <translation id="5805697420284793859">Upravitelj oken</translation> <translation id="5806447147478173900">Skupna shramba, ki jo uporabljajo prikazana spletna mesta: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (privzeto)</translation> @@ -5723,6 +5734,7 @@ <translation id="642469772702851743">To napravo (serijska številka: <ph name="SERIAL_NUMBER" />) je zaklenil lastnik.</translation> <translation id="6425556984042222041">Hitrost pretvorbe besedila v govor</translation> <translation id="642729974267661262">Ni dovoljeno predvajanje zvoka</translation> +<translation id="6427608534767366138">Za »<ph name="NETWORK_ID" />« je obvezno preverjanje pristnosti strežnika proxy.</translation> <translation id="6429384232893414837">Napaka glede posodobitve</translation> <translation id="6430814529589430811">Base64 kodiran ASCII, enojno potrdilo</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> nastavi samodejne posodobitve za vse uporabnike tega računalnika.</translation> @@ -6447,6 +6459,7 @@ <translation id="7093220653036489319">Hitri odgovori</translation> <translation id="7093416310351037609">Zaradi varnosti in zaščite podatkov organizacija zahteva, da se vsi primerni prenosi shranijo v račun organizacije v storitvi <ph name="WEB_DRIVE" />.</translation> <translation id="7093866338626856921">Izmenjava podatkov z napravami, imenovanimi: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Sprejmite zahtevo za predvajanje v napravi <ph name="DEVICE_NAME" />.</translation> <translation id="7098389117866926363">Naprava USB-C (vrata levo zadaj)</translation> <translation id="7098447629416471489">Drugi shranjeni iskalniki bodo prikazani tukaj</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Odstrani aplikacijo}one{Odstrani aplikacije}two{Odstrani aplikacije}few{Odstrani aplikacije}other{Odstrani aplikacije}}</translation> @@ -6547,6 +6560,7 @@ <translation id="7212097698621322584">Vnesite trenutno kodo PIN, da jo spremenite. Če kode PIN ne poznate, morate ponastaviti varnostni ključ, nato ustvarite novo kodo PIN.</translation> <translation id="7213903639823314449">Iskalnik, uporabljen v naslovni vrstici</translation> <translation id="721490496276866468">Uvoz gesel</translation> +<translation id="7218514093816577632">Preverite, ali so v napravi <ph name="DEVICE_NAME" /> vklopljena obvestila.</translation> <translation id="7219473482981809164">Našli smo več profilov, ki so na voljo za prenos. Preden nadaljujete, izberite tiste, ki jih želite prenesti.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Ni šibkih gesel}=1{1 šibko geslo}one{{NUM_WEAK} šibko geslo}two{{NUM_WEAK} šibki gesli}few{{NUM_WEAK} šibka gesla}other{{NUM_WEAK} šibkih gesel}}</translation> <translation id="7220019174139618249">Gesel ni mogoče izvoziti v »<ph name="FOLDER" />«</translation> @@ -7016,6 +7030,7 @@ <translation id="7664620655576155379">Nepodprta naprava Bluetooth: »<ph name="DEVICE_NAME" />«.</translation> <translation id="7665082356120621510">Rezerviraj velikost</translation> <translation id="7665369617277396874">Dodaj račun</translation> +<translation id="766635563210446220">Gesel ni mogoče uvoziti. Preverite, ali je datoteka <ph name="FILENAME" /> pravilno oblikovana. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Napravo <ph name="DEVICE_TYPE" /> vrnite v {NUM_WEEKS} tednu}one{Napravo <ph name="DEVICE_TYPE" /> vrnite v {NUM_WEEKS} tednu}two{Napravo <ph name="DEVICE_TYPE" /> vrnite v {NUM_WEEKS} tednih}few{Napravo <ph name="DEVICE_TYPE" /> vrnite v {NUM_WEEKS} tednih}other{Napravo <ph name="DEVICE_TYPE" /> vrnite v {NUM_WEEKS} tednih}}</translation> <translation id="7668423670802040666">V Googlovem upravitelju gesel za <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Uporaba funkcij za ljudi s posebnimi potrebami omogoča preprostejšo uporabo naprave. Do hitrih nastavitev dostopate tako, da na dnu zaslona izberete čas.</translation> @@ -7467,7 +7482,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">Skupina <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Pogovorno okno za povezovanje</translation> -<translation id="8070662218171013510">Povratne informacije s tresenjem</translation> +<translation id="8070662218171013510">Tipni odziv</translation> <translation id="8071432093239591881">Natisni kot sliko</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Podatki aplikacij so lahko kateri koli podatki, ki jih je shranila aplikacija (glede na nastavitve razvijalca), vključno s podatki, kot so stiki, sporočila in fotografije.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Varnostno kopirani podatki se ne štejejo v otrokovo omejitev prostora za shranjevanje v Googlu Drive.<ph name="END_PARAGRAPH2" /> @@ -7548,6 +7563,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{videoposnetek}one{# videoposnetek}two{# videoposnetka}few{# videoposnetki}other{# videoposnetkov}}</translation> <translation id="8143442547342702591">Neveljavna aplikacija</translation> <translation id="8143609395536282994">Kako lahko upravljate podatke:</translation> +<translation id="8145170459658034418">Varčevanje s pomnilnikom</translation> <translation id="8146177459103116374">Če ste se v tej napravi že registrirali, se lahko <ph name="LINK2_START" />prijavite kot obstoječi uporabnik<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Dodajte in uvrstite izbrane jezike. Spletna mesta bodo prikazana v izbranih jezikih, če je mogoče. Te nastavitve se sinhronizirajo z nastavitvami brskalnika. <ph name="BEGIN_LINK_LEARN_MORE" />Več o tem<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Prijava ni uspela. Obrnite se na skrbnika in poskusite znova.</translation> @@ -7607,6 +7623,7 @@ <translation id="8198456017687137612">Predvajanje vsebine zavihka</translation> <translation id="8199300056570174101">Nastavitve omrežja (storitve) in naprav</translation> <translation id="8200772114523450471">Nadaljuj</translation> +<translation id="8200789660596905522">Sprejeti morate zahtevo za predvajanje v napravi <ph name="DEVICE_NAME" />.</translation> <translation id="8202160505685531999">Znova vnesite geslo, če želite posodobiti profil v napravi <ph name="DEVICE_TYPE" />.</translation> <translation id="8203152941016626022">Ime naprave deljenja v bližini</translation> <translation id="8203732864715032075">Pošlje vam obvestila in si privzeto zapomni ta računalnik za Sporočila. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> @@ -7858,6 +7875,7 @@ <translation id="844063558976952706">Vedno na tem mestu</translation> <translation id="8441313165929432954">Omogočanje/onemogočanje povezave računalnika z internetom prek mobilnega telefona</translation> <translation id="8443795068008423036">Preverite, ali je naprava posodobljena, in poskusite znova.</translation> +<translation id="8443986842926457191">URL vsebuje več kot 2048 znakov</translation> <translation id="8446884382197647889">Več o tem</translation> <translation id="8447409163267621480">Vključevati morajo ali Ctrl ali Alt</translation> <translation id="844850004779619592">Najden ni bil noben ukaz</translation> @@ -7923,6 +7941,7 @@ <translation id="851263357009351303">Vedno dovoli mestu <ph name="HOST" />, da pokaže slike</translation> <translation id="8513108775083588393">Samodej. zasuk</translation> <translation id="8514746246728959655">Poskusite z drugim varnostnim ključem</translation> +<translation id="8519895319663397036">Gesel ni mogoče uvoziti. Velikost datoteke mora biti manjša od 150 KB.</translation> <translation id="8523493869875972733">Ohranitev sprememb</translation> <translation id="8523849605371521713">Dodano s pravilnikom</translation> <translation id="8524783101666974011">Shranjevanje kartic v Google Računu</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 472e8a6..262439c 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -6738,6 +6738,7 @@ <translation id="7404065585741198296">USB కేబుల్తో కనెక్ట్ చేయబడిన మీ ఫోన్</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{భద్రతా తనిఖీ జరిగి 1 గంట అయింది}other{భద్రతా తనిఖీ జరిగి {NUM_HOURS} గంటలు అయింది}}</translation> <translation id="740624631517654988">పాప్-అప్ నిరోధించబడింది</translation> +<translation id="7406912950279255498">కలర్ మార్పిడి మోడ్</translation> <translation id="7407430846095439694">దిగుమతి చేసి, అనుబంధించు</translation> <translation id="7407504355934009739">చాలా మంది వ్యక్తులు ఈ సైట్ నుండి నోటిఫికేషన్లను బ్లాక్ చేస్తారు</translation> <translation id="740810853557944681">ప్రింట్ సర్వర్ని జోడించండి</translation> @@ -7684,6 +7685,7 @@ <ph name="BEGIN_PARAGRAPH3" />సెట్టింగ్లు > అధునాతనం > సమస్య విశ్లేషణలను, వినియోగ డేటాను ఆటోమేటిక్గా Googleకు పంపు అన్న దానిలోకి వెళ్లి ఓనర్ ఈ ఫీచర్ను కంట్రోల్ చేయవచ్చు.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />అదనంగా మీ చిన్నారి కోసం వెబ్ & యాప్ యాక్టివిటీ సెట్టింగ్ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో నిల్వ చేయబడవచ్చు. ఈ సెట్టింగ్ల గురించి, వీటిని సర్దుబాటు చేయడం గురించి families.google.comలో మరింత తెలుసుకోండి.<ph name="END_PARAGRAPH4" /></translation> <translation id="826905130698769948">చెల్లని క్లయింట్ సర్టిఫికెట్</translation> +<translation id="8270162672241199380">Steam ఇన్స్టాలర్</translation> <translation id="827097179112817503">హోమ్ బటన్ను చూపు</translation> <translation id="8271268254812352141">మీరు టెక్స్ట్ను కుడి క్లిక్ చేసినప్పుడు లేదా తాకి, నొక్కి ఉంచినప్పుడు నిర్వచనాలు, అనువాదాలు, లేదా యూనిట్ మార్పిడులను పొందండి. <ph name="LINK_BEGIN" />వెబ్సైట్ భాషల<ph name="LINK_END" />లో అనువాద భాషలను అనుకూలంగా మార్చండి.</translation> <translation id="8271379370373330993">తల్లిదండ్రులారా, తర్వాత కొన్ని దశలు మీ కోసం. ఖాతాను సెటప్ చేసిన తర్వాత మీరు <ph name="DEVICE_TYPE" />ను చిన్నారికి తిరిగి ఇవ్వవచ్చు.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 197dfd7..6612657 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2171,6 +2171,7 @@ <translation id="2977480621796371840">นำออกจากกลุ่ม</translation> <translation id="2979639724566107830">เปิดในหน้าต่างใหม่</translation> <translation id="2981113813906970160">แสดงเคอร์เซอร์เมาส์ขนาดใหญ่</translation> +<translation id="2981293774053328982">ไฟล์นี้มีมัลแวร์ที่อาจทำให้บัญชีส่วนตัวหรือบัญชีโซเชียลเน็ตเวิร์กของคุณถูกบุกรุก</translation> <translation id="2983373101216420412">ระดับแบตเตอรี่ของกล่อง <ph name="PERCENTAGE" />%</translation> <translation id="2985348301114641460">ส่งคำขอให้ผู้ดูแลระบบติดตั้ง "<ph name="EXTENSION_NAME" />" ไหม</translation> <translation id="2987620471460279764">ข้อความแชร์มาจากอุปกรณ์อื่น</translation> @@ -3752,6 +3753,7 @@ <translation id="4514610446763173167">สลับปุ่มควบคุมวิดีโอเพื่อเล่นหรือหยุดชั่วคราว</translation> <translation id="451515744433878153">นำออก</translation> <translation id="4515872537870654449">ติดต่อ Dell เพื่อส่งซ่อม แท่นชาร์จจะปิดหากพัดลมไม่ทำงาน</translation> +<translation id="4518840066030486079">รูปแบบโหมดแป้น Shift</translation> <translation id="4519331665958994620">เว็บไซต์ขอใช้กล้องของคุณได้</translation> <translation id="4519935350946509010">เกิดข้อผิดพลาดในการเชื่อมต่อ</translation> <translation id="4520385623207007473">คุกกี้ที่ใช้งานอยู่</translation> @@ -3847,6 +3849,7 @@ <translation id="4598345735110653698">จัดการพาสคีย์</translation> <translation id="4598556348158889687">การจัดการพื้นที่เก็บข้อมูล</translation> <translation id="4598776695426288251">มี Wi-Fi พร้อมใช้งานผ่านอุปกรณ์หลายเครื่อง</translation> +<translation id="4600071396330666617">จำนวนคำแนะนำ</translation> <translation id="4601426376352205922">ทำเครื่องหมายว่ายังไม่อ่าน</translation> <translation id="4602466770786743961">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องและไมโครโฟนของคุณเสมอ</translation> <translation id="4606551464649945562">ไม่อนุญาตให้เว็บไซต์สร้างแผนที่ 3 มิติของสิ่งที่อยู่รอบตัวคุณหรือติดตามตำแหน่งของกล้อง</translation> @@ -4292,6 +4295,7 @@ <translation id="5043913660911154449">หรือระบุ PPD ของเครื่องพิมพ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="5045550434625856497">รหัสผ่านไม่ถูกต้อง</translation> <translation id="504561833207953641">กำลังเปิดในเซสชันเบราว์เซอร์ที่มีอยู่</translation> +<translation id="5049614114599109018">ใช้ประวัติการป้อนข้อมูล</translation> <translation id="5051836348807686060">การตรวจตัวสะกดไม่รองรับภาษาที่คุณเลือก</translation> <translation id="5052499409147950210">แก้ไขเว็บไซต์</translation> <translation id="505347685865235222">กลุ่มที่ไม่มีชื่อ - <ph name="GROUP_CONTENT_STRING" /></translation> @@ -6711,6 +6715,7 @@ <translation id="7404065585741198296">โทรศัพท์ของคุณผ่านสาย USB</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{เรียกใช้การตรวจสอบความปลอดภัยเมื่อ 1 ชั่วโมงที่ผ่านมา}other{เรียกใช้การตรวจสอบความปลอดภัยเมื่อ {NUM_HOURS} ชั่วโมงที่ผ่านมา}}</translation> <translation id="740624631517654988">ปิดกั้นป๊อปอัป</translation> +<translation id="7406912950279255498">โหมดการกลับสี</translation> <translation id="7407430846095439694">นำเข้าและเชื่อมโยง</translation> <translation id="7407504355934009739">คนส่วนใหญ่บล็อกการแจ้งเตือนจากเว็บไซต์นี้</translation> <translation id="740810853557944681">เพิ่มเซิร์ฟเวอร์การพิมพ์</translation> @@ -7657,6 +7662,7 @@ <ph name="BEGIN_PARAGRAPH3" />เจ้าของจะควบคุมฟีเจอร์นี้ได้จากการตั้งค่า > ขั้นสูง > ส่งข้อมูลการวินิจฉัยและการใช้งานไปยัง Google โดยอัตโนมัติ<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />หากการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปเปิดอยู่สำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าเหล่านี้และวิธีปรับการตั้งค่าได้ที่ families.google.com<ph name="END_PARAGRAPH4" /></translation> <translation id="826905130698769948">ใบรับรองไคลเอ็นต์ไม่ถูกต้อง</translation> +<translation id="8270162672241199380">โปรแกรมติดตั้ง Steam</translation> <translation id="827097179112817503">แสดงปุ่มหน้าแรก</translation> <translation id="8271268254812352141">รับคำจำกัดความ คำแปล หรือการแปลงหน่วยเมื่อคุณคลิกขวาหรือแตะข้อความค้างไว้ เปลี่ยนภาษาของคำแปลใน<ph name="LINK_BEGIN" />ภาษาของเว็บไซต์<ph name="LINK_END" /></translation> <translation id="8271379370373330993">ขั้นตอนต่อๆ ไปมีไว้สำหรับผู้ปกครอง คุณคืน <ph name="DEVICE_TYPE" /> ให้บุตรหลานได้หลังจากที่สร้างบัญชีแล้ว</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 3ee503a..14eb2b80 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Mola verme zamanı yaklaştı</translation> <translation id="1062628064301375934">Daha gizli bir web inşa etmemize yardımcı olun</translation> <translation id="1067048845568873861">Oluşturulduğu tarih</translation> +<translation id="1067661089446014701">Ek güvenlik için, Google Hesabınıza kaydedilmeden önce şifrelerinizi cihazınızda şifreleyebilirsiniz</translation> <translation id="1067922213147265141">Diğer Google hizmetleri</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> adlı eSIM profilini kaldır</translation> <translation id="1070377999570795893">Bilgisayarınızdaki başka bir program, Chrome'un çalışma şeklini değiştirebilecek bir uzantı ekledi. @@ -249,6 +250,7 @@ <translation id="1223853788495130632">Yöneticiniz bu ayar için belirli bir değer öneriyor.</translation> <translation id="1225177025209879837">İstek işleniyor...</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />" cihazına bağlanırken kimlik doğrulaması başarısız oldu.</translation> +<translation id="1227993798763400520">Yayınlama işlemi başarısız oldu. Lütfen tekrar deneyin.</translation> <translation id="1230417814058465809">Standart koruma açık. Daha fazla güvenlik için gelişmiş korumayı kullanın.</translation> <translation id="1231733316453485619">Senkronizasyon açılsın mı?</translation> <translation id="1232569758102978740">Adsız</translation> @@ -692,6 +694,7 @@ <translation id="1640283014264083726">PKCS #1 RSA Şifrelemeli MD4</translation> <translation id="1641113438599504367">Güvenli Tarama</translation> <translation id="1641496881756082050"><ph name="NETWORK_NAME" /> ile ilgili diğer işlemler</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Yanlış biçimlendirildiği için diğer 1 şifre içe aktarılamadı}other{Yanlış biçimlendirildikleri için diğer {NUM_PASSWORDS} şifre içe aktarılamadı}}</translation> <translation id="1642492862748815878"><ph name="DEVICE" /> cihazına ve diğer <ph name="NUMBER_OF_DEVICES" /> Bluetooth cihaza daha bağlanıldı</translation> <translation id="1642494467033190216">Diğer hata ayıklama özelliklerinin etkinleştirilebilmesi için rootfs korumasının kaldırılması ve cihazın yeniden başlatılması gerekir.</translation> <translation id="1643072738649235303">SHA-1 ile X9.62 ECDSA İmzası</translation> @@ -1112,6 +1115,7 @@ <translation id="2031914984822377766">Tercih ettiğiniz <ph name="LINK_BEGIN" />web sitesi dillerini<ph name="LINK_END" /> ekleyin. Çeviriler için listede ilk sırada bulunan dil kullanılır.</translation> <translation id="2033758234986231162">Telefonunuzla bağlantı sürdürülemiyor. Telefonunuzun yakında bulunduğundan, kilidinin ve Bluetooth ile kablosuz bağlantının da açık olduğundan emin olun.</translation> <translation id="2034346955588403444">Başka kablosuz ağ ekle</translation> +<translation id="2035211704574173780">Gri Tonlamalı</translation> <translation id="203574396658008164">Kilit ekranından not almayı etkinleştir</translation> <translation id="2037445849770872822">Bu Google Hesabı için denetim kuruldu. Diğer ebeveyn denetimlerini kurmak için Devam'ı seçin. @@ -1827,6 +1831,7 @@ <translation id="2673135533890720193">Göz atma geçmişinizi okuma</translation> <translation id="2674764818721168631">Kapalı</translation> <translation id="2678063897982469759">Tekrar etkinleştir</translation> +<translation id="2678100101831051676">Yayınlayamıyor.</translation> <translation id="268053382412112343">Geç&miş</translation> <translation id="2681124317993121768">Misafir profilleri desteklenmiyor</translation> <translation id="2682498795777673382">Ebeveyniniz güncelleme yaptı</translation> @@ -2536,6 +2541,7 @@ <translation id="3363202073972776113">Bu yeni profil, kuruluşunuz tarafından yönetilir. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Yöneticinizden: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl veya Alt tuşlarından birini kullanın</translation> +<translation id="3368586359109138591">Başka bir yerde kullanmak için kopyasını indirin</translation> <translation id="3368922792935385530">Bağlı</translation> <translation id="3369067987974711168">Bu bağlantı noktası için daha fazla işlem göster</translation> <translation id="3369624026883419694">Ana bilgisayar çözümleniyor...</translation> @@ -2724,6 +2730,7 @@ <translation id="3532273508346491126">Senkronizasyon yönetimi</translation> <translation id="3532521178906420528">Ağ bağlantısı kuruluyor...</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - Ses kapatıldı</translation> +<translation id="3536492240554502321">Ton döndürme</translation> <translation id="3537881477201137177">Bu daha sonra Ayarlar'da değiştirilebilir</translation> <translation id="3538066758857505094">Linux yüklemesi kaldırılırken hata oluştu. Lütfen tekrar deneyin.</translation> <translation id="354060433403403521">AC adaptörü</translation> @@ -3049,6 +3056,7 @@ <translation id="383669374481694771">Buradaki bilgiler (ör. pil seviyesi, sistem ve uygulama etkinliği, hatalar), bu cihazla ve cihazın nasıl kullanıldığıyla ilgili genel bilgilerdir. Bu veriler Android'i iyileştirmek için kullanılır. Toplu hale getirilen bazı bilgiler, Google uygulamalarının ve Android geliştiricileri gibi iş ortaklarına ait uygulama ve ürünlerin iyileştirilmesine de yardımcı olur.</translation> <translation id="3838085852053358637">Uzantı yüklenemedi</translation> <translation id="3838486795898716504">Diğer <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Kayıtlı şifreleri Google Şifre Yöneticisi'ne ekleyin</translation> <translation id="383891835335927981">Yakınlaştırılmış veya uzaklaştırılmış herhangi bir site yok</translation> <translation id="3839509547554145593">Fare kaydırma hızlandırmasını etkinleştir</translation> <translation id="3839516600093027468"><ph name="HOST" /> sitesinin panoyu görmesini her zaman engelle</translation> @@ -3860,6 +3868,7 @@ <translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />" uzantısını kullanmak için sayfayı yenileyin</translation> <translation id="4617270414136722281">Uzantı seçenekleri</translation> <translation id="4617880081511131945">Bağlantı kurulamıyor</translation> +<translation id="4618195822946934889">URL yalnızca ASCII karakterleri içerebilir</translation> <translation id="4619564267100705184">Kimliğinizi doğrulayın</translation> <translation id="4619615317237390068">Diğer cihazlardan sekmeler</translation> <translation id="4620809267248568679">Bu ayar bir uzantı tarafından zorunlu tutuluyor.</translation> @@ -4121,6 +4130,7 @@ <translation id="4871568871368204250">Senkronizasyonu kapatma</translation> <translation id="4871719318659334896">Grubu kapat</translation> <translation id="4872192066608821120">Şifrelerin içe aktarmak için bir CSV dosyası seçin</translation> +<translation id="4872212987539553601">Cihaz üzerinde şifrelemeyi ayarlama</translation> <translation id="4873312501243535625">Medya Dosyası Denetleyicisi</translation> <translation id="4876273079589074638">Mühendislerimizin kilitlenme olayı araştırmalarına ve düzeltmelerine yardımcı olun. Yapabilirseniz adımları tam olarak listeleyin. Hiçbir ayrıntıyı atlamayın!</translation> <translation id="4876895919560854374">Ekranı kilitleme ve kilidini açma</translation> @@ -5060,6 +5070,7 @@ <translation id="5800351251499368110">Yan paneldeki aramayı kapatın. Arama, yan panelde açık.</translation> <translation id="5801568494490449797">Tercihler</translation> <translation id="5804241973901381774">İzinler</translation> +<translation id="5805268472388605531">Aksan işaretlerini ve özel karakterleri görmek için klavye tuşlarını basılı tutun</translation> <translation id="5805697420284793859">Pencere yöneticisi</translation> <translation id="5806447147478173900">Görüntülenen siteler tarafından kullanılan toplam depolama alanı: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Varsayılan)</translation> @@ -5701,6 +5712,7 @@ <translation id="642469772702851743">Bu cihaz <ph name="SERIAL_NUMBER" /> yöneticisi tarafından kilitlendi.</translation> <translation id="6425556984042222041">Metin okuma konuşma hızı</translation> <translation id="642729974267661262">Ses çalmasına izin verilmeyen siteler</translation> +<translation id="6427608534767366138">"<ph name="NETWORK_ID" />" için proxy kimlik doğrulaması gerekir</translation> <translation id="6429384232893414837">Güncelleme hatası</translation> <translation id="6430814529589430811">Base64 kodlu ASCII, tek sertifika</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> bu bilgisayarın tüm kullanıcıları için otomatik güncellemeleri ayarlar.</translation> @@ -6419,6 +6431,7 @@ <translation id="7093220653036489319">Hızlı yanıtlar</translation> <translation id="7093416310351037609">Kuruluşunuz, veri güvenliği için tüm uygun indirmelerin kuruluşunuza ait <ph name="WEB_DRIVE" /> hesabına kaydedilmesini ister.</translation> <translation id="7093866338626856921"><ph name="HOSTNAMES" /> adlı cihazlarla veri alışverişi</translation> +<translation id="7094680343477712655"><ph name="DEVICE_NAME" /> cihazınızdaki yayın isteğini kabul edin.</translation> <translation id="7098389117866926363">USB-C cihaz (arkadaki sol bağlantı noktası)</translation> <translation id="7098447629416471489">Diğer kayıtlı arama motorları burada görünür</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Uygulamayı kaldır}other{Uygulamaları kaldır}}</translation> @@ -6519,6 +6532,7 @@ <translation id="7212097698621322584">Değiştirmek için geçerli PIN'inizi girin. PIN'inizi bilmiyorsanız güvenlik anahtarınızı sıfırlayarak yeni bir PIN oluşturmanız gerekir.</translation> <translation id="7213903639823314449">Adres çubuğunda kullanılan arama motoru</translation> <translation id="721490496276866468">Şifreleri içe aktar</translation> +<translation id="7218514093816577632"><ph name="DEVICE_NAME" /> cihazınızda bildirimlerin etkinleştirildiğinden emin olun.</translation> <translation id="7219473482981809164">İndirilebilecek birden fazla profil bulduk. Devam etmeden önce indirmek istediklerinizi seçin.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Zayıf şifre yok}=1{1 zayıf şifre}other{{NUM_WEAK} zayıf şifre}}</translation> <translation id="7220019174139618249">Şifreler "<ph name="FOLDER" />" klasörüne aktarılamıyor</translation> @@ -6988,6 +7002,7 @@ <translation id="7664620655576155379">Desteklenmeyen Bluetooth cihazı: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Disk alanı ayır</translation> <translation id="7665369617277396874">Hesap ekle</translation> +<translation id="766635563210446220">Şifreler içe aktarılamıyor. <ph name="FILENAME" /> dosyasını kontrol edip doğru biçimlendirildiğinden emin olun. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> cihazı, {NUM_WEEKS} hafta içinde iade edin}other{<ph name="DEVICE_TYPE" /> cihazı, {NUM_WEEKS} hafta içinde iade edin}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" /> için Google Şifre Yöneticisi'nde</translation> <translation id="7668648754769651616">Erişilebilirlik özellikleri, cihazınızın kullanımını kolaylaştırır. Hızlı Ayarlar'a erişmek için ekranınızın alt kısmındaki saati seçin.</translation> @@ -7519,6 +7534,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{bir video}other{# video}}</translation> <translation id="8143442547342702591">Geçersiz uygulama</translation> <translation id="8143609395536282994">Verilerinizi nasıl yönetebilirsiniz?</translation> +<translation id="8145170459658034418">Bellek Tasarrufu</translation> <translation id="8146177459103116374">Zaten bu cihazda kayıtlıysanız, <ph name="LINK2_START" />varolan kullanıcı olarak oturum açabilirsiniz<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Tercih ettiğiniz dilleri ekleyip sıralayın. Web siteleri, mümkün olduğunda tercih ettiğiniz dillerde gösterilir. Bu tercihler, tarayıcı ayarlarınızla senkronize edilir. <ph name="BEGIN_LINK_LEARN_MORE" />Daha fazla bilgi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Oturum açma işlemi başarısız oldu. Lütfen yöneticinizle iletişime geçin veya tekrar deneyin.</translation> @@ -7578,6 +7594,7 @@ <translation id="8198456017687137612">Sekme yayınlanıyor</translation> <translation id="8199300056570174101">Ağ (Hizmet) ve Cihaz özellikleri</translation> <translation id="8200772114523450471">Sürdür</translation> +<translation id="8200789660596905522"><ph name="DEVICE_NAME" /> cihazınızdaki yayın isteğini kabul ettiğinizden emin olun.</translation> <translation id="8202160505685531999"><ph name="DEVICE_TYPE" /> profilinizi güncellemek için lütfen şifrenizi tekrar girin.</translation> <translation id="8203152941016626022">Yakındakilerle Paylaş cihaz adı</translation> <translation id="8203732864715032075">Size bildirimler gönderir ve Mesajlar uygulaması için bu bilgisayarın hatırlanmasını varsayılan ayar yapar. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> @@ -7829,6 +7846,7 @@ <translation id="844063558976952706">Bu sitede her zaman</translation> <translation id="8441313165929432954">Tethering'i Etkinleştir/Devre Dışı Bırak</translation> <translation id="8443795068008423036">Lütfen cihazınızın güncel olduğundan emin olup tekrar deneyin</translation> +<translation id="8443986842926457191">URL 2.048 karakterden fazlasını içeriyor</translation> <translation id="8446884382197647889">Daha Fazla Bilgi Edinin</translation> <translation id="8447409163267621480">Ctrl veya Alt tuşunu ekleyin</translation> <translation id="844850004779619592">Komut bulunamadı</translation> @@ -7894,6 +7912,7 @@ <translation id="851263357009351303"><ph name="HOST" /> sitesindeki resimlerin gösterilmesine her zaman izin ver</translation> <translation id="8513108775083588393">Oto. döndür</translation> <translation id="8514746246728959655">Başka bir güvenlik anahtarı deneyin</translation> +<translation id="8519895319663397036">Şifreler içe aktarılamıyor. Dosya boyutu 150 KB'tan az olmalıdır.</translation> <translation id="8523493869875972733">Değişiklikleri Koru</translation> <translation id="8523849605371521713">Politika tarafından eklendi</translation> <translation id="8524783101666974011">Kartları Google Hesabınıza kaydedin</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index fc5f6075..ffa4525 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">Невдовзі час зробити перерву</translation> <translation id="1062628064301375934">Допоможіть нам розробити технології для кращої конфіденційності в мережі</translation> <translation id="1067048845568873861">Створено</translation> +<translation id="1067661089446014701">Для додаткового захисту ви можете шифрувати паролі на пристрої, перш ніж вони збережуться в обліковому записі Google</translation> <translation id="1067922213147265141">Інші сервіси Google</translation> <translation id="1069355737714877171">Видалити профіль eSIM-карти під назвою "<ph name="PROFILE_NAME" />"</translation> <translation id="1070377999570795893">Інша програма на вашому комп’ютері додала розширення, яке може впливати на роботу Chrome. @@ -254,6 +255,7 @@ <translation id="1223853788495130632">Адміністратор рекомендує конкретне значення для цього налаштування.</translation> <translation id="1225177025209879837">Обробка запиту…</translation> <translation id="1227507814927581609">Помилка автентифікації під час під’єднання до "<ph name="DEVICE_NAME" />".</translation> +<translation id="1227993798763400520">Не вдалося транслювати. Повторіть спробу.</translation> <translation id="1230417814058465809">Стандартний захист увімкнено. Щоб посилити свою безпеку, активуйте покращений захист.</translation> <translation id="1231733316453485619">Увімкнути синхронізацію?</translation> <translation id="1232569758102978740">Без імені</translation> @@ -698,6 +700,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 із шифруванням RSA</translation> <translation id="1641113438599504367">Безпечний перегляд</translation> <translation id="1641496881756082050">Інші дії для мережі "<ph name="NETWORK_NAME" />"</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{Не вдалось імпортувати ще 1 пароль, оскільки він має неправильний формат}one{Не вдалось імпортувати ще {NUM_PASSWORDS} пароль, оскільки вони мають неправильний формат}few{Не вдалось імпортувати ще {NUM_PASSWORDS} паролі, оскільки вони мають неправильний формат}many{Не вдалось імпортувати ще {NUM_PASSWORDS} паролів, оскільки вони мають неправильний формат}other{Не вдалось імпортувати ще {NUM_PASSWORDS} пароля, оскільки вони мають неправильний формат}}</translation> <translation id="1642492862748815878">Підключено до "<ph name="DEVICE" />" і ще стількох пристроїв із Bluetooth: <ph name="NUMBER_OF_DEVICES" /></translation> <translation id="1642494467033190216">Перш ніж увімкнути інші функції налагодження, потрібно видалити захист rootfs і перезавантажити пристрій.</translation> <translation id="1643072738649235303">Алгоритм ECDSA X9.62 з підписом SHA-1</translation> @@ -1127,6 +1130,7 @@ <translation id="2031914984822377766">Додайте <ph name="LINK_BEGIN" />мови для веб-сайту<ph name="LINK_END" />. Текст перекладатиметься на першу мову зі списку.</translation> <translation id="2033758234986231162">Пристрій не може підтримувати зв’язок із телефоном. Переконайтеся, що ваш телефон поблизу й розблокований, а Bluetooth і Wi-Fi увімкнено.</translation> <translation id="2034346955588403444">Додати іншу мережу Wi-Fi</translation> +<translation id="2035211704574173780">Відтінки сірого</translation> <translation id="203574396658008164">Увімкнути створення нотаток на заблокованому екрані</translation> <translation id="2037445849770872822">Для цього облікового запису Google налаштовано Батьківський контроль. Щоб налаштувати більше його параметрів, виберіть опцію "Продовжити". @@ -1847,6 +1851,7 @@ <translation id="2673135533890720193">Переглядати історію веб-перегляду</translation> <translation id="2674764818721168631">Вимкнено</translation> <translation id="2678063897982469759">Знову ввімкнути</translation> +<translation id="2678100101831051676">Не вдалося транслювати.</translation> <translation id="268053382412112343">Іс&торія</translation> <translation id="2681124317993121768">Гостьові профілі не підтримуються</translation> <translation id="2682498795777673382">Батьки змінили налаштування</translation> @@ -2556,6 +2561,7 @@ <translation id="3363202073972776113">Цим новим профілем керуватиме ваша організація. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> <translation id="3364986687961713424">Від вашого адміністратора: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Використовуйте Ctrl або Alt</translation> +<translation id="3368586359109138591">Завантажуйте копію паролів, щоб використовувати їх в інших сервісах</translation> <translation id="3368922792935385530">Підключено</translation> <translation id="3369067987974711168">Показати більше дій для цього порту</translation> <translation id="3369624026883419694">-...</translation> @@ -2744,6 +2750,7 @@ <translation id="3532273508346491126">Керування синхронізацією</translation> <translation id="3532521178906420528">Встановлення з'єднання з мережею…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – звук вимкнено</translation> +<translation id="3536492240554502321">Ротація тонів</translation> <translation id="3537881477201137177">Це можна змінити пізніше в налаштуваннях</translation> <translation id="3538066758857505094">Не вдалося встановити Linux. Повторіть спробу.</translation> <translation id="354060433403403521">Адаптер змінного струму</translation> @@ -3069,6 +3076,7 @@ <translation id="383669374481694771">Це загальна інформація про цей пристрій і його використання (як-от дані про рівень заряду акумулятора, систему, історію додатків та помилки). Ці відомості використовуватимуться, щоб покращити Android, а деякі зведені дані корисні для додатків і партнерів Google, як-от розробників Android.</translation> <translation id="3838085852053358637">Не вдалося завантажити розширення</translation> <translation id="3838486795898716504">Інші <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Додавайте збережені паролі в Google Менеджер паролів</translation> <translation id="383891835335927981">Масштабування сайтів не змінено</translation> <translation id="3839509547554145593">Увімкнути прискорення прокрутки мишею</translation> <translation id="3839516600093027468">Завжди забороняти сайту <ph name="HOST" /> переглядати буфер обміну</translation> @@ -3881,6 +3889,7 @@ <translation id="4617019240346358451">Щоб використовувати розширення "<ph name="EXTENSION_NAME" />", оновіть сторінку</translation> <translation id="4617270414136722281">Параметри розширень</translation> <translation id="4617880081511131945">Не вдалося підключитися до телефона</translation> +<translation id="4618195822946934889">URL-адреса може містити лише символи ASCII</translation> <translation id="4619564267100705184">Підтвердити особу</translation> <translation id="4619615317237390068">Вкладки з інших пристроїв</translation> <translation id="4620809267248568679">Це налаштування встановлюється розширенням.</translation> @@ -4142,6 +4151,7 @@ <translation id="4871568871368204250">Вимкніть синхронізацію</translation> <translation id="4871719318659334896">Закрити групу</translation> <translation id="4872192066608821120">Щоб імпортувати паролі, виберіть файл CSV</translation> +<translation id="4872212987539553601">Налаштуйте шифрування на пристрої</translation> <translation id="4873312501243535625">Засіб перевірки медіафайлів</translation> <translation id="4876273079589074638">Допоможіть нашим розробникам вивчити та виправити аварійне завершення роботи. Опишіть усі свої дії. Кожна деталь важлива.</translation> <translation id="4876895919560854374">Блокувати чи розблоковувати екран</translation> @@ -5078,6 +5088,7 @@ <translation id="5800351251499368110">Закрити інструменти пошуку на бічній панелі. Інструменти пошуку відкрито на бічній панелі.</translation> <translation id="5801568494490449797">Налаштування</translation> <translation id="5804241973901381774">Дозволи</translation> +<translation id="5805268472388605531">Утримуйте комбінації клавіш, щоб переглянути діакритичні знаки та спеціальні символи</translation> <translation id="5805697420284793859">Диспетчер вікон</translation> <translation id="5806447147478173900">Загальний обсяг пам’яті, який використовують показані сайти: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (за умовчанням)</translation> @@ -5718,6 +5729,7 @@ <translation id="642469772702851743">Власник заблокував цей пристрій (серійний номер <ph name="SERIAL_NUMBER" />).</translation> <translation id="6425556984042222041">Швидкість синтезу мовлення</translation> <translation id="642729974267661262">Заборонено відтворювати звуки</translation> +<translation id="6427608534767366138">Для мережі "<ph name="NETWORK_ID" />" потрібна автентифікація проксі</translation> <translation id="6429384232893414837">Помилка оновлення</translation> <translation id="6430814529589430811">ASCII Base64-кодування, єдиний сертифікат</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> налаштує автоматичні оновлення для всіх користувачів цього комп'ютера.</translation> @@ -6442,6 +6454,7 @@ <translation id="7093220653036489319">Швидкі відповіді</translation> <translation id="7093416310351037609">З міркувань захисту даних адміністратор вашої організації вимагає, щоб дозволені завантажені файли зберігалися в обліковому записі організації в сервісі <ph name="WEB_DRIVE" />.</translation> <translation id="7093866338626856921">Обмінюватися даними з пристроями з назвами: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">Прийміть запит на трансляцію на пристрої "<ph name="DEVICE_NAME" />".</translation> <translation id="7098389117866926363">Пристрій, під’єднаний до порту USB-C (ліворуч на задній панелі)</translation> <translation id="7098447629416471489">Тут відображатимуться інші збережені пошукові системи</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{Вилучити додаток}one{Вилучити додатки}few{Вилучити додатки}many{Вилучити додатки}other{Вилучити додатки}}</translation> @@ -6542,6 +6555,7 @@ <translation id="7212097698621322584">Введіть поточний PIN-код, щоб змінити його. Якщо ви не знаєте його, необхідно скинути ключ безпеки, а тоді створити новий PIN-код.</translation> <translation id="7213903639823314449">Пошукова система, яка використовується в адресному рядку</translation> <translation id="721490496276866468">Імпортувати паролі</translation> +<translation id="7218514093816577632">Переконайтеся, що сповіщення ввімкнено на вашому пристрої "<ph name="DEVICE_NAME" />".</translation> <translation id="7219473482981809164">Ми виявили кілька профілів, які можна завантажити. Перш ніж продовжити, виберіть потрібний.</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{Немає ненадійних паролів}=1{1 ненадійний пароль}one{{NUM_WEAK} ненадійний пароль}few{{NUM_WEAK} ненадійні паролі}many{{NUM_WEAK} ненадійних паролів}other{{NUM_WEAK} ненадійного пароля}}</translation> <translation id="7220019174139618249">Не вдається експортувати паролі в папку "<ph name="FOLDER" />"</translation> @@ -7011,6 +7025,7 @@ <translation id="7664620655576155379">Непідтримуваний пристрій Bluetooth: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665082356120621510">Зарезервувати розмір</translation> <translation id="7665369617277396874">Додати обліковий запис</translation> +<translation id="766635563210446220">Не вдалось імпортувати паролі. Переконайтеся, що формат файлу <ph name="FILENAME" /> правильний. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Поверніть пристрій <ph name="DEVICE_TYPE" /> упродовж {NUM_WEEKS} тижня}one{Поверніть пристрій <ph name="DEVICE_TYPE" /> упродовж {NUM_WEEKS} тижня}few{Поверніть пристрій <ph name="DEVICE_TYPE" /> упродовж {NUM_WEEKS} тижнів}many{Поверніть пристрій <ph name="DEVICE_TYPE" /> упродовж {NUM_WEEKS} тижнів}other{Поверніть пристрій <ph name="DEVICE_TYPE" /> упродовж {NUM_WEEKS} тижня}}</translation> <translation id="7668423670802040666">У Менеджері паролів Google для облікового запису <ph name="ACCOUNT" /></translation> <translation id="7668648754769651616">Функції спеціальних можливостей полегшують користування пристроєм. Щоб відкрити швидкі налаштування, натисніть час унизу екрана.</translation> @@ -7543,6 +7558,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{відео}one{# відео}few{# відео}many{# відео}other{# відео}}</translation> <translation id="8143442547342702591">Недійсний додаток</translation> <translation id="8143609395536282994">Як ви можете керувати своїми даними</translation> +<translation id="8145170459658034418">Заощадження пам’яті</translation> <translation id="8146177459103116374">Якщо ви вже зареєструвалися на цьому пристрої, можна <ph name="LINK2_START" />ввійти як існуючий користувач<ph name="LINK2_END" /> .</translation> <translation id="8146287226035613638">Додайте та впорядкуйте бажані мови. Текст на веб-сайтах відображатиметься ними, коли буде така можливість. Ці параметри синхронізуються з налаштуваннями веб-переглядача. <ph name="BEGIN_LINK_LEARN_MORE" />Докладніше<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Помилка під час входу. Зв’яжіться з адміністратором або повторіть спробу.</translation> @@ -7602,6 +7618,7 @@ <translation id="8198456017687137612">Трансляція вкладки</translation> <translation id="8199300056570174101">Параметри мережі (служби) і пристрою</translation> <translation id="8200772114523450471">Відновити</translation> +<translation id="8200789660596905522">Переконайтеся, що ви прийняли запит на трансляцію на пристрої "<ph name="DEVICE_NAME" />".</translation> <translation id="8202160505685531999">Щоб оновити профіль <ph name="DEVICE_TYPE" />, введіть пароль ще раз.</translation> <translation id="8203152941016626022">Назва пристрою для функції "Передавання поблизу".</translation> <translation id="8203732864715032075">Надсилає сповіщення й за умовчанням зберігає цей комп’ютер у додатку Повідомлення. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> @@ -7853,6 +7870,7 @@ <translation id="844063558976952706">Завжди на цьому сайті</translation> <translation id="8441313165929432954">Увімкнути/вимкнути використання телефона як модема</translation> <translation id="8443795068008423036">Переконайтеся, що пристрій оновлений, і повторіть спробу</translation> +<translation id="8443986842926457191">URL-адреса містить більше ніж 2048 символів</translation> <translation id="8446884382197647889">Докладніше</translation> <translation id="8447409163267621480">Натискайте Ctrl або Alt</translation> <translation id="844850004779619592">Команди не знайдено</translation> @@ -7918,6 +7936,7 @@ <translation id="851263357009351303">Завжди дозволяти хосту <ph name="HOST" /> показувати зображення</translation> <translation id="8513108775083588393">Автообертання</translation> <translation id="8514746246728959655">Спробуйте інший ключ безпеки</translation> +<translation id="8519895319663397036">Не вдалось імпортувати паролі. Розмір файлу не має перевищувати 150 КБ.</translation> <translation id="8523493869875972733">Залишити зміни</translation> <translation id="8523849605371521713">Додано політикою</translation> <translation id="8524783101666974011">Збережіть картки в обліковому записі Google</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 8ea4a50..9a7fad7 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">وقفے کا وقت تقریباً ہو گیا ہے</translation> <translation id="1062628064301375934">مزید نجی ویب بنانے میں ہماری مدد کریں</translation> <translation id="1067048845568873861">بنائی گئی</translation> +<translation id="1067661089446014701">اضافی حفاظت کے لیے، آپ اپنے آلہ پر پاس ورڈز کو اپنے Google اکاؤنٹ میں محفوظ کرنے سے پہلے مرموز کر سکتے ہیں</translation> <translation id="1067922213147265141">دیگر Google سروسز</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> نام والی eSIM پروفائل کو ہٹائیں</translation> <translation id="1070377999570795893">آپ کے کمپیوٹر پر موجود کسی دوسرے پروگرام نے ایک ایکسٹینشن شامل کیا ہے جو Chrome کے کام کرنے کا طریقہ تبدیل کر سکتا ہے۔ @@ -249,6 +250,7 @@ <translation id="1223853788495130632">آپ کا منتظم اس ترتیب کیلئے ایک مخصوص قدر کی تجویز کرتا ہے۔</translation> <translation id="1225177025209879837">درخواست پر کارروائی کی جا رہی ہے…</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />" سے منسلک کیے جانے کے دوران توثیق ناکام ہو گئی۔</translation> +<translation id="1227993798763400520">کاسٹ کرنے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔</translation> <translation id="1230417814058465809">معیاری تحفظ آن ہے۔ اور بھی مزید سیکیورٹی کے لیے، بہتر تحفظ کا استعمال کریں۔</translation> <translation id="1231733316453485619">مطابقت پذیری آن کریں؟</translation> <translation id="1232569758102978740">بلا عنوان</translation> @@ -1113,6 +1115,7 @@ <translation id="2031914984822377766">اپنی ترجیحی <ph name="LINK_BEGIN" />ویب سائٹ کی زبانیں<ph name="LINK_END" /> شامل کریں۔ فہرست میں سرفہرست زبان ترجمے کے لیے استعمال کی جائے گی۔</translation> <translation id="2033758234986231162">آپ کے فون کے ساتھ کنکشن برقرار نہیں رکھا جا سکتا۔ یقینی بنائیں کہ آپ کا فون قریب ہے، غیر مقفل ہے، اور بلوٹوتھ اور Wi-Fi آن ہیں۔</translation> <translation id="2034346955588403444">دوسرا WiFi نیٹ ورک شامل کریں</translation> +<translation id="2035211704574173780">سرمئی اسکیل</translation> <translation id="203574396658008164">مقفل اسکرین سے نوٹ لینا فعال کریں</translation> <translation id="2037445849770872822">اس Google اکاؤنٹ کیلئے نگرانی ترتیب دے دی گئی ہے۔ مزید پیرنٹل کنٹرولز ترتیب دینے کیلئے، 'جاری رکھیں' منتخب کریں۔ @@ -2542,6 +2545,7 @@ <translation id="3363202073972776113">آپ کی تنظیم اس نئی پروفائل کا نظم کرے گی۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="3364986687961713424">آپ کے منتظم کی جانب سے: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl یا Alt کا استعمال کریں</translation> +<translation id="3368586359109138591">دوسری جگہ استعمال کرنے کے لیے ایک کاپی ڈاؤن لوڈ کریں</translation> <translation id="3368922792935385530">منسلک</translation> <translation id="3369067987974711168">اس پورٹ کے ليے مزید کارروائیاں دکھائیں</translation> <translation id="3369624026883419694">میزبان کو حل کیا جا رہا ہے…</translation> @@ -2730,6 +2734,7 @@ <translation id="3532273508346491126">مینیجمنٹ کو مطابقت پذیر بنائیں</translation> <translation id="3532521178906420528">نیٹ ورک کنکشن تشکیل دیا جا رہا ہے…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - آڈیو خاموش ہے</translation> +<translation id="3536492240554502321">ہیو کی گردش</translation> <translation id="3537881477201137177">اس کو بعد میں ترتیبات میں تبدیل کیا جا سکتا ہے</translation> <translation id="3538066758857505094">Linux ان انسٹال کرنے میں خرابی پیش آ گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔</translation> <translation id="354060433403403521">AC اڈاپٹر</translation> @@ -3055,6 +3060,7 @@ <translation id="383669374481694771">یہ اس آلہ اور اس کے استعمال کیے جانے (جیسے بیٹری کی سطح، سسٹم، ایپ کی سرگرمی اور خرابیوں) کے بارے میں ایک عام معلومات ہے۔ Android کو بہتر بنانے کی خاطر ڈیٹا کا استعمال کیا جائے گا، اور کچھ مجموعی معلومات سے Google ایپس اور پارٹنرز، جیسے کہ Android ڈیولپرز، کو ان کی ایپس اور پروڈکٹس کو بہتر بنانے میں بھی مدد ملے گی۔</translation> <translation id="3838085852053358637">ایکسٹیشن لوڈ کرنے میں ناکام</translation> <translation id="3838486795898716504">مزید <ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">Google پاس ورڈ مینیجر میں محفوظ کردہ پاس ورڈز شامل کریں</translation> <translation id="383891835335927981">کسی بھی سائٹ کو زوم ان یا زوم آؤٹ نہیں کیا گیا ہے</translation> <translation id="3839509547554145593">ماؤس کے اسکرول ایکسلریٹر کو فعال کریں</translation> <translation id="3839516600093027468">کلپ بورڈ کو دیکھنے سے <ph name="HOST" /> کو ہمیشہ مسدود کریں</translation> @@ -4128,6 +4134,7 @@ <translation id="4871568871368204250">مطابقت پذیری آف کریں</translation> <translation id="4871719318659334896">گروپ بند کریں</translation> <translation id="4872192066608821120">پاس ورڈز درآمد کرنے کے لیے، ایک CSV فائل منتخب کریں</translation> +<translation id="4872212987539553601">آلے پر مرموز کاری سیٹ اپ کریں</translation> <translation id="4873312501243535625">میڈیا فائل چیکر</translation> <translation id="4876273079589074638">ہمارے انجینئروں کو تفتیش اور اس ناکامی کو حل کرنے میں مدد کریں۔ اگر آپ قطعی مراحل کی فہرست بنا سکتے ہیں تو بنائیں۔ کوئی بھی تفصیل بہت چھوٹی نہیں ہے!</translation> <translation id="4876895919560854374">اسکرین کو مقفل اور غیر مقفل کریں</translation> @@ -6426,6 +6433,7 @@ <translation id="7093220653036489319">فوری جوابات</translation> <translation id="7093416310351037609">ڈیٹا کی حفاظت اور سیکیورٹی کے لیے، آپ کی تنظیم کا تقاضا ہے کہ سبھی اہل ڈاؤن لوڈز آپ کی تنظیم کے <ph name="WEB_DRIVE" /> اکاؤنٹ میں محفوظ کیے جائیں۔</translation> <translation id="7093866338626856921">نام والے آلات کے ساتھ ڈیٹا کا تبادلہ کریں: <ph name="HOSTNAMES" /></translation> +<translation id="7094680343477712655">اپنے <ph name="DEVICE_NAME" /> پر کاسٹ کرنے کی درخواست قبول کریں</translation> <translation id="7098389117866926363">USB-C آلہ (پیچھے موجود بایاں پورٹ)</translation> <translation id="7098447629416471489">محفوظ کردہ دیگر سرچ انجن یہاں ظاہر ہوں گے</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{ایپ ہٹائیں}other{ایپس ہٹائیں}}</translation> @@ -6526,6 +6534,7 @@ <translation id="7212097698621322584">PIN تبدیل کرنے کیلئے، اپنا موجودہ PIN درج کریں۔ اگر آپ کو اپنا PIN نہیں معلوم ہے تو آپ کو پہلے اپنی سیکیورٹی کلید دوبارہ ترتیب دینی ہوگی اور پھر ایک نیا PIN تخلیق کرنا ہوگا۔</translation> <translation id="7213903639823314449">پتہ بار میں سرچ انجن کا استعمال کیا جاتا ہے</translation> <translation id="721490496276866468">پاس ورڈز درآمد کریں</translation> +<translation id="7218514093816577632">یقینی بنائیں کہ آپ کے <ph name="DEVICE_NAME" /> پر اطلاعات آن ہیں۔</translation> <translation id="7219473482981809164">ہمیں ڈاؤن لوڈ کے لیے متعدد دستیاب پروفائلز ملی ہیں۔ آگے بڑھنے سے پہلے اس ایک کو منتخب کریں جسے آپ ڈاؤن لوڈ کرنا چاہتے ہیں۔</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{کوئی کمزور پاس ورڈ نہیں}=1{1 کمزور پاس ورڈ}other{{NUM_WEAK} کمزور پاس ورڈز}}</translation> <translation id="7220019174139618249">پاس ورڈ کو "<ph name="FOLDER" />" پر برآمد نہیں کر سکتے</translation> @@ -6995,6 +7004,7 @@ <translation id="7664620655576155379">غیر تعاون یافتہ بلوٹوتھ آلہ: "<ph name="DEVICE_NAME" />"۔</translation> <translation id="7665082356120621510">سائز ریزرو کریں</translation> <translation id="7665369617277396874">اکاؤنٹ شامل کریں</translation> +<translation id="766635563210446220">پاس ورڈز درآمد کرنے سے قاصر۔ <ph name="FILENAME" /> چیک کریں اور یقینی بنائیں کہ اسے درست طریقے سے فارمیٹ کیا گیا ہے۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> {NUM_WEEKS} ہفتے کے اندر واپس کریں}other{<ph name="DEVICE_TYPE" /> {NUM_WEEKS} ہفتوں کے اندر واپس کریں}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" /> کے لیے Google پاس ورڈ مینیجر میں</translation> <translation id="7668648754769651616">ایکسیسبیلٹی خصوصیات آپ کے آلے کو استعمال میں آسان تر بناتا ہے۔ فوری ترتیبات تک رسائی حاصل کرنے کے لیے، اپنی اسکرین کے نیچے وقت کا انتخاب کریں۔</translation> @@ -7525,6 +7535,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{ایک ویڈیو}other{# ویڈیوز}}</translation> <translation id="8143442547342702591">غلط ایپلیکیشن</translation> <translation id="8143609395536282994">آپ اپنے ڈیٹا کا نظم کیسے کر سکتے ہیں:</translation> +<translation id="8145170459658034418">میموری سیور</translation> <translation id="8146177459103116374">اگر آپ پہلے ہی اس آلہ پر رجسٹر ہو گئے ہیں تو آپ <ph name="LINK2_START" />ایک موجودہ صارف کے بطور سائن ان<ph name="LINK2_END" /> کر سکتے ہیں۔</translation> <translation id="8146287226035613638">اپنی ترجیحی زبانیں شامل کریں اور انہیں زمرہ بند کریں۔ ممکن ہونے پر ویب سائٹس آپ کی ترجیحی زبانوں میں دکھائی دیں گی۔ یہ ترجیحات آپ کے براؤزر کی ترتیبات کے ساتھ مطابقت پذیر ہیں۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">سائن ان ناکام ہوگیا۔ براہ کرم اپنے منتظم سے رابطہ کریں یا دوبارہ کوشش کریں۔</translation> @@ -7584,6 +7595,7 @@ <translation id="8198456017687137612">کاسٹنگ ٹیب</translation> <translation id="8199300056570174101">نیٹ ورک (سروس) اور آلہ کی خصوصیات</translation> <translation id="8200772114523450471">دوبارہ شروع کریں</translation> +<translation id="8200789660596905522">اپنے <ph name="DEVICE_NAME" /> پر کاسٹ کرنے کی درخواست کو قبول کرنا یقینی بنائیں</translation> <translation id="8202160505685531999">اپنا <ph name="DEVICE_TYPE" /> پروفائل اپ ڈيٹ کرنے کیلئے براہ کرم اپنا پاس ورڈ دوبارہ درج کریں۔</translation> <translation id="8203152941016626022">قریبی آلات کے ساتھ اشتراک کے آلے کا نام</translation> <translation id="8203732864715032075">آپ کو اطلاعات بھیجتی ہے اور "پیغامات" کیلئے اس کمپیوٹر کو یاد رکھنے پر ڈیفالٹ کرتی ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index abda8537..d7a33b1 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -2176,6 +2176,7 @@ <translation id="2977480621796371840">Guruhdan chiqarish</translation> <translation id="2979639724566107830">Yangi oynada ochish</translation> <translation id="2981113813906970160">Sichqonchaning katta kursorini ko‘rsatish</translation> +<translation id="2981293774053328982">Bu fayl tarkibida shaxsiy yoki ijtimoiy tarmoq hisoblaringizni oshkor qilishi mumkin zararli kod mavjud.</translation> <translation id="2983373101216420412">Quti batareya quvvati: <ph name="PERCENTAGE" />%.</translation> <translation id="2985348301114641460">Administratorga “<ph name="EXTENSION_NAME" />” kengaytmasini oʻrnatish talabi yuborilsinmi?</translation> <translation id="2987620471460279764">Boshqa qurilmadan ulashilgan matn</translation> @@ -3761,6 +3762,7 @@ <translation id="4514610446763173167">Videoni ijro yoki pauza qilish</translation> <translation id="451515744433878153">Olib tashlash</translation> <translation id="4515872537870654449">Yordam uchun Dell kompaniyasiga murojaat qiling. Ventilyator ishlamasa, dok avtomatik oʻchadi.</translation> +<translation id="4518840066030486079">Shift tugmasi modifikatori uslubi</translation> <translation id="4519331665958994620">Saytlar kameradan foydalanishga ruxsat soʻrashi mumkin</translation> <translation id="4519935350946509010">Ulanish xatoligi.</translation> <translation id="4520385623207007473">Cookie fayllaridan foydalanish</translation> @@ -3856,6 +3858,7 @@ <translation id="4598345735110653698">Kodlarni boshqarish</translation> <translation id="4598556348158889687">Xotira boshqaruvi</translation> <translation id="4598776695426288251">Bir nechta qurilmalar tarqatayotgan Wi-Fi tarmoqlar mavjud</translation> +<translation id="4600071396330666617">Takliflar soni</translation> <translation id="4601426376352205922">Oʻqilmagan deb belgilash</translation> <translation id="4602466770786743961"><ph name="HOST" /> saytiga kamera va mikrofondan foydalanishga har doim ruxsat berilsin</translation> <translation id="4606551464649945562">Saytlarga atrofingiz 3D xaritasini yaratish yoki kamera holatini kuzatishni taqiqlash</translation> @@ -4302,6 +4305,7 @@ <translation id="5043913660911154449">Yoki printeringiz PPD faylini tanlang <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Parol noto‘g‘ri</translation> <translation id="504561833207953641">Mavjud brauzer seansida ochilmoqda.</translation> +<translation id="5049614114599109018">Kiritish tarixidan foydalanilsin</translation> <translation id="5051836348807686060">Tanlangan tilda imlo tekshirilmaydi</translation> <translation id="5052499409147950210">Saytni tahrirlash</translation> <translation id="505347685865235222">Nomsiz guruh – <ph name="GROUP_CONTENT_STRING" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 52c93ac..8a03449a 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -69,6 +69,7 @@ <translation id="1061904396131502319">快到休息時間了</translation> <translation id="1062628064301375934">協助我們建立更私密的網絡</translation> <translation id="1067048845568873861">已建立</translation> +<translation id="1067661089446014701">為進一步加強安全性,建議先在裝置上將密碼加密,再儲存至您的 Google 帳戶</translation> <translation id="1067922213147265141">其他 Google 服務</translation> <translation id="1069355737714877171">移除叫做「<ph name="PROFILE_NAME" />」嘅 eSIM 卡設定檔</translation> <translation id="1070377999570795893">電腦中其他程式所新增的擴充功能可能會變更 Chrome 的運作方式。 @@ -251,6 +252,7 @@ <translation id="1223853788495130632">管理員為這項設定推薦特定的值。</translation> <translation id="1225177025209879837">正在處理要求…</translation> <translation id="1227507814927581609">驗證在連線至「<ph name="DEVICE_NAME" />」時失敗。</translation> +<translation id="1227993798763400520">無法投放,請再試一次。</translation> <translation id="1230417814058465809">已開啟「標準保護功能」。如要進一步提升安全性,請使用「強化保護功能」。</translation> <translation id="1231733316453485619">要開啟同步處理功能嗎?</translation> <translation id="1232569758102978740">無標題</translation> @@ -695,6 +697,7 @@ <translation id="1640283014264083726">PKCS #1 MD4 (使用 RSA 加密)</translation> <translation id="1641113438599504367">安全瀏覽</translation> <translation id="1641496881756082050">可以對 <ph name="NETWORK_NAME" /> 執行的其他操作</translation> +<translation id="1641884605525735390">{NUM_PASSWORDS,plural, =1{由於另外 1 個密碼的格式不正確,因此無法匯入}other{由於另外 {NUM_PASSWORDS} 個密碼的格式不正確,因此無法匯入}}</translation> <translation id="1642492862748815878">已連線至「<ph name="DEVICE" />」和另外 <ph name="NUMBER_OF_DEVICES" /> 部藍牙裝置</translation> <translation id="1642494467033190216">如要啟用其他偵錯功能,您必須先移除 rootfs 保護並重新啟動。</translation> <translation id="1643072738649235303">使用 SHA-1 的 X9.62 ECDSA 簽名</translation> @@ -1124,6 +1127,7 @@ <translation id="2031914984822377766">新增偏好的<ph name="LINK_BEGIN" />網站語言<ph name="LINK_END" />。系統會將文字翻譯成清單頂部的語言。</translation> <translation id="2033758234986231162">無法與您的手機維持連線狀態。請確認您的手機在附近且已解鎖,並已開啟藍牙和 Wi-Fi。</translation> <translation id="2034346955588403444">新增其他 Wi-Fi 網絡</translation> +<translation id="2035211704574173780">灰階</translation> <translation id="203574396658008164">從上鎖畫面啟用筆記功能</translation> <translation id="2037445849770872822">您已設定此 Google 帳戶的監控功能。如要設定更多家長監控設定,請選取 [繼續]。 @@ -1844,6 +1848,7 @@ <translation id="2673135533890720193">讀取您的瀏覽記錄</translation> <translation id="2674764818721168631">關閉</translation> <translation id="2678063897982469759">重新啟用</translation> +<translation id="2678100101831051676">無法投放。</translation> <translation id="268053382412112343">記錄(&S)</translation> <translation id="2681124317993121768">不支援訪客設定檔</translation> <translation id="2682498795777673382">您的家長已更新設定</translation> @@ -2553,6 +2558,7 @@ <translation id="3363202073972776113">此新設定檔將由您的機構管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="3364986687961713424">來自管理員的訊息:<ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">使用 Ctrl 或 Alt 鍵</translation> +<translation id="3368586359109138591">下載副本以便在其他地方使用</translation> <translation id="3368922792935385530">已連線</translation> <translation id="3369067987974711168">顯示呢個連接埠嘅更多操作</translation> <translation id="3369624026883419694">正在解析主機…</translation> @@ -2741,6 +2747,7 @@ <translation id="3532273508346491126">同步管理</translation> <translation id="3532521178906420528">正在建立網絡連線…</translation> <translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - 靜音</translation> +<translation id="3536492240554502321">色調旋轉</translation> <translation id="3537881477201137177">您可稍後在「設定」再作修改</translation> <translation id="3538066758857505094">解除安裝 Linux 時發生錯誤。請再試一次。</translation> <translation id="354060433403403521">充電火牛</translation> @@ -3066,6 +3073,7 @@ <translation id="383669374481694771">這個選項會提供此裝置的一般資料和使用情况 (例如電量、系統及應用程式活動和錯誤)。這些資料將會用來改善 Android。部分彙整資料還能協助 Google 應用程式和合作夥伴 (例如 Android 開發人員) 改良應用程式和產品。</translation> <translation id="3838085852053358637">無法載入擴充程式</translation> <translation id="3838486795898716504">更多<ph name="PAGE_TITLE" /></translation> +<translation id="3838487810283346084">將已儲存的密碼加入「Google 密碼管理工具」</translation> <translation id="383891835335927981">沒有已放大或縮小的網站</translation> <translation id="3839509547554145593">啟用滑鼠捲動加速功能</translation> <translation id="3839516600093027468">一律禁止 <ph name="HOST" /> 查看剪貼簿</translation> @@ -3878,6 +3886,7 @@ <translation id="4617019240346358451">重新載入頁面以使用「<ph name="EXTENSION_NAME" />」</translation> <translation id="4617270414136722281">擴充程式選項</translation> <translation id="4617880081511131945">無法建立連線</translation> +<translation id="4618195822946934889">網址只可包含 ASCII 字元</translation> <translation id="4619564267100705184">驗證身分</translation> <translation id="4619615317237390068">在其他裝置上開啟的分頁</translation> <translation id="4620809267248568679">這項設定是由擴充功能執行。</translation> @@ -4139,6 +4148,7 @@ <translation id="4871568871368204250">關閉同步處理功能</translation> <translation id="4871719318659334896">關閉群組</translation> <translation id="4872192066608821120">如要匯入密碼,請選取 CSV 檔案</translation> +<translation id="4872212987539553601">設定裝置上加密功能</translation> <translation id="4873312501243535625">媒體檔案檢查工具</translation> <translation id="4876273079589074638">協助我們的軟件工程師調查和修正此當機問題。請盡可能列出所有實際步驟,越詳細越好!</translation> <translation id="4876895919560854374">鎖定和解鎖屏幕</translation> @@ -5075,6 +5085,7 @@ <translation id="5800351251499368110">閂側面板入面嘅搜尋工具列。側面板入面嘅搜尋工具列開咗。</translation> <translation id="5801568494490449797">偏好設定</translation> <translation id="5804241973901381774">權限</translation> +<translation id="5805268472388605531">按住鍵盤按鍵以查看重音標記和特殊字元</translation> <translation id="5805697420284793859">視窗管理員</translation> <translation id="5806447147478173900">已顯示網站使用的總儲存空間:<ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (預設)</translation> @@ -5716,6 +5727,7 @@ <translation id="642469772702851743">這部裝置 (序號:<ph name="SERIAL_NUMBER" />) 已被其擁有者上鎖。</translation> <translation id="6425556984042222041">「文字轉語音」語速</translation> <translation id="642729974267661262">不允許播放音效</translation> +<translation id="6427608534767366138">「<ph name="NETWORK_ID" />」需要 Proxy 驗證</translation> <translation id="6429384232893414837">更新錯誤</translation> <translation id="6430814529589430811">Base64 編碼 ASCII,單一憑證</translation> <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> 將為這部電腦的所有使用者設定自動更新。</translation> @@ -6434,6 +6446,7 @@ <translation id="7093220653036489319">快速解答</translation> <translation id="7093416310351037609">為了保護資料和系統安全,您的機構要求將所有符合資格的下載項目儲存到機構的「<ph name="WEB_DRIVE" />」帳戶。</translation> <translation id="7093866338626856921">與名稱為「<ph name="HOSTNAMES" />」的裝置交換數據</translation> +<translation id="7094680343477712655">請在「<ph name="DEVICE_NAME" />」上接受投放要求。</translation> <translation id="7098389117866926363">USB-C 裝置 (後方左側連接埠)</translation> <translation id="7098447629416471489">已儲存的搜尋引擎將會在這裡顯示</translation> <translation id="7098936390718461001">{NUM_APPS,plural, =1{移除應用程式}other{移除應用程式}}</translation> @@ -6534,6 +6547,7 @@ <translation id="7212097698621322584">請輸入目前的 PIN 以進行變更。如果您不知道自己的 PIN,請重設安全密鑰,然後建立新的 PIN。</translation> <translation id="7213903639823314449">網址列中使用的搜尋引擎</translation> <translation id="721490496276866468">匯入密碼</translation> +<translation id="7218514093816577632">確認「<ph name="DEVICE_NAME" />」已開啟通知功能。</translation> <translation id="7219473482981809164">我們發現多個設定檔可供下載。請先選取�要下載的設定檔再繼續。</translation> <translation id="7219762788664143869">{NUM_WEAK,plural, =0{沒有安全性弱的密碼}=1{1 個安全性弱的密碼}other{{NUM_WEAK} 個安全性弱的密碼}}</translation> <translation id="7220019174139618249">無法將密碼匯出至「<ph name="FOLDER" />」</translation> @@ -6723,6 +6737,7 @@ <translation id="7404065585741198296">連接 USB 連接線的手機</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{1 小時前已執行安全檢查}other{{NUM_HOURS} 小時前已執行安全檢查}}</translation> <translation id="740624631517654988">已封鎖彈出式視窗</translation> +<translation id="7406912950279255498">色彩反轉模式</translation> <translation id="7407430846095439694">匯入並繫結</translation> <translation id="7407504355934009739">大多數使用者封鎖了此網站傳送的通知</translation> <translation id="740810853557944681">新增列印伺服器</translation> @@ -7003,6 +7018,7 @@ <translation id="7664620655576155379">不支援的藍牙裝置:「<ph name="DEVICE_NAME" />」。</translation> <translation id="7665082356120621510">預留空間大小</translation> <translation id="7665369617277396874">新增帳戶</translation> +<translation id="766635563210446220">無法匯入密碼,請檢查「<ph name="FILENAME" />」的格式是否正確。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{在 {NUM_WEEKS} 星期內歸還 <ph name="DEVICE_TYPE" />}other{在 {NUM_WEEKS} 星期內歸還 <ph name="DEVICE_TYPE" />}}</translation> <translation id="7668423670802040666">前往 <ph name="ACCOUNT" /> 的「Google 密碼管理工具」進行更新</translation> <translation id="7668648754769651616">無障礙功能讓裝置更易用。如要存取「快速設定」,請選取畫面底部的時間。</translation> @@ -7535,6 +7551,7 @@ <translation id="814204052173971714">{COUNT,plural, =1{1 部影片}other{# 部影片}}</translation> <translation id="8143442547342702591">無效的應用程式</translation> <translation id="8143609395536282994">您可透過哪些方式管理資料:</translation> +<translation id="8145170459658034418">記憶體節省模式</translation> <translation id="8146177459103116374">如果您已在這部裝置上註冊,您可以<ph name="LINK2_START" />用現有的使用者身分登入<ph name="LINK2_END" />。</translation> <translation id="8146287226035613638">新增偏好語言及指定各語言的優先次序。網站會按情況以您偏好的語言顯示內容。這些偏好設定會與您的瀏覽器設定同步。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">登入失敗,請與您的管理員聯絡或再試一次。</translation> @@ -7594,6 +7611,7 @@ <translation id="8198456017687137612">正在投放分頁</translation> <translation id="8199300056570174101">網絡 (服務) 和裝置屬性元件</translation> <translation id="8200772114523450471">繼續</translation> +<translation id="8200789660596905522">請確保在「<ph name="DEVICE_NAME" />」上接受投放要求。</translation> <translation id="8202160505685531999">請重新輸入密碼以更新 <ph name="DEVICE_TYPE" /> 的個人檔案。</translation> <translation id="8203152941016626022">「咫尺共享」裝置名稱</translation> <translation id="8203732864715032075">讓「訊息」向您傳送通知並預設記住這台電腦<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> @@ -7670,6 +7688,7 @@ <ph name="BEGIN_PARAGRAPH3" />擁有者可前往「設定」>「進階」>「自動將診斷和使用情況資料傳送給 Google」,以控制此功能。<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />如果您已為子女開啟其他「網絡及應用程式活動記錄」設定,此資料可能會儲存在他們的 Google 帳戶中。您可以前往 families.google.com 瞭解這些設定的詳情和調整方法。<ph name="END_PARAGRAPH4" /></translation> <translation id="826905130698769948">用戶端憑證無效</translation> +<translation id="8270162672241199380">Steam 安裝程式</translation> <translation id="827097179112817503">顯示 [主頁] 按鈕</translation> <translation id="8271268254812352141">按住文字或在文字上按一下右鍵後,就能取得定義、翻譯或單位轉換結果。請在<ph name="LINK_BEGIN" />網站語言<ph name="LINK_END" />中自訂翻譯語言。</translation> <translation id="8271379370373330993">後續幾個步驟須由家長完成。您可在帳戶設定後將 <ph name="DEVICE_TYPE" /> 交還給子女。</translation> @@ -7845,6 +7864,7 @@ <translation id="844063558976952706">永遠在這個網站上使用</translation> <translation id="8441313165929432954">啟用/停用網絡共享</translation> <translation id="8443795068008423036">請確保裝置為最新版本,然後再試一次</translation> +<translation id="8443986842926457191">網址超過 2048 個字元</translation> <translation id="8446884382197647889">瞭解詳情</translation> <translation id="8447409163267621480">必須以 Ctrl 或 Alt 鍵開頭</translation> <translation id="844850004779619592">找不到指令</translation> @@ -7910,6 +7930,7 @@ <translation id="851263357009351303">永遠允許 <ph name="HOST" /> 顯示圖片</translation> <translation id="8513108775083588393">自動旋轉</translation> <translation id="8514746246728959655">請改用其他安全密鑰</translation> +<translation id="8519895319663397036">無法匯入密碼,檔案大小不得超過 150 KB。</translation> <translation id="8523493869875972733">保留變更</translation> <translation id="8523849605371521713">由政策新增</translation> <translation id="8524783101666974011">將各卡儲存至 Google 帳戶</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index f9d8ee5f..741b2d2 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -278,6 +278,7 @@ <translation id="6735387454586646204">የChromeOS Flex ስርዓት</translation> <translation id="6739177684496155661">በአዲሱ የChrome መገለጫ ውስጥ ይቀጥል?</translation> <translation id="6750954913813541382">የሥርዓተ ሆሄ ህጸሶችን ለማስተካከል እርስዎን የሚተይቡትን ጽሁፍ Chrome ወደ Google በአሳሽ ውስጥ ይልካል</translation> +<translation id="6756581345161130259">እንደ አስፈላጊነቱ Chrome በንቃት የማይጠቀሟቸውን ትሮች ማህደረ ትውስታ መልሶ ይወስዳል። ይህንን በማንኛውም ጊዜ በቅንብሮች ውስጥ መቀየር ይችላሉ።</translation> <translation id="677276454032249905">የሆነው ሆኖ ከChrome ይወጣ?</translation> <translation id="6785872064505734160">በChrome ውስጥ Google ረዳት በመላ ድር ጣቢያዎች ላይ ለእርስዎ እርምጃዎችን ማጠናቀቅ ይችላል</translation> <translation id="683440813066116847">Google Chrome Canary ለmDNS ትራፊክ ለመፍቀድ የውስጥ ደንብ።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index fc51c2f..aeddfbd 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -59,6 +59,7 @@ <translation id="2094648590148273905">أحكام نظام التشغيل ChromeOS Flex</translation> <translation id="2094919256425865063">هل تريد الخروج من Chrome على أي حال؟</translation> <translation id="2106831557840787829">أصبح نظام التشغيل ChromeOS Flex متاحًا من خلال <ph name="BEGIN_LINK_CROS_OSS" />برنامج إضافي مفتوح المصدر<ph name="END_LINK_CROS_OSS" />، كما هو الحال في <ph name="BEGIN_LINK_LINUX_OSS" />بيئة تطوير نظام التشغيل Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">عند تفعيل هذا الإعداد، يستعيد Chrome الذاكرة من علامات التبويب غير النشطة. يؤدي هذا إلى توفير بعض موارد جهاز الكمبيوتر لتنفيذ مهام أخرى والحفاظ على سرعة الأداء في Chrome. وتظهر علامات التبويب غير النشطة فارغة وتتم إعادة تحميلها تلقائيًا عند النقر عليها. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /> أو <ph name="BEGIN_LINK_2" />إرسال ملاحظات<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">سيعمل هذا على حذف <ph name="ITEMS_COUNT" /> من العناصر من هذا الجهاز. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome كـ <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">إعادة تشغيل متصفِّح Chrome لتحديثه</translation> <translation id="2123055963409958220">يمكنك المساعدة في تحسين Chrome بالإبلاغ عن <ph name="BEGIN_LINK" />الإعدادات الحالية<ph name="END_LINK" /></translation> @@ -275,6 +276,7 @@ <translation id="6735387454586646204">نظام التشغيل ChromeOS Flex</translation> <translation id="6739177684496155661">هل تريد المتابعة باستخدام ملف شخصي جديد على Chrome؟</translation> <translation id="6750954913813541382">لإصلاح الأخطاء الإملائية، يرسِل Chrome النص الذي تكتبه في المتصفّح إلى Google.</translation> +<translation id="6756581345161130259">حسب الحاجة، يستعيد Chrome الذاكرة من علامات التبويب غير النشطة. يمكنك تعديل ذلك في أي وقت من خلال الإعدادات.</translation> <translation id="677276454032249905">هل تريد الخروج من Chrome على أي حال؟</translation> <translation id="6785872064505734160">بإمكان "مساعد Google" في Chrome إكمال الإجراءات التي تريدها على المواقع الإلكترونية.</translation> <translation id="683440813066116847">قاعدة الوارد إلى Google Chrome Canary للسماح بحركة مرور mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 6bf3a60..dc7b609 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">ChromeOS Flexৰ চৰ্তাৱলী</translation> <translation id="2094919256425865063">যিকোনো প্ৰকাৰে Chrome বন্ধ কৰিবনে?</translation> <translation id="2106831557840787829"><ph name="BEGIN_LINK_LINUX_OSS" />Linux বিকাশৰ পৰিৱেশ<ph name="END_LINK_LINUX_OSS" />ৰ দৰে ChromeOS Flexক অতিৰিক্ত <ph name="BEGIN_LINK_CROS_OSS" />মুক্ত উৎসৰ ছফ্টৱেৰ<ph name="END_LINK_CROS_OSS" />ৰ দ্বাৰা তৈয়াৰ কৰা হৈছে।</translation> +<translation id="2112742052114331084">অন কৰা থকিলে, Chromeএ আপুনি সক্ৰিয়ভাৱে ব্যৱহাৰ কৰি নথকা টেবসমূহৰ পৰা মেম’ৰী পুনৰুদ্ধাৰ কৰে। ই আপোনাৰ কম্পিউটাৰৰ সম্পদসমূহ আন কাৰ্যসমূহৰ বাবে খালী কৰে আৰু Chromeক দ্ৰুত কৰি ৰাখে। নিষ্ক্ৰিয় টেবসমূহ খালী হৈ থকা দেখা পোৱা যায় আৰু আপুনি সেইসমূহত ক্লিক কৰিলে সেইসমূহ স্বয়ংক্ৰিয়ভাৱে পুনৰ ল’ড হয়। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /> অথবা <ph name="BEGIN_LINK_2" />মতামত পঠিয়াওক<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">ইয়াৰ ফলত এই ডিভাইচৰ পৰা <ph name="ITEMS_COUNT" />টা বস্তু মচা হ'ব। আপোনাৰ ডেটা পাছত পুনৰুদ্ধাৰ কৰিবলৈ Chromeত <ph name="USER_EMAIL" /> হিচাপে ছাইন ইন কৰক।</translation> <translation id="2121284319307530122">&Chrome আপডে'ট কৰিবলৈ পুনৰ লঞ্চ কৰক</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />বর্তমানৰ ছেটিংসমূহ<ph name="END_LINK" />ৰ সম্পর্কে প্ৰতিবেদন দি Chromeক উন্নত কৰাত সহায় কৰক</translation> @@ -279,6 +280,7 @@ <translation id="6735387454586646204">ChromeOS Flex ছিষ্টেম</translation> <translation id="6739177684496155661">এটা নতুন Chrome প্ৰ'ফাইলত অব্যাহত ৰাখিবনে?</translation> <translation id="6750954913813541382">Chromeএ বানানৰ আসোঁৱাহসমূহ আঁতৰাবলৈ আপুনি ব্ৰাউজাৰত টাইপ কৰা পাঠ Googleলৈ পঠিয়ায়</translation> +<translation id="6756581345161130259">প্ৰয়োজন অনুসৰি, Chromeএ আপুনি সক্ৰিয়ভাৱে ব্যৱহাৰ কৰি নথকা টেবসমূহৰ পৰা মেম’ৰী পুনৰুদ্ধাৰ কৰে। আপুনি যিকোনো সময়তে ছেটিঙত এইটো সলনি কৰিব পাৰে।</translation> <translation id="677276454032249905">যিকোনো প্ৰকাৰে Chrome বন্ধ কৰিবনে?</translation> <translation id="6785872064505734160">Chromeত Google Assistantএ আপোনাৰ বাবে সকলোবোৰ ৱেবছাইটত কার্যসমূহ সম্পূর্ণ কৰিব পাৰে</translation> <translation id="683440813066116847">mDNS ট্ৰেফিকক অনুমতি দিবলৈ Google Chrome বিটাৰ অন্তৰ্গামী নিয়ম।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 79bc523..3ed04560 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -59,6 +59,7 @@ <translation id="2094648590148273905">Общи условия на ChromeOS Flex</translation> <translation id="2094919256425865063">Искате ли да затворите Chrome въпреки това?</translation> <translation id="2106831557840787829">ChromeOS Flex съществува благодарение на допълнителен <ph name="BEGIN_LINK_CROS_OSS" />софтуер с отворен код<ph name="END_LINK_CROS_OSS" />. Това се отнася и за <ph name="BEGIN_LINK_LINUX_OSS" />базираната на Linux среда на програмиране<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Когато настройката е включена, Chrome освобождава паметта от разделите, които не използвате активно. Така ресурсите на компютъра ви са свободни за други задачи и Chrome не се забавя. Неактивните раздели са празни и се презареждат автоматично, когато кликнете върху тях. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /> или <ph name="BEGIN_LINK_2" />изпратете отзиви<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941"><ph name="ITEMS_COUNT" /> елемента ще се изтрият от това устройство. За да извлечете данните си по-късно, влезте в Chrome като <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Повторно стартиране за актуализиране на &Chrome</translation> <translation id="2123055963409958220">Помогнете за подобряването на Chrome, като подадете сигнал за <ph name="BEGIN_LINK" />текущите настройки<ph name="END_LINK" /></translation> @@ -273,6 +274,7 @@ <translation id="6735387454586646204">Система ChromeOS Flex</translation> <translation id="6739177684496155661">Искате ли да продължите с нов потребителски профил в Chrome?</translation> <translation id="6750954913813541382">С цел поправка на правописни грешки Chrome изпраща до Google текста, който въвеждате в браузъра</translation> +<translation id="6756581345161130259">Ако е необходимо, Chrome освобождава паметта от разделите, които не използвате активно. Можете да промените това по всяко време от настройките.</translation> <translation id="677276454032249905">Искате ли да излезете от Chrome въпреки това?</translation> <translation id="6785872064505734160">Google Асистент в Chrome може да извършва действия вместо вас във всички уебсайтове</translation> <translation id="683440813066116847">Правило за Google Chrome Canary за допускане на входящия трафик за mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 28ba102..34eda61 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">Condicions de ChromeOS Flex</translation> <translation id="2094919256425865063">Vols sortir de Chrome igualment?</translation> <translation id="2106831557840787829">ChromeOS Flex és possible gràcies a <ph name="BEGIN_LINK_CROS_OSS" />programari lliure<ph name="END_LINK_CROS_OSS" /> addicional, igual que l'<ph name="BEGIN_LINK_LINUX_OSS" />entorn de desenvolupament de Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Quan aquesta opció està activada, Chrome es reapropia de la memòria de les pestanyes que no estàs utilitzant activament. Així, s'alliberen els recursos de l'ordinador per a altres tasques i es manté l'agilitat de Chrome. Les pestanyes inactives es mostren buides i es tornen a carregar automàticament quan hi fas clic. <ph name="BEGIN_LINK" />Obtén més informació<ph name="END_LINK" /> o <ph name="BEGIN_LINK_2" />envia suggeriments<ph name="END_LINK_2" />.</translation> <translation id="2120620239521071941">Amb aquesta acció, se suprimiran <ph name="ITEMS_COUNT" /> elements d'aquest dispositiu. Per recuperar les teves dades més endavant, inicia la sessió a Chrome com a <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Reinicia per actualitzar &Chrome</translation> <translation id="2123055963409958220">Informa de la <ph name="BEGIN_LINK" />configuració actual<ph name="END_LINK" /> per ajudar-nos a millorar Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb index 79ab8f5..b9c60681 100644 --- a/chrome/app/resources/google_chrome_strings_cy.xtb +++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">Termau ChromeOS Flex</translation> <translation id="2094919256425865063">Gadael Chrome beth bynnag?</translation> <translation id="2106831557840787829">Mae ChromeOS Flex yn bosib oherwydd <ph name="BEGIN_LINK_CROS_OSS" />meddalwedd ffynhonnell agored<ph name="END_LINK_CROS_OSS" /> ychwanegol, fel y mae <ph name="BEGIN_LINK_LINUX_OSS" />amgylchedd datblygu Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Pan fydd ymlaen, mae Chrome yn adfer cof o dabiau nad ydych yn eu defnyddio'n weithredol. Mae hyn yn rhyddhau adnoddau eich cyfrifiadur ar gyfer tasgau eraill ac yn cadw Chrome yn gyflym. Mae tabiau anweithredol yn ymddangos yn wag ac yn ail-lwytho'n awtomatig pan fyddwch yn clicio arnynt. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /> neu <ph name="BEGIN_LINK_2" />anfon adborth<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Bydd hyn yn dileu <ph name="ITEMS_COUNT" /> eitem o'r ddyfais hon. I adfer eich data yn nes ymlaen, mewngofnodwch i Chrome fel <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Ail-lansiwch i Ddiweddaru &Chrome</translation> <translation id="2123055963409958220">Helpwch i wneud Chrome yn well drwy adrodd am <ph name="BEGIN_LINK" />y gosodiadau presennol<ph name="END_LINK" /></translation> @@ -279,6 +280,7 @@ <translation id="6735387454586646204">System ChromeOS Flex</translation> <translation id="6739177684496155661">Parhau mewn proffil Chrome newydd?</translation> <translation id="6750954913813541382">I drwsio gwallau sillafu, mae Chrome yn anfon y testun rydych yn ei deipio yn y porwr at Google</translation> +<translation id="6756581345161130259">Yn ôl yr angen, mae Chrome yn adfer cof o dabiau nad ydych yn eu defnyddio'n weithredol. Gallwch newid hyn unrhyw bryd yn y gosodiadau.</translation> <translation id="677276454032249905">Gadael Chrome beth bynnag?</translation> <translation id="6785872064505734160">Gall Google Assistant yn Chrome gwblhau gweithredoedd i chi ar draws gwefannau</translation> <translation id="683440813066116847">Rheol dod i mewn ar gyfer Google Chrome Canary i ganiatáu traffig mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 61987c683..d480335 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">Vilkår for ChromeOS Flex</translation> <translation id="2094919256425865063">Vil du slutte Chrome alligevel?</translation> <translation id="2106831557840787829">ChromeOS Flex leveres ved hjælp af ekstra <ph name="BEGIN_LINK_CROS_OSS" />open source-software<ph name="END_LINK_CROS_OSS" />. Det samme gælder for <ph name="BEGIN_LINK_LINUX_OSS" />Linux-udviklingsmiljøet<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Når indstillingen er aktiveret, bruger Chrome hukommelse fra faner, du ikke aktivt bruger. Dette frigør din computers ressourcer til andre opgaver og sørger for, at Chrome forbliver hurtigt. Inaktive faner fremstår som tomme og genindlæses automatisk, når du klikker på dem. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" />, eller <ph name="BEGIN_LINK_2" />send feedback<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Denne handling sletter <ph name="ITEMS_COUNT" /> elementer på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chrome som <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Genstart og opdater &Chrome</translation> <translation id="2123055963409958220">Vær med til at gøre Chrome bedre ved at rapportere de <ph name="BEGIN_LINK" />aktuelle indstillinger<ph name="END_LINK" />.</translation> @@ -271,6 +272,7 @@ <translation id="6735387454586646204">ChromeOS Flex-system</translation> <translation id="6739177684496155661">Vil du fortsætte på en ny Chrome-profil?</translation> <translation id="6750954913813541382">Chrome sender den tekst, du angiver i browseren, til Google for at rette stavefejl</translation> +<translation id="6756581345161130259">Når det er nødvendigt, bruger Chrome hukommelse fra faner, du ikke aktivt bruger. Du kan altid ændre dette under Indstillinger.</translation> <translation id="677276454032249905">Vil du afslutte Chrome alligevel?</translation> <translation id="6785872064505734160">Google Assistent i Chrome kan udføre handlinger for dig på websites</translation> <translation id="683440813066116847">Indgående regel for Google Chrome Canary om at tillade mDNS-trafik.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index ae4864e..f889d1c0 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">Nutzungsbedingungen für Chrome OS Flex</translation> <translation id="2094919256425865063">Chrome trotzdem beenden?</translation> <translation id="2106831557840787829">Chrome OS Flex und die <ph name="BEGIN_LINK_LINUX_OSS" />Linux-Entwicklungsumgebung<ph name="END_LINK_LINUX_OSS" /> werden durch zusätzliche <ph name="BEGIN_LINK_CROS_OSS" />Open-Source-Software<ph name="END_LINK_CROS_OSS" /> ermöglicht.</translation> +<translation id="2112742052114331084">Wenn diese Option aktiviert ist, gibt Chrome den für Tabs genutzten Arbeitsspeicher wieder frei, wenn du sie gerade nicht aktiv verwendest. Dadurch werden die Ressourcen deines Computers für andere Aufgaben frei und Chrome wird schneller. Inaktive Tabs erscheinen leer und werden automatisch aktualisiert, wenn du sie anklickst. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /> oder <ph name="BEGIN_LINK_2" />Feedback senden<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Dadurch werden <ph name="ITEMS_COUNT" /> Elemente von diesem Gerät gelöscht. Wenn du deine Daten später abrufen möchtest, melde dich als <ph name="USER_EMAIL" /> in Chrome an.</translation> <translation id="2121284319307530122">Neu starten, um &Chrome zu aktualisieren</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />Aktuelle Einstellungen<ph name="END_LINK" /> übermitteln und so helfen, Chrome zu verbessern</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 86733918..0c8cb07b 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -31,6 +31,7 @@ <translation id="1587223624401073077">Google Chrome is using your camera.</translation> <translation id="1587325591171447154"><ph name="FILE_NAME" /> is dangerous, so Chrome has blocked it.</translation> <translation id="1597911401261118146">To check if your passwords are safe from data breaches and other security issues, <ph name="BEGIN_LINK" />sign in to Chrome<ph name="END_LINK" />.</translation> +<translation id="1599904803480101533">Chrome blocked this archive file because it may hide malware</translation> <translation id="1619887657840448962">To make Chrome safer, we disabled the following extension that isn't listed in the <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> and may have been added without your knowledge.</translation> <translation id="1627304841979541023"><ph name="BEGIN_BOLD" />How you can manage your data:<ph name="END_BOLD" /> To protect your privacy, we auto-delete your interests that are older than four weeks. As you keep browsing, an interest might appear on the list again. Or you can remove interests that you don’t want Chrome to consider.</translation> <translation id="1628000112320670027">Get help with Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index 974e5c4..8d650f4 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -279,6 +279,7 @@ <translation id="6735387454586646204">Sistema ChromeOS Flex</translation> <translation id="6739177684496155661">¿Continuar en un nuevo perfil de Chrome?</translation> <translation id="6750954913813541382">Chrome envía a Google el texto que escribes en el navegador para corregir los errores ortográficos</translation> +<translation id="6756581345161130259">Cuando es necesario, Chrome recupera la memoria de las pestañas que no estás usando activamente. Puedes cambiar esta opción en cualquier momento en la configuración.</translation> <translation id="677276454032249905">¿Quieres salir de Chrome de todas formas?</translation> <translation id="6785872064505734160">El Asistente de Google en Chrome puede realizar acciones por ti en sitios web.</translation> <translation id="683440813066116847">Regla entrante para que Google Chrome Canary permita tráfico mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index 561006b..74802075 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -274,6 +274,7 @@ <translation id="6735387454586646204">Chrome OS Flexi süsteem</translation> <translation id="6739177684496155661">Kas jätkata uuel Chrome'i profiilil?</translation> <translation id="6750954913813541382">Õigekirjavigade parandamiseks saadab Chrome brauseris sisestatava teksti Google'ile</translation> +<translation id="6756581345161130259">Vajaduse korral võtab Chrome mälu tagasi vahelehtedelt, mida te aktiivselt ei kasuta. Saate seda menüüs Seaded alati muuta.</translation> <translation id="677276454032249905">Kas väljuda Chrome'ist ikkagi?</translation> <translation id="6785872064505734160">Google'i assistent Chrome'is saab veebisaitidel teie eest toiminguid teha</translation> <translation id="683440813066116847">Sissetuleku reegel Google Chrome Canaryle mDNS-liikluse lubamiseks.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 37e8b5f..1a672198 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -60,6 +60,7 @@ <translation id="2094648590148273905">ChromeOS Flex-en baldintzak</translation> <translation id="2094919256425865063">Chrome-tik irten nahi duzu hala ere?</translation> <translation id="2106831557840787829"><ph name="BEGIN_LINK_CROS_OSS" />Kode irekiko software<ph name="END_LINK_CROS_OSS" /> gehigarriari esker garatu ahal izan dugu ChromeOS Flex; esate baterako, <ph name="BEGIN_LINK_LINUX_OSS" />Linux-eko garapen-ingurunea<ph name="END_LINK_LINUX_OSS" /> erabiltzen da.</translation> +<translation id="2112742052114331084">Aktibatuta dagoenean, aktiboki erabiltzen ari ez zaren fitxen memoria berreskuratzen du Chrome-k, behar den moduan. Horrela, ordenagailuaren baliabideak libre geratzen dira beste zeregin batzuetarako, eta Chrome-k abiadura egokian funtzionatzen jarraitzen du. Inaktibo dauden fitxak hutsik agertzen dira eta automatikoki kargatzen dira berriro sakatzen dituzunean. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /> edo <ph name="BEGIN_LINK_2" />bidali oharrak<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Gailuko <ph name="ITEMS_COUNT" /> elementu ezabatuko dira. Geroago datuak eskuratu nahi izanez gero, hasi saioa Chrome-n <ph name="USER_EMAIL" /> gisa.</translation> <translation id="2121284319307530122">Abiaraz ezazu berriro &Chrome eguneratzeko</translation> <translation id="2123055963409958220">Lagundu Chrome hobetzen <ph name="BEGIN_LINK" />oraingo ezarpenen<ph name="END_LINK" /> berri emanda</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index bf0171b4..9ad496e 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">شرایط ChromeOS Flex</translation> <translation id="2094919256425865063">درهرصورت از Chrome خارج میشوید؟</translation> <translation id="2106831557840787829">ارائه ChromeOS Flex با <ph name="BEGIN_LINK_CROS_OSS" />نرمافزارهای متنباز<ph name="END_LINK_CROS_OSS" /> تکمیلی مانند <ph name="BEGIN_LINK_LINUX_OSS" />محیط توسعه نرمافزاری Linux<ph name="END_LINK_LINUX_OSS" /> ممکن شده است.</translation> +<translation id="2112742052114331084">وقتی روشن باشد، Chrome حافظه را از برگههایی که بهطور فعال از آنها استفاده نمیکنید بازپس میگیرد. این کار منابع رایانه را برای وظایف دیگر آزاد میکند و موجب میشود Chrome همچنان با سرعت بالا اجرا شود. برگههای غیرفعال خالی بهنظر میرسند و وقتی روی آنها کلیک کنید بهطور خودکار مجدداً بار میشوند. <ph name="BEGIN_LINK" />اطلاعات بیشتری کسب کنید<ph name="END_LINK" /> یا <ph name="BEGIN_LINK_2" />بازخورد ارسال کنید<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">این کار <ph name="ITEMS_COUNT" /> مورد را از این دستگاه حذف میکند. برای بازیابی دادههایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> وارد سیستم Chrome شوید.</translation> <translation id="2121284319307530122">راهاندازی مجدد برای بهروزرسانی Chrome</translation> <translation id="2123055963409958220">با گزارش <ph name="BEGIN_LINK" />تنظیمات کنونی<ph name="END_LINK" />، به بهتر شدن Chrome کمک کنید</translation> @@ -271,6 +272,7 @@ <translation id="6735387454586646204">سیستم ChromeOS Flex</translation> <translation id="6739177684496155661">در نمایه جدیدی از Chrome ادامه میدهید؟</translation> <translation id="6750954913813541382">Chrome برای رفع غلطهای املایی، نوشتاری را که در مرورگر تایپ میکنید به Google ارسال میکند</translation> +<translation id="6756581345161130259">درصورت نیاز، Chrome حافظه را از برگههایی که بهطور فعال از آنها استفاده نمیکنید بازپس میگیرد. هرزمان خواستید میتوانید آن را در تنظیمات تغییر دهید.</translation> <translation id="677276454032249905">درهرصورت از Chrome خارج میشوید؟</translation> <translation id="6785872064505734160">«دستیار Google» در Chrome میتواند کنشهایی را در وبسایتها برایتان انجام دهد</translation> <translation id="683440813066116847">قانون ترافیک ورودی برای Google Chrome Canary به منظور اجازه به ترافیک mDNS .</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 797f956b..9d759f0a 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">ChromeOS Flexin ehdot</translation> <translation id="2094919256425865063">Suljetaanko Chrome silti?</translation> <translation id="2106831557840787829">Toinen <ph name="BEGIN_LINK_CROS_OSS" />avoimen lähdekoodin ohjelmisto<ph name="END_LINK_CROS_OSS" /> tukee ChromeOS Flexiä, kuten myös <ph name="BEGIN_LINK_LINUX_OSS" />Linux-kehitysympäristöä<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Kun asetus on päällä, Chrome vapauttaa muistia välilehdiltä, joita et käytä aktiivisesti. Näin tietokoneesi resurssit vapautuvat muihin tehtäviin ja Chrome pysyy nopeana. Ei-aktiiviset välilehdet näyttävät tyhjiltä ja latautuvat automaattisesti uudelleen, kun klikkaat niitä. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /> tai <ph name="BEGIN_LINK_2" />lähetä palautetta<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941"><ph name="ITEMS_COUNT" /> kohdetta poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Päivitä &Chrome käynnistämällä se uudelleen</translation> <translation id="2123055963409958220">Auta parantamaan Chromea ilmoittamalla <ph name="BEGIN_LINK" />nykyiset asetukset<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index 508efc7..4bbedf5 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">Mga tuntunin ng ChromeOS Flex</translation> <translation id="2094919256425865063">Umalis pa rin sa Chrome?</translation> <translation id="2106831557840787829">Pinapagana ng karagdagang <ph name="BEGIN_LINK_CROS_OSS" />open source na software<ph name="END_LINK_CROS_OSS" /> ang ChromeOS Flex, pati na rin ang <ph name="BEGIN_LINK_LINUX_OSS" />environment sa pag-develop ng Linux <ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Kapag naka-on, binabawi ng Chrome ang memory mula sa mga tab na hindi mo aktibong ginagamit. Binabakante nito ang mga resource ng iyong computer para sa iba pang gawain at pinapanatili nitong mabilis ang Chrome. Mukhang walang laman ang mga hindi aktibong tab at awtomatikong nagre-reload ang mga ito kapag na-click mo ang mga ito. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /> o <ph name="BEGIN_LINK_2" />magpadala ng feedback<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Magde-delete ito ng <ph name="ITEMS_COUNT" /> (na) item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chrome bilang <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Ilunsad Ulit para Ma-update ang Chrome</translation> <translation id="2123055963409958220">Tulungang pahusayin ang Chrome sa pamamagitan ng pag-ulat sa <ph name="BEGIN_LINK" />mga kasalukuyang setting<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index e8635cc..5e2b9e7b 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">ChromeOS Flexની શરતો</translation> <translation id="2094919256425865063">છતાં પણ Chrome બંધ કરવું છે?</translation> <translation id="2106831557840787829"><ph name="BEGIN_LINK_LINUX_OSS" />Linux ડેવલપમેન્ટ એન્વાયરમેન્ટ<ph name="END_LINK_LINUX_OSS" />ની જેમ, ChromeOS Flex વધારાના <ph name="BEGIN_LINK_CROS_OSS" />ઓપન સૉર્સ સૉફ્ટવેર<ph name="END_LINK_CROS_OSS" /> દ્વારા શક્ય બન્યું છે.</translation> +<translation id="2112742052114331084">જ્યારે ચાલુ હોય, તમે જે ટૅબનો સક્રિય રીતે ઉપયોગ ન કરતા હો, Chrome એ ટૅબમાંથી મેમરી પાછી લઈ લે છે. આ તમારા કમ્પ્યુટરના સંસાધનોને અન્ય કાર્યો માટે ઉપલબ્ધ કરે છે અને Chromeની કામગીરી ઝડપી રાખે છે. નિષ્ક્રિય ટૅબ ખાલી દેખાય છે અને જ્યારે તમે તેના પર ક્લિક કરો, ત્યારે તે ઑટોમૅટિક રીતે ફરીથી લોડ થાય છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /> અથવા <ph name="BEGIN_LINK_2" />પ્રતિસાદ મોકલો<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">આ, <ph name="ITEMS_COUNT" /> આઇટમને આ ડિવાઇસમાંથી ડિલીટ કરશે. પછીથી તમારો ડેટા ફરીથી મેળવવા માટે, Chromeમાં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation> <translation id="2121284319307530122">&Chrome અપડેટ કરવા માટે, ફરીથી લૉન્ચ કરો</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />વર્તમાન સેટિંગ<ph name="END_LINK" />ની જાણ કરીને Chromeને બહેતર બનાવવામાં સહાય કરો</translation> @@ -279,6 +280,7 @@ <translation id="6735387454586646204">ChromeOS Flex સિસ્ટમ</translation> <translation id="6739177684496155661">નવી Chrome પ્રોફાઇલમાં બ્રાઉઝિંગ ચાલુ રાખીએ?</translation> <translation id="6750954913813541382">જોડણીની ભૂલો સુધારવા માટે, તમે બ્રાઉઝરમાં ટાઇપ કરો છો તે ટેક્સ્ટ Chrome દ્વારા Googleને મોકલવામાં આવે છે</translation> +<translation id="6756581345161130259">આવશ્યકતા મુજબ, તમે જે ટૅબનો સક્રિય રીતે ઉપયોગ ન કરતા હો, Chrome એ ટૅબમાંથી મેમરી પાછી લઈ લે છે. સેટિંગમાં તમે આને કોઈપણ સમયે બદલી શકો છો.</translation> <translation id="677276454032249905">છતાં પણ Chromeમાંથી બહાર નિકળવું છે?</translation> <translation id="6785872064505734160">Google Assistant Chromeમાં, તમારા માટે ઘણી વેબસાઇટમાં અમુક ઍક્શન પૂર્ણ કરી શકે છે</translation> <translation id="683440813066116847">mDNS ટ્રાફિકને મંજૂરી આપવા માટે Google Chrome કૅનેરી માટે ઇનબાઉન્ડ નિયમ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index 6e4fe513..7513a773 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">ChromeOS Flex की शर्तें</translation> <translation id="2094919256425865063">फिर भी Chrome छोड़ें?</translation> <translation id="2106831557840787829">ChromeOS Flex को <ph name="BEGIN_LINK_LINUX_OSS" />Linux डेवलपमेंट एनवायरमेंट<ph name="END_LINK_LINUX_OSS" /> की तरह, अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> की मदद से बनाया गया है.</translation> +<translation id="2112742052114331084">इस सेटिंग के चालू होने पर, Chrome उन टैब की मेमोरी को रिकवर करता है जिन्हें आपने पिछले कुछ समय से इस्तेमाल नहीं किया है. इससे आपके कंप्यूटर के रिसॉर्स, अन्य कामों में इस्तेमाल किए जा सकते हैं. साथ ही, Chrome तेज़ी से काम करता रहता है. इनएक्टिव टैब खाली दिखते हैं. इन पर क्लिक करने के बाद, ये अपने-आप फिर से लोड हो जाते हैं. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /> या <ph name="BEGIN_LINK_2" />सुझाव, शिकायत या राय भेजें<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">ऐसा करने से इस डिवाइस से <ph name="ITEMS_COUNT" /> आइटम मिट जाएंगे. बाद में अपना डेटा पाने के लिए, Chrome में <ph name="USER_EMAIL" /> के रूप में साइन इन करें.</translation> <translation id="2121284319307530122">&Chrome को अपडेट करने के लिए फिर से लॉन्च करें</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />अभी वाली सेटिंग<ph name="END_LINK" /> की रिपोर्ट करके Chrome को बेहतर बनाने में सहायता करें</translation> @@ -275,6 +276,7 @@ <translation id="6735387454586646204">ChromeOS Flex सिस्टम</translation> <translation id="6739177684496155661">क्या आप नई Chrome प्रोफ़ाइल में ब्राउज़िंग जारी रखना चाहते हैं?</translation> <translation id="6750954913813541382">वर्तनी की गलती को ठीक करने के लिए, आप ब्राउज़र में जो कुछ भी लिखते हैं, Chrome उसे Google को भेज देता है</translation> +<translation id="6756581345161130259">ज़रूरत के मुताबिक, Chrome उन टैब से मेमोरी फिर से रिकवर करता है जिन्हें आपने पिछले कुछ समय से इस्तेमाल नहीं किया है. सेटिंग में जाकर, इस विकल्प को कभी भी बदला जा सकता है.</translation> <translation id="677276454032249905">फिर भी Chrome से बाहर निकलें?</translation> <translation id="6785872064505734160">Chrome में Google Assistant की सुविधा, सभी वेबसाइटों पर आपके निर्देश पर काम कर सकती है</translation> <translation id="683440813066116847">mDNS ट्रैफ़िक की अनुमति देने के लिए Google Chrome Canary के लिए इनबाउंड नियम.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index b395702..42c4102 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -271,6 +271,7 @@ <translation id="6735387454586646204">ChromeOS Flex rendszer</translation> <translation id="6739177684496155661">Biztosan új Chrome-profilban folytatja?</translation> <translation id="6750954913813541382">A nyelvtani hibák javítása érdekében a Chrome elküldi a böngészőben begépelt összes szöveget a Google-nak</translation> +<translation id="6756581345161130259">A Chrome szükség szerint visszaveszi a memóriát az olyan lapokról, amelyeket nem használ aktívan. A beállításokban ezt bármikor módosíthatja.</translation> <translation id="677276454032249905">Biztosan kilép a Chrome-ból?</translation> <translation id="6785872064505734160">A „Google Segéd a Chrome-ban” elvégezhet bizonyos műveleteket Önnek a különböző webhelyeken</translation> <translation id="683440813066116847">Bejövő szabály a Google Chrome Canaryhoz az mDNS forgalom engedélyezése céljából.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index 6688fea..f960a505 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -270,6 +270,7 @@ <translation id="6735387454586646204">Sistema Chrome OS Flex</translation> <translation id="6739177684496155661">Vuoi continuare con un nuovo profilo Chrome?</translation> <translation id="6750954913813541382">Per correggere gli errori ortografici, Chrome invia a Google il testo che digiti nel browser</translation> +<translation id="6756581345161130259">Se necessario, Chrome recupera memoria dalle schede che non utilizzi attivamente. Puoi modificare questa preferenza in qualsiasi momento nelle Impostazioni.</translation> <translation id="677276454032249905">Vuoi uscire comunque da Chrome?</translation> <translation id="6785872064505734160">L'Assistente Google in Chrome può completare azioni per te su vari siti web</translation> <translation id="683440813066116847">Regola inbound per consentire il traffico mDNS in Google Chrome Canary.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 637d9b59..b1a2eb8f 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">התנאים של ChromeOS Flex</translation> <translation id="2094919256425865063">לסגור את Chrome בכל זאת?</translation> <translation id="2106831557840787829">השימוש ב-ChromeOS Flex מתאפשר בזכות <ph name="BEGIN_LINK_CROS_OSS" />תוכנת קוד פתוח<ph name="END_LINK_CROS_OSS" /> נוספת כמו <ph name="BEGIN_LINK_LINUX_OSS" />סביבת הפיתוח של Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">כשההגדרה מופעלת, מערכת Chrome משתמשת בזיכרון מכרטיסיות שאינן בשימוש באופן פעיל. כך המשאבים של המחשב מתפנים למשימות אחרות, ומערכת Chrome ממשיכה לפעול במהירות. כרטיסיות לא פעילות מופיעות ריקות ונטענות מחדש באופן אוטומטי כשלוחצים עליהן. אפשר <ph name="BEGIN_LINK" />לקבל מידע נוסף<ph name="END_LINK" /> או <ph name="BEGIN_LINK_2" />לשלוח משוב<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">פעולה זו תמחק <ph name="ITEMS_COUNT" /> פריטים מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, יש להיכנס אל Chrome עם <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">הפעלה מחדש לצורך עדכון &Chrome</translation> <translation id="2123055963409958220">דיווח על <ph name="BEGIN_LINK" />ההגדרות הנוכחיות<ph name="END_LINK" /> יעזור לשפר את Chrome</translation> @@ -270,6 +271,7 @@ <translation id="6735387454586646204">מערכת ChromeOS Flex</translation> <translation id="6739177684496155661">להמשיך בפרופיל Chrome חדש?</translation> <translation id="6750954913813541382">כדי לתקן שגיאות כתיב, הטקסט שהוקלד על ידך בדפדפן נשלח אל Google על ידי Chrome</translation> +<translation id="6756581345161130259">מערכת Chrome משתמשת בזיכרון מכרטיסיות שאינן בשימוש באופן פעיל, לפי הצורך. תמיד אפשר לשנות זאת בהגדרות.</translation> <translation id="677276454032249905">לסגור את Chrome בכל זאת?</translation> <translation id="6785872064505734160">Google Assistant ב-Chrome יכולה להשלים עבורך פעולות באתרים</translation> <translation id="683440813066116847">כלל נכנס עבור הגרסה הניסיונית של Google Chrome על מנת לאפשר תנועת mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index a98ab3a9..da0d7f7 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">ChromeOS Flex 약관</translation> <translation id="2094919256425865063">Chrome을 종료하시겠습니까?</translation> <translation id="2106831557840787829"><ph name="BEGIN_LINK_LINUX_OSS" />Linux 개발 환경<ph name="END_LINK_LINUX_OSS" />과 마찬가지로, ChromeOS Flex는 추가 <ph name="BEGIN_LINK_CROS_OSS" />오픈소스 소프트웨어<ph name="END_LINK_CROS_OSS" />를 사용하여 개발되었습니다.</translation> +<translation id="2112742052114331084">사용 설정하면 Chrome에서 사용자가 현재 사용하지 않는 탭의 메모리를 회수합니다. 이렇게 하면 다른 작업을 위해 컴퓨터 리소스를 확보하고 Chrome의 속도를 유지할 수 있습니다. 비활성 탭은 비어 있을 때 표시되며 클릭하면 자동으로 새로고침됩니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /> 또는 <ph name="BEGIN_LINK_2" />의견 보내기<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">항목 <ph name="ITEMS_COUNT" />개가 기기에서 삭제됩니다. 나중에 데이터를 가져오려면 Chrome에 <ph name="USER_EMAIL" />(으)로 로그인하세요.</translation> <translation id="2121284319307530122">다시 실행하여 Chrome 업데이트</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />현재 설정<ph name="END_LINK" />을 보고하여 Chrome 개선에 참여</translation> @@ -279,6 +280,7 @@ <translation id="6735387454586646204">ChromeOS Flex 시스템</translation> <translation id="6739177684496155661">새 Chrome 프로필에서 계속하시겠습니까?</translation> <translation id="6750954913813541382">맞춤법 오류를 바로잡기 위해 Chrome에서 브라우저에 입력된 텍스트를 Google로 전송합니다.</translation> +<translation id="6756581345161130259">필요한 경우 Chrome에서는 사용자가 현재 사용하지 않는 탭에서 메모리를 회수합니다. 언제든지 설정에서 변경할 수 있습니다.</translation> <translation id="677276454032249905">Chrome을 종료하시겠습니까?</translation> <translation id="6785872064505734160">Chrome의 Google 어시스턴트가 사용자를 위해 여러 웹사이트에서 작업을 완료할 수 있습니다.</translation> <translation id="683440813066116847">Chrome Canary가 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index cb2d1d75..b9423f6cb 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">„ChromeOS Flex“ sąlygos</translation> <translation id="2094919256425865063">Vis tiek išeiti iš „Chrome“?</translation> <translation id="2106831557840787829">„ChromeOS Flex“, kaip ir <ph name="BEGIN_LINK_LINUX_OSS" />„Linux“ kūrimo aplinka<ph name="END_LINK_LINUX_OSS" />, pasiekiama naudojant papildomą <ph name="BEGIN_LINK_CROS_OSS" />atvirojo šaltinio programinę įrangą<ph name="END_LINK_CROS_OSS" />.</translation> +<translation id="2112742052114331084">Kai įjungta, „Chrome“ iš naujo įtraukia atmintį iš skirtukų, kurių aktyviai nenaudojate. Tai atlaisvina kompiuterio šaltinius kitoms užduotims ir užtikrina „Chrome“ spartą. Neaktyvūs skirtukai rodomi tušti ir automatiškai įkeliami iš naujo juos spustelėjus. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /> arba <ph name="BEGIN_LINK_2" />siųskite atsiliepimą<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Atlikus šį veiksmą, iš šio įrenginio bus ištrinta tiek elementų: <ph name="ITEMS_COUNT" />. Jei vėliau norėsite atgauti duomenis, prisijunkite prie „Chrome“ kaip <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Paleisti iš naujo atnaujinant „&Chrome“</translation> <translation id="2123055963409958220">Padėkite tobulinti „Chrome“ pateikę ataskaitą apie <ph name="BEGIN_LINK" />dabartinius nustatymus<ph name="END_LINK" /></translation> @@ -279,6 +280,7 @@ <translation id="6735387454586646204">„ChromeOS Flex“ sistema</translation> <translation id="6739177684496155661">Tęsti naudojant naują „Chrome“ profilį?</translation> <translation id="6750954913813541382">Kad ištaisytų rašybos klaidas, „Chrome“ tekstą, kurį įvedate naršyklėje, siunčia „Google“</translation> +<translation id="6756581345161130259">Jei reikia, „Chrome“ iš naujo įtraukia atmintį iš skirtukų, kurių aktyviai nenaudojate. Tai galite bet kada pakeisti skiltyje „Nustatymai“.</translation> <translation id="677276454032249905">Vis tiek išeiti iš „Chrome“?</translation> <translation id="6785872064505734160">„Google“ padėjėjas naršyklėje „Chrome“ gali atlikti veiksmus svetainėse už jus</translation> <translation id="683440813066116847">„Canary“ versijos „Google Chrome“ skirta taisyklė, pagal kurią leidžiamas gaunamas mDNS srautas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index ee808927..d511c4b 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -280,6 +280,7 @@ <translation id="6735387454586646204">ChromeOS Flex-н систем</translation> <translation id="6739177684496155661">Chrome-н шинэ профайлд үргэлжлүүлэх үү?</translation> <translation id="6750954913813541382">Зөв бичгийн алдааг засахын тулд Chrome таны хөтөч дээр бичсэн текстийг Google-д илгээдэг</translation> +<translation id="6756581345161130259">Шаардлагатай бол Chrome таны идэвхтэй ашиглаагүй байгаа табуудаас санах ойг сэргээнэ. Та үүнийг тохиргоонд хүссэн үедээ өөрчлөх боломжтой.</translation> <translation id="677276454032249905">Chrome-с ямар ч үед гарах уу?</translation> <translation id="6785872064505734160">Chrome-н Google Туслах нь вебсайт дээрх үйлдлүүдийг танд зориулан гүйцээх боломжтой</translation> <translation id="683440813066116847">mDNS-ийг зөвшөөрөх Google Chrome Canary-ийн гадаад дүрэм.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index d32a797..a4514fa 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">ChromeOS Flex စည်းမျဉ်းများ</translation> <translation id="2094919256425865063">Chrome ကို မည်သို့ပင်ဖြစ်စေ ပိတ်လိုပါသလား။</translation> <translation id="2106831557840787829"><ph name="BEGIN_LINK_LINUX_OSS" />Linux ဆော့ဖ်ဝဲရေးဆွဲမှု ပတ်ဝန်းကျင်<ph name="END_LINK_LINUX_OSS" /> တွင် <ph name="BEGIN_LINK_CROS_OSS" />အခမဲ့ရင်းမြစ် ဆော့ဖ်ဝဲ<ph name="END_LINK_CROS_OSS" /> ထပ်ဆောင်းဖြည့်ခြင်းဖြင့် ChromeOS Flex ကို ရေးဆွဲထားသည်။</translation> +<translation id="2112742052114331084">ဖွင့်ထားပါက Chrome သည် လက်ရှိ အသုံးမပြုသည့်တဘ်များမှ မှတ်ဉာဏ်ကို ပြန်လည်ရယူသည်။ ၎င်းက အခြားလုပ်ဆောင်စရာများအတွက် သင့်ကွန်ပျူတာ၏ ရင်းမြစ်များကို ရှင်းလင်းပေးပြီး Chrome ကို လျင်မြန်စေသည်။ အသုံးမပြုသည့် တဘ်များက အလွတ်ပုံဖြစ်နေပြီး ၎င်းတို့ကိုနှိပ်သောအခါ အလိုအလျောက် ပြန်လည်စတင်သည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /> (သို့) <ph name="BEGIN_LINK_2" />အကြံပြုချက် ပို့ရန်<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">၎င်းသည် ဤစက်ပစ္စည်းမှ အကြောင်းအရာ <ph name="ITEMS_COUNT" /> ခုကို ဖျက်လိုက်ပါမည်။ သင့်ဒေတာကို နောက်မှ ပြန်ယူရန် Chrome သို့ <ph name="USER_EMAIL" /> အဖြစ် လက်မှတ်ထိုးဝင်ပါ။</translation> <translation id="2121284319307530122">&Chrome အပ်ဒိတ်လုပ်ရန် ပြန်ဖွင့်ပါ</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />လက်ရှိဆက်တင်များ<ph name="END_LINK" />ကို အစီရင်ခံပေးခြင်းအားဖြင့် Chromium ကို ပိုကောင်းလာအောင် ကူညီပေးပါ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index a196baa8..331e0e0 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -60,6 +60,7 @@ <translation id="2094648590148273905">Voorwaarden van Chrome OS Flex</translation> <translation id="2094919256425865063">Chrome toch sluiten?</translation> <translation id="2106831557840787829">Chrome OS Flex wordt mogelijke gemaakt door aanvullende <ph name="BEGIN_LINK_CROS_OSS" />opensource-software<ph name="END_LINK_CROS_OSS" />, net als de <ph name="BEGIN_LINK_LINUX_OSS" />Linux-ontwikkelomgeving<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Als deze instelling aanstaat, claimt Chrome geheugen terug van tabbladen die je niet actief gebruikt. Zo worden de resources van je computer vrijgemaakt voor andere taken en blijft Chrome snel. Inactieve tabbladen worden leeg weergegeven en worden automatisch opnieuw geladen als je erop klikt. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /> of <ph name="BEGIN_LINK_2" />feedback sturen<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Hiermee worden <ph name="ITEMS_COUNT" /> items verwijderd van dit apparaat. Als je je gegevens later wilt terughalen, log je in bij Chrome als <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Opnieuw starten om &Chrome te updaten</translation> <translation id="2123055963409958220">Help Chrome beter te maken door de <ph name="BEGIN_LINK" />huidige instellingen<ph name="END_LINK" /> te melden</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index af6670f..eba186d 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -56,6 +56,7 @@ <translation id="2094648590148273905">Warunki korzystania z ChromeOS Flex</translation> <translation id="2094919256425865063">Zamknąć Chrome mimo to?</translation> <translation id="2106831557840787829">Opracowanie ChromeOS Flex było możliwe dzięki dodatkowemu <ph name="BEGIN_LINK_CROS_OSS" />oprogramowaniu open source<ph name="END_LINK_CROS_OSS" />. To samo dotyczy <ph name="BEGIN_LINK_LINUX_OSS" />środowiska programistycznego Linuksa<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Gdy ta funkcja jest włączona, Chrome odzyskuje pamięć z kart, których aktywnie nie używasz. Powoduje to zwolnienie zasobów komputera na potrzeby innych zadań i przyspiesza działanie Chrome. Nieaktywne karty wyglądają na puste i automatycznie ładują się ponownie po kliknięciu. <ph name="BEGIN_LINK" />Dowiedz się więcej<ph name="END_LINK" /> lub <ph name="BEGIN_LINK_2" />prześlij opinię<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Spowoduje to usunięcie <ph name="ITEMS_COUNT" /> elementów z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Uruchom ponownie, aby zaktualizować &Chrome</translation> <translation id="2123055963409958220">Pomóż udoskonalić Chrome, zgłaszając <ph name="BEGIN_LINK" />bieżące ustawienia<ph name="END_LINK" /></translation> @@ -270,6 +271,7 @@ <translation id="6735387454586646204">System ChromeOS Flex</translation> <translation id="6739177684496155661">Kontynuować w nowym profilu Chrome?</translation> <translation id="6750954913813541382">Aby poprawić błędy pisowni, Chrome wysyła do Google to, co wpisujesz w przeglądarce</translation> +<translation id="6756581345161130259">W razie potrzeby Chrome odzyskuje pamięć z kart, których aktywnie nie używasz. Możesz to zmienić w dowolnym momencie w ustawieniach.</translation> <translation id="677276454032249905">Zamknąć Chrome mimo to?</translation> <translation id="6785872064505734160">Asystent Google w Chrome może wykonywać za Ciebie działania na różnych stronach internetowych</translation> <translation id="683440813066116847">Reguła dla ruchu przychodzącego w Google Chrome Canary zezwalająca na ruch mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index fef84bd..8ac7b5c 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -56,6 +56,7 @@ <translation id="2094648590148273905">Condițiile pentru sistemul de operare Chrome Flex</translation> <translation id="2094919256425865063">Ieși din Chrome oricum?</translation> <translation id="2106831557840787829">Sistemul de operare Chrome Flex este posibil datorită unui <ph name="BEGIN_LINK_CROS_OSS" />software open source<ph name="END_LINK_CROS_OSS" /> suplimentar, la fel cum este și <ph name="BEGIN_LINK_LINUX_OSS" />mediul de dezvoltare Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Când opțiunea este activată, Chrome revendică memoria din filele pe care nu le folosești în mod activ. Acțiunea eliberează resursele computerului pentru alte activități și menține viteza ridicată a browserului Chrome. Filele inactive se afișează goale și se reîncarcă automat când dai clic pe ele. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /> sau <ph name="BEGIN_LINK_2" />trimite feedback<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Astfel, se vor șterge <ph name="ITEMS_COUNT" /> elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Relansează pentru a actualiza &Chrome</translation> <translation id="2123055963409958220">Contribuie la îmbunătățirea browserului Chrome raportând <ph name="BEGIN_LINK" />setările actuale<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 07b1074a..05157f3 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -56,6 +56,7 @@ <translation id="2094648590148273905">Условия использования Chrome OS Flex</translation> <translation id="2094919256425865063">Завершить работу Chrome?</translation> <translation id="2106831557840787829">Chrome OS Flex, как и <ph name="BEGIN_LINK_LINUX_OSS" />среда разработки Linux<ph name="END_LINK_LINUX_OSS" />, работает благодаря дополнительному <ph name="BEGIN_LINK_CROS_OSS" />программному обеспечению с открытым исходным кодом<ph name="END_LINK_CROS_OSS" />.</translation> +<translation id="2112742052114331084">В этом режиме Chrome не использует память на вкладки, которые некоторое время оставались неактивными. Это освобождает ресурсы компьютера для текущих задач и поддерживает быструю работу Chrome. Неактивные вкладки при этом показываются как пустые и автоматически загружаются при нажатии на них. Вы можете <ph name="BEGIN_LINK" />узнать больше<ph name="END_LINK" /> или <ph name="BEGIN_LINK_2" />отправить отзыв<ph name="END_LINK_2" />.</translation> <translation id="2120620239521071941">С устройства будут удалены объекты (<ph name="ITEMS_COUNT" />). Чтобы восстановить данные позже, войдите в Chrome как <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Перезапустить для обновления &Chrome</translation> <translation id="2123055963409958220">Отправьте отчет о <ph name="BEGIN_LINK" />текущих настройках Chrome<ph name="END_LINK" />, чтобы помочь нам улучшить браузер</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index e027b489a..3fa73c2 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -59,6 +59,7 @@ <translation id="2094648590148273905">Zmluvné podmienky systému Chrome OS Flex</translation> <translation id="2094919256425865063">Chcete Chrome napriek tomu ukončiť?</translation> <translation id="2106831557840787829">Chrome OS Flex mohol vzniknúť vďaka ďalšiemu <ph name="BEGIN_LINK_CROS_OSS" />softvéru typu open source<ph name="END_LINK_CROS_OSS" />, ako je <ph name="BEGIN_LINK_LINUX_OSS" />vývojové prostredie systému Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Keď je táto funkcia zapnutá, Chrome bude uvoľňovať pamäť z kariet, ktoré aktívne nepoužívate. Týmto sa uvoľnia zdroje počítača pre ďalšie úlohy a Chromium bude fungovať rýchlejšie. Neaktívne karty sa budú zobrazovať prázdne a po kliknutí sa automaticky znova načítajú. Môžete si prečítať <ph name="BEGIN_LINK" />ďalšie informácie<ph name="END_LINK" /> alebo <ph name="BEGIN_LINK_2" />odoslať spätnú väzbu<ph name="END_LINK_2" />.</translation> <translation id="2120620239521071941">Táto akcia odstráni zo zariadenia niekoľko položiek (počet: <ph name="ITEMS_COUNT" />). Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do Chromu ako používateľ <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Znova spustiť a aktualizovať Chrome</translation> <translation id="2123055963409958220">Nahlásiť <ph name="BEGIN_LINK" />aktuálne nastavenia<ph name="END_LINK" /> a pomôcť tak zlepšiť Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index 77d57321..4654f0d9 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -61,6 +61,7 @@ <translation id="2094648590148273905">Pogoji za ChromeOS Flex</translation> <translation id="2094919256425865063">Želite vseeno zapreti Chrome?</translation> <translation id="2106831557840787829">ChromeOS Flex omogoča dodatna <ph name="BEGIN_LINK_CROS_OSS" />odprtokodna programska oprema<ph name="END_LINK_CROS_OSS" />, enako kot <ph name="BEGIN_LINK_LINUX_OSS" />razvojno okolje Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="2112742052114331084">Če je vklopljena ta nastavitev, Chrome znova pridobi pomnilnik z zavihkov, ki jih ne uporabljate aktivno. S tem sprostite sredstva računalnika za druga opravila in poskrbite, da Chrome še naprej deluje hitro. Neaktivni zavihki so videti prazni in se samodejno znova naložijo, ko jih kliknete. <ph name="BEGIN_LINK" />Preberite več<ph name="END_LINK" /> ali <ph name="BEGIN_LINK_2" />pošljite povratne informacije<ph name="END_LINK_2" />.</translation> <translation id="2120620239521071941">S tem bo iz te naprave izbrisanih več elementov (<ph name="ITEMS_COUNT" />). Če želite pozneje prenesti podatke, se v Chrome prijavite kot <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Znova zaženite, če želite posodobiti &Chrome</translation> <translation id="2123055963409958220">Pomagajte izboljšati Google Chrome s <ph name="BEGIN_LINK" />poročanjem trenutnih nastavitev<ph name="END_LINK" /></translation> @@ -279,6 +280,7 @@ <translation id="6735387454586646204">Sistem ChromeOS Flex</translation> <translation id="6739177684496155661">Želite nadaljevati v novem profilu v Chromu?</translation> <translation id="6750954913813541382">Chrome zaradi odpravljanja napak pri črkovanju Googlu pošlje besedilo, ki ga vnesete v brskalnik</translation> +<translation id="6756581345161130259">Chrome po potrebi znova pridobi pomnilnik z zavihkov, ki jih ne uporabljate aktivno. To lahko kadar koli spremenite v nastavitvah.</translation> <translation id="677276454032249905">Želite vseeno zapreti Chrome?</translation> <translation id="6785872064505734160">Pomočnik Google v Chromu lahko dokonča dejanja na spletnih mestih namesto vas</translation> <translation id="683440813066116847">Pravilo za dohodni promet za Google Chrome Canary, ki dovoli promet mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index ffb2b214..edb450e 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -29,6 +29,7 @@ <translation id="1587223624401073077">Google Chrome ใช้กล้องของคุณอยู่</translation> <translation id="1587325591171447154"><ph name="FILE_NAME" /> เป็นอันตราย Chromium จึงบล็อกไว้</translation> <translation id="1597911401261118146"><ph name="BEGIN_LINK" />ลงชื่อเข้าใช้ Chrome<ph name="END_LINK" /> เพื่อตรวจสอบว่ารหัสผ่านของคุณไม่ได้รับผลกระทบจากการละเมิดข้อมูลและปัญหาด้านความปลอดภัยอื่นๆ</translation> +<translation id="1599904803480101533">Chrome บล็อกไฟล์ที่เก็บถาวรนี้เนื่องจากอาจซ่อนมัลแวร์ไว้</translation> <translation id="1619887657840448962">เพื่อให้ Chrome ปลอดภัยขึ้น เราได้ปิดส่วนขยายต่อไปนี้ซึ่งไม่ได้แสดงอยู่ใน <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> และอาจมีการเพิ่มเข้ามาโดยที่คุณไม่รู้ตัว</translation> <translation id="1627304841979541023"><ph name="BEGIN_BOLD" />วิธีที่คุณจัดการข้อมูลของตัวเองได้:<ph name="END_BOLD" /> เราลบความสนใจที่เก่ากว่า 4 สัปดาห์โดยอัตโนมัติเพื่อปกป้องความเป็นส่วนตัวของคุณ ความสนใจอาจกลับมาปรากฏในรายการอีกเมื่อคุณท่องเว็บต่อ หรือคุณจะนำความสนใจที่ไม่ต้องการให้ Chrome พิจารณาออกก็ได้</translation> <translation id="1628000112320670027">รับความช่วยเหลือเกี่ยวกับ Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index f36bc10..f8fe7820ed 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -56,6 +56,7 @@ <translation id="2094648590148273905">ChromeOS Flex şartları</translation> <translation id="2094919256425865063">Yine de Chrome'dan çıkılsın mı?</translation> <translation id="2106831557840787829">ChromeOS Flex, <ph name="BEGIN_LINK_LINUX_OSS" />Linux geliştirme ortamında<ph name="END_LINK_LINUX_OSS" /> olduğu gibi ek <ph name="BEGIN_LINK_CROS_OSS" />açık kaynak yazılımlardan<ph name="END_LINK_CROS_OSS" /> yararlanılarak geliştirilmiştir.</translation> +<translation id="2112742052114331084">Bu ayar etkinleştirildiğinde Chrome, aktif olarak kullanmadığınız sekmelerdeki belleği geri kazanır. Böylece, bilgisayarınızın kaynaklarında diğer görevler için yer açılır ve Chrome hızlı çalışmaya devam eder. Aktif olmayan sekmeler boş görünür ve bunları tıkladığınızda otomatik olarak yeniden yüklenir. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /> veya <ph name="BEGIN_LINK_2" />geri bildirim gönderin<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">Bu işlem, <ph name="ITEMS_COUNT" /> öğeyi bu cihazdan silecektir. Verilerinizi daha sonra geri almak için Chrome'da <ph name="USER_EMAIL" /> hesabıyla oturum açın.</translation> <translation id="2121284319307530122">&Chrome'u Güncellemek İçin Yeniden Başlat</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />Mevcut ayarlarınızı<ph name="END_LINK" /> bildirerek Chrome'u daha iyi hale getirmemize yardımcı olun</translation> @@ -272,6 +273,7 @@ <translation id="6735387454586646204">ChromeOS Flex Sistemi</translation> <translation id="6739177684496155661">Yeni bir Chrome profilinde devam edilsin mi?</translation> <translation id="6750954913813541382">Yazım hatalarını düzeltmek için Chrome, tarayıcıda yazdığınız metni Google'a gönderir</translation> +<translation id="6756581345161130259">Chrome, aktif olarak kullanmadığınız sekmelerdeki belleği gerektiğinde geri kazanır. İstediğiniz zaman bunu Ayarlar'dan değiştirebilirsiniz.</translation> <translation id="677276454032249905">Yine de Chrome'dan çıkılsın mı?</translation> <translation id="6785872064505734160">Chrome'daki Google Asistan sizin için web sitelerindeki işlemleri tamamlayabilir</translation> <translation id="683440813066116847">Google Chrome Canary'nin mDNS trafiğine izin vermeyi sağlayan gelen trafik kuralı.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index 056125da..9c4a7b6 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -57,6 +57,7 @@ <translation id="2094648590148273905">Умови використання ОС Chrome Flex</translation> <translation id="2094919256425865063">Усе одно вийти з Chrome?</translation> <translation id="2106831557840787829">ОС Chrome Flex і <ph name="BEGIN_LINK_LINUX_OSS" />середовище для розробки Linux<ph name="END_LINK_LINUX_OSS" /> працюють завдяки додатковому <ph name="BEGIN_LINK_CROS_OSS" />програмному забезпеченню з відкритим кодом<ph name="END_LINK_CROS_OSS" />.</translation> +<translation id="2112742052114331084">Якщо цей режим увімкнено, Chrome перестає використовувати оперативну пам’ять для вкладок, які ви активно не застосовуєте. Це звільняє ресурси комп’ютера для інших завдань і підтримує швидку роботу Chrome. Неактивні вкладки при цьому відображаються пустими й автоматично оновлюються, коли ви їх натискаєте. <ph name="BEGIN_LINK" />Дізнайтеся більше<ph name="END_LINK" /> або <ph name="BEGIN_LINK_2" />надішліть відгук<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">З цього пристрою буде видалено стільки елементів: <ph name="ITEMS_COUNT" />. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як <ph name="USER_EMAIL" />.</translation> <translation id="2121284319307530122">Перезапустити, щоб оновити &Chrome</translation> <translation id="2123055963409958220">Допоможіть покращити Chrome, надсилаючи звіти про <ph name="BEGIN_LINK" />поточні налаштування<ph name="END_LINK" /></translation> @@ -271,6 +272,7 @@ <translation id="6735387454586646204">Операційна система Chrome Flex</translation> <translation id="6739177684496155661">Продовжити в новому профілі Chrome?</translation> <translation id="6750954913813541382">Щоб виправляти орфографічні помилки, Chrome надсилає в Google текст, який ви вводите у веб-переглядачі</translation> +<translation id="6756581345161130259">За потреби Chrome перестає використовувати оперативну пам’ять для вкладок, які ви активно не застосовуєте. Це можна будь-коли змінити в налаштуваннях.</translation> <translation id="677276454032249905">Усе одно вийти з Chrome?</translation> <translation id="6785872064505734160">Google Асистент може завершувати дії на різних веб-сайтах у Chrome</translation> <translation id="683440813066116847">Вхідне правило для Google Chrome Canary дозволяє трафік mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 97b6249..cc35a9c4 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -60,6 +60,7 @@ <translation id="2094648590148273905">ChromeOS Flex کی شرائط</translation> <translation id="2094919256425865063">بہر حال Chrome بند کریں؟</translation> <translation id="2106831557840787829">hromeOS Flex کو اضافی <ph name="BEGIN_LINK_CROS_OSS" />اوپن سورس سافٹ ویئر<ph name="END_LINK_CROS_OSS" /> کے ذریعے ممکن بنایا گیا ہے، جیسے کہ <ph name="BEGIN_LINK_LINUX_OSS" />Linux ڈیولپمنٹ انوائرنمنٹ<ph name="END_LINK_LINUX_OSS" />۔</translation> +<translation id="2112742052114331084">آن ہونے پر، Chrome ان ٹیبز سے میموری کا دوبارہ دعویٰ کرتا ہے جنہیں آپ فعال طور پر استعمال نہیں کر رہے ہیں۔ یہ آپ کے کمپیوٹر کے وسائل کو دوسرے ٹاسکس کے لیے خالی کر دیتا ہے اور Chrome کو تیز رفتار رکھتا ہے۔ غیر فعال ٹیبز خالی دکھائی دیتی ہیں اور جب آپ ان پر کلک کرتے ہیں تو خودکار طور پر دوبارہ لوڈ ہو جاتے ہیں۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /> یا <ph name="BEGIN_LINK_2" />تاثرات بھیجیں<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">یہ اس آلہ سے <ph name="ITEMS_COUNT" /> آئٹمز کو حذف کر دے گا۔ بعد میں اپنے ڈیٹا کی بازیافت کرنے کیلئے، Chrome میں <ph name="USER_EMAIL" /> کے بطور سائن ان کریں۔</translation> <translation id="2121284319307530122">Chrome& کو اپ ڈیٹ کرنے کیلئے بند کر کے دوبارہ چلائیں</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />موجودہ ترتیبات<ph name="END_LINK" /> کی اطلاع دے کر Chrome کو بہتر بنانے میں مدد کریں</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index 2cfdb02a..2727919 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -30,6 +30,7 @@ <translation id="1587223624401073077">Google Chrome kameradan foydalanmoqda.</translation> <translation id="1587325591171447154"><ph name="FILE_NAME" /> zararli edi, shuning uchun u Chrome tomonidan bloklandi.</translation> <translation id="1597911401261118146">Parollarni axborotlar sizib chiqishi va xavfsizlikka oid boshqa muammolardan himoyalash uchun <ph name="BEGIN_LINK" />Chrome hisobingizga kiring<ph name="END_LINK" />.</translation> +<translation id="1599904803480101533">Tarkibida zararli kod borligi sababli bu arxiv fayli Chrome tomonidan bloklandi.</translation> <translation id="1619887657840448962">Chrome brauzerini xavfsiz holda saqlash uchun <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ro‘yxatida keltirilmagan va sizga bildirmasdan qo‘shilgan bo‘lishi mumkin bo‘lgan quyidagi kengaytma o‘chirib qo‘yiladi.</translation> <translation id="1627304841979541023"><ph name="BEGIN_BOLD" />Maʼlumotlaringizni qanday boshqarish mumkin:<ph name="END_BOLD" /> Maxfliylikni himoya qilish maqsadida biz 4 haftadan uzoq saqlangan qiziqishlarni avtomatik oʻchiramiz. Sahifalar takroriy ochilganida qiziqish roʻyxatda yana chiqishi mumkin. Yoki Chrome foydalanmasligini istasangiz, qiziqishlarni olib tashlashingiz mumkin.</translation> <translation id="1628000112320670027">Chrome yordam markazi</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index 76d14de..80dce72e 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -60,6 +60,7 @@ <translation id="2094648590148273905">ChromeOS Flex 條款</translation> <translation id="2094919256425865063">仍要退出 Chrome 嗎?</translation> <translation id="2106831557840787829">ChromeOS Flex 的開發全賴其他<ph name="BEGIN_LINK_CROS_OSS" />開放原始碼軟件<ph name="END_LINK_CROS_OSS" />協助才得以面世,<ph name="BEGIN_LINK_LINUX_OSS" />Linux 開發環境<ph name="END_LINK_LINUX_OSS" />也一樣。</translation> +<translation id="2112742052114331084">啟用此設定後,Chrome 會回收目前未使用的分頁記憶體。這樣做可釋出電腦的資源來處理其他工作,並維持 Chrome 的運作速度。已停用的分頁會顯示為空白,並會在您按一下分頁後自動重新載入內容。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" />或<ph name="BEGIN_LINK_2" />提供意見<ph name="END_LINK_2" /></translation> <translation id="2120620239521071941">這會刪除此裝置上的 <ph name="ITEMS_COUNT" /> 個項目。如果日後想擷取資料,請以 <ph name="USER_EMAIL" /> 的身分登入 Chrome。</translation> <translation id="2121284319307530122">重新啟動以更新 &Chrome</translation> <translation id="2123055963409958220">只要報告<ph name="BEGIN_LINK" />目前的設定<ph name="END_LINK" />,就能助我們一臂之力,讓 Chrome 更臻完美</translation> @@ -278,6 +279,7 @@ <translation id="6735387454586646204">ChromeOS Flex 系統</translation> <translation id="6739177684496155661">要透過新的 Chrome 設定檔繼續瀏覽嗎?</translation> <translation id="6750954913813541382">Chrome 會將您在瀏覽器中輸入的文字傳送至 Google,以修正拼字錯誤</translation> +<translation id="6756581345161130259">如有需要,Chrome 會回收目前未使用的分頁記憶體。您可隨時在設定中變更此設定。</translation> <translation id="677276454032249905">仍要結束 Chrome 嗎?</translation> <translation id="6785872064505734160">Chrome 的「Google 助理」可助您完成各網站的操作</translation> <translation id="683440813066116847">允許 mDNS 流量的 Google Chrome Canary 輸入規則。</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e4bb253..f8f2db7 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1673,8 +1673,6 @@ "signin/chrome_signin_proxying_url_loader_factory.h", "signin/chrome_signin_url_loader_throttle.cc", "signin/chrome_signin_url_loader_throttle.h", - "signin/cookie_reminter_factory.cc", - "signin/cookie_reminter_factory.h", "signin/header_modification_delegate.h", "signin/header_modification_delegate_impl.cc", "signin/header_modification_delegate_impl.h",
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index 4ed0e8a..271f479 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -4343,34 +4343,40 @@ IN_PROC_BROWSER_TEST_P(WebViewPdfTest, ContextMenuNavigationInMimeHandlerView) { TestHelper("testNavigateToPDFInWebview", "web_view/shim", NO_TEST_SERVER); - std::vector<content::WebContents*> guest_web_contents_list; GetGuestViewManager()->WaitForNumGuestsCreated(2u); - GetGuestViewManager()->DeprecatedGetGuestWebContentsList( - &guest_web_contents_list); - ASSERT_EQ(2u, guest_web_contents_list.size()); + std::vector<content::RenderFrameHost*> guest_rfh_list; + GetGuestViewManager()->GetGuestRenderFrameHostList(&guest_rfh_list); + ASSERT_EQ(2u, guest_rfh_list.size()); - content::WebContents* web_view_contents = guest_web_contents_list[0]; - content::WebContents* mime_handler_view_contents = guest_web_contents_list[1]; - ASSERT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(web_view_contents)); + content::RenderFrameHost* web_view_rfh = guest_rfh_list[0]; + content::RenderFrameHost* mime_handler_view_rfh = guest_rfh_list[1]; + ASSERT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(web_view_rfh)); // Ensure the <webview> has a previous entry, so we can navigate back to it. - ASSERT_TRUE(web_view_contents->GetController().CanGoBack()); + EXPECT_EQ(true, + content::EvalJs(GetEmbedderWebContents(), + "document.querySelector('webview').canGoBack();") + .ExtractBool()); // Open a context menu for the MimeHandlerViewGuest. Since the <webview> can // navigate back, the Back item should be enabled. content::ContextMenuParams params; - TestRenderViewContextMenu menu( - *mime_handler_view_contents->GetPrimaryMainFrame(), params); + TestRenderViewContextMenu menu(*mime_handler_view_rfh, params); menu.Init(); ASSERT_TRUE(menu.IsCommandIdEnabled(IDC_BACK)); // Verify that the Back item causes the <webview> to navigate back to the // previous entry. - content::TestNavigationObserver observer(web_view_contents); + content::TestFrameNavigationObserver observer(web_view_rfh); menu.ExecuteCommand(IDC_BACK, 0); observer.Wait(); - EXPECT_EQ(GURL(url::kAboutBlankURL), - web_view_contents->GetLastCommittedURL()); + + std::vector<content::RenderFrameHost*> guest_rfh_list2; + GetGuestViewManager()->GetGuestRenderFrameHostList(&guest_rfh_list2); + ASSERT_EQ(1u, guest_rfh_list2.size()); + + content::RenderFrameHost* web_view_rfh2 = guest_rfh_list2[0]; + EXPECT_EQ(GURL(url::kAboutBlankURL), web_view_rfh2->GetLastCommittedURL()); } IN_PROC_BROWSER_TEST_P(WebViewPdfTest, Shim_TestDialogInPdf) { @@ -6081,7 +6087,14 @@ // Checks that content scripts work in an out-of-process iframe in a <webview> // tag. -IN_PROC_BROWSER_TEST_F(SitePerProcessWebViewTest, ContentScriptInOOPIF) { +// TODO(crbug.com/1363124): Fix flakiness on win10_chromium_x64_rel_ng. The test +// is also disabled on mac11-arm64-rel using filter. +#if BUILDFLAG(IS_WIN) +#define MAYBE_ContentScriptInOOPIF DISABLED_ContentScriptInOOPIF +#else +#define MAYBE_ContentScriptInOOPIF ContentScriptInOOPIF +#endif +IN_PROC_BROWSER_TEST_F(SitePerProcessWebViewTest, MAYBE_ContentScriptInOOPIF) { ASSERT_TRUE(StartEmbeddedTestServer()); // Load an app with a <webview> guest that starts at a data: URL. LoadAppWithGuest("web_view/simple");
diff --git a/chrome/browser/ash/guest_os/guest_id.cc b/chrome/browser/ash/guest_os/guest_id.cc index 7e12279..37cba82 100644 --- a/chrome/browser/ash/guest_os/guest_id.cc +++ b/chrome/browser/ash/guest_os/guest_id.cc
@@ -98,10 +98,10 @@ } void RemoveDuplicateContainerEntries(PrefService* prefs) { - ListPrefUpdate updater(prefs, prefs::kGuestOsContainers); + ScopedListPrefUpdate updater(prefs, prefs::kGuestOsContainers); std::set<GuestId> seen_containers; - auto& containers = updater->GetList(); + auto& containers = *updater; for (auto it = containers.begin(); it != containers.end();) { GuestId id(*it); if (seen_containers.find(id) == seen_containers.end()) { @@ -129,8 +129,8 @@ void AddContainerToPrefs(Profile* profile, const GuestId& container_id, base::Value::Dict properties) { - ListPrefUpdate updater(profile->GetPrefs(), prefs::kGuestOsContainers); - if (base::ranges::any_of(updater->GetListDeprecated(), [&](const auto& dict) { + ScopedListPrefUpdate updater(profile->GetPrefs(), prefs::kGuestOsContainers); + if (base::ranges::any_of(*updater, [&](const auto& dict) { return MatchContainerDict(dict, container_id); })) { return; @@ -147,8 +147,8 @@ void RemoveContainerFromPrefs(Profile* profile, const GuestId& container_id) { auto* pref_service = profile->GetPrefs(); - ListPrefUpdate updater(pref_service, prefs::kGuestOsContainers); - base::Value::List& update_list = updater->GetList(); + ScopedListPrefUpdate updater(pref_service, prefs::kGuestOsContainers); + base::Value::List& update_list = updater.Get(); auto it = std::find_if( update_list.begin(), update_list.end(), [&](const auto& dict) { return MatchContainerDict(dict, container_id); }); @@ -158,8 +158,8 @@ void RemoveVmFromPrefs(Profile* profile, VmType vm_type) { auto* pref_service = profile->GetPrefs(); - ListPrefUpdate updater(pref_service, prefs::kGuestOsContainers); - base::Value::List& update_list = updater->GetList(); + ScopedListPrefUpdate updater(pref_service, prefs::kGuestOsContainers); + base::Value::List& update_list = updater.Get(); auto it = std::find_if( update_list.begin(), update_list.end(), [&](const auto& dict) { return VmTypeFromPref(dict) == vm_type; }); @@ -183,11 +183,11 @@ const GuestId& container_id, const std::string& key, base::Value value) { - ListPrefUpdate updater(profile->GetPrefs(), prefs::kGuestOsContainers); + ScopedListPrefUpdate updater(profile->GetPrefs(), prefs::kGuestOsContainers); auto it = std::find_if( - updater->GetListDeprecated().begin(), updater->GetListDeprecated().end(), + updater->begin(), updater->end(), [&](const auto& dict) { return MatchContainerDict(dict, container_id); }); - if (it != updater->GetListDeprecated().end()) { + if (it != updater->end()) { if (base::Contains(*kPropertiesAllowList, key)) { it->SetKey(key, std::move(value)); } else {
diff --git a/chrome/browser/ash/guest_os/guest_os_mime_types_service.cc b/chrome/browser/ash/guest_os/guest_os_mime_types_service.cc index 2ebd109..f3a68ae 100644 --- a/chrome/browser/ash/guest_os/guest_os_mime_types_service.cc +++ b/chrome/browser/ash/guest_os/guest_os_mime_types_service.cc
@@ -94,13 +94,13 @@ const std::string& vm_name, const std::string& container_name) { VLOG(1) << "ClearMimeTypes(" << vm_name << ", " << container_name << ")"; - DictionaryPrefUpdate update(prefs_, prefs::kGuestOsMimeTypes); - base::Value* mime_types = update.Get(); - base::Value* vm = mime_types->FindDictKey(vm_name); + ScopedDictPrefUpdate update(prefs_, prefs::kGuestOsMimeTypes); + base::Value::Dict& mime_types = update.Get(); + base::Value::Dict* vm = mime_types.FindDict(vm_name); if (vm) { - vm->RemoveKey(container_name); - if (container_name.empty() || vm->DictEmpty()) { - mime_types->RemoveKey(vm_name); + vm->Remove(container_name); + if (container_name.empty() || vm->empty()) { + mime_types.Remove(vm_name); } } } @@ -128,14 +128,10 @@ } VLOG(1) << "UpdateMimeTypes(" << mime_type_mappings.vm_name() << ", " << mime_type_mappings.container_name() << ")=" << exts; - DictionaryPrefUpdate update(prefs_, prefs::kGuestOsMimeTypes); - base::Value* mime_types = update.Get(); - base::Value* vm = mime_types->FindDictKey(mime_type_mappings.vm_name()); - if (!vm) { - vm = mime_types->SetKey(mime_type_mappings.vm_name(), - base::Value(base::Value::Type::DICTIONARY)); - } - vm->SetKey(mime_type_mappings.container_name(), std::move(exts)); + ScopedDictPrefUpdate update(prefs_, prefs::kGuestOsMimeTypes); + base::Value::Dict& mime_types = update.Get(); + base::Value::Dict* vm = mime_types.EnsureDict(mime_type_mappings.vm_name()); + vm->Set(mime_type_mappings.container_name(), std::move(exts)); } } // namespace guest_os
diff --git a/chrome/browser/ash/guest_os/guest_os_registry_service.cc b/chrome/browser/ash/guest_os/guest_os_registry_service.cc index 61f372b..cd4d6cc 100644 --- a/chrome/browser/ash/guest_os/guest_os_registry_service.cc +++ b/chrome/browser/ash/guest_os/guest_os_registry_service.cc
@@ -827,12 +827,12 @@ const std::string& vm_name, const std::string& container_name) { std::vector<std::string> removed_apps; - // The DictionaryPrefUpdate should be destructed before calling the observer. + // The ScopedDictPrefUpdate should be destructed before calling the observer. { - DictionaryPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); - base::Value* apps = update.Get(); + ScopedDictPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); + base::Value::Dict& apps = update.Get(); - for (const auto item : apps->DictItems()) { + for (const auto item : apps) { Registration registration(item.first, item.second.Clone()); if (vm_type != registration.VmType()) { continue; @@ -848,7 +848,7 @@ } for (const std::string& removed_app : removed_apps) { RemoveAppData(removed_app); - apps->RemoveKey(removed_app); + apps.Remove(removed_app); } } @@ -885,10 +885,10 @@ std::vector<std::string> removed_apps; std::vector<std::string> inserted_apps; - // The DictionaryPrefUpdate should be destructed before calling the observer. + // The ScopedDictPrefUpdate should be destructed before calling the observer. { - DictionaryPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); - base::Value* apps = update.Get(); + ScopedDictPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); + base::Value::Dict& apps = update.Get(); for (const App& app : app_list.apps()) { if (app.desktop_file_id().empty()) { LOG(WARNING) << "Received app with missing desktop file id"; @@ -911,7 +911,7 @@ pref_registration, app_list.vm_type(), app_list.vm_name(), app_list.container_name(), app, std::move(name)); - base::Value* old_app = apps->FindKey(app_id); + base::Value* old_app = apps.Find(app_id); if (old_app && EqualsExcludingTimestamps(pref_registration, *old_app)) { continue; } @@ -940,10 +940,10 @@ old_last_launch_time->Clone()); } - apps->SetKey(app_id, std::move(pref_registration)); + apps.Set(app_id, std::move(pref_registration)); } - for (const auto item : apps->DictItems()) { + for (const auto item : apps) { std::string vm_name = GetStringKey(item.second, guest_os::prefs::kVmNameKey); std::string container_name = @@ -960,7 +960,7 @@ for (const std::string& removed_app : removed_apps) { RemoveAppData(removed_app); - apps->RemoveKey(removed_app); + apps.Remove(removed_app); } } @@ -1026,9 +1026,8 @@ } void GuestOsRegistryService::AppLaunched(const std::string& app_id) { - DictionaryPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); - base::Value* apps = update.Get(); - base::Value* app = apps->FindKey(app_id); + ScopedDictPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); + base::Value* app = update->Find(app_id); DCHECK(app); SetCurrentTime(app, guest_os::prefs::kAppLastLaunchTimeKey); } @@ -1042,17 +1041,17 @@ void GuestOsRegistryService::SetAppScaled(const std::string& app_id, bool scaled) { - DictionaryPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); - base::Value* apps = update.Get(); + ScopedDictPrefUpdate update(prefs_, guest_os::prefs::kGuestOsRegistry); + base::Value::Dict& apps = update.Get(); - base::Value* app = apps->FindKey(app_id); + base::Value::Dict* app = apps.FindDict(app_id); if (!app) { LOG(ERROR) << "Tried to set display scaled property on the app with this app_id " << app_id << " that doesn't exist in the registry."; return; } - app->SetKey(guest_os::prefs::kAppScaledKey, base::Value(scaled)); + app->Set(guest_os::prefs::kAppScaledKey, scaled); } // static
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path.cc b/chrome/browser/ash/guest_os/guest_os_share_path.cc index 43693ec..f969e70 100644 --- a/chrome/browser/ash/guest_os/guest_os_share_path.cc +++ b/chrome/browser/ash/guest_os/guest_os_share_path.cc
@@ -533,8 +533,8 @@ if (unpersist) { PrefService* pref_service = profile_->GetPrefs(); - DictionaryPrefUpdate update(pref_service, prefs::kGuestOSPathsSharedToVms); - RemovePersistedPathFromPrefs(update->GetDict(), vm_name, path); + ScopedDictPrefUpdate update(pref_service, prefs::kGuestOSPathsSharedToVms); + RemovePersistedPathFromPrefs(*update, vm_name, path); } CallSeneschalUnsharePath(vm_name, path, std::move(callback)); @@ -582,8 +582,8 @@ void GuestOsSharePath::RegisterPersistedPath(const std::string& vm_name, const base::FilePath& path) { PrefService* pref_service = profile_->GetPrefs(); - DictionaryPrefUpdate update(pref_service, prefs::kGuestOSPathsSharedToVms); - base::Value::Dict& shared_paths = update->GetDict(); + ScopedDictPrefUpdate update(pref_service, prefs::kGuestOSPathsSharedToVms); + base::Value::Dict& shared_paths = *update; // Check if path is already shared so we know whether we need to add it. bool already_shared = false; // Remove any paths that are children of this path.
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc index f0317cb1..97c96b5 100644 --- a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc +++ b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
@@ -254,12 +254,11 @@ share_path_ = root_.Append("path-to-share"); shared_path_ = root_.Append("already-shared"); ASSERT_TRUE(base::CreateDirectory(shared_path_)); - DictionaryPrefUpdate update(profile()->GetPrefs(), + ScopedDictPrefUpdate update(profile()->GetPrefs(), prefs::kGuestOSPathsSharedToVms); - base::Value* shared_paths = update.Get(); - base::Value termina(base::Value::Type::LIST); - termina.Append(base::Value(crostini::kCrostiniDefaultVmName)); - shared_paths->SetKey(shared_path_.value(), std::move(termina)); + base::Value::List termina; + termina.Append(crostini::kCrostiniDefaultVmName); + update->Set(shared_path_.value(), std::move(termina)); volume_downloads_ = file_manager::Volume::CreateForDownloads(root_); guest_os_share_path_->RegisterSharedPath(crostini::kCrostiniDefaultVmName, shared_path_); @@ -812,12 +811,11 @@ TEST_F(GuestOsSharePathTest, UnsharePathSuccess) { SetUpVolume(); - DictionaryPrefUpdate update(profile()->GetPrefs(), + ScopedDictPrefUpdate update(profile()->GetPrefs(), prefs::kGuestOSPathsSharedToVms); - base::Value* shared_paths = update.Get(); - base::Value vms(base::Value::Type::LIST); - vms.Append(base::Value("vm-running")); - shared_paths->SetKey(shared_path_.value(), std::move(vms)); + base::Value::List vms; + vms.Append("vm-running"); + update->Set(shared_path_.value(), std::move(vms)); guest_os_share_path_->UnsharePath( "vm-running", shared_path_, true, base::BindOnce(&GuestOsSharePathTest::UnsharePathCallback, @@ -839,12 +837,11 @@ TEST_F(GuestOsSharePathTest, UnsharePathVmNotRunning) { SetUpVolume(); - DictionaryPrefUpdate update(profile()->GetPrefs(), + ScopedDictPrefUpdate update(profile()->GetPrefs(), prefs::kGuestOSPathsSharedToVms); - base::Value* shared_paths = update.Get(); - base::Value vms(base::Value::Type::LIST); - vms.Append(base::Value("vm-not-running")); - shared_paths->SetKey(shared_path_.value(), std::move(vms)); + base::Value::List vms; + vms.Append("vm-not-running"); + update->Set(shared_path_.value(), std::move(vms)); guest_os_share_path_->UnsharePath( "vm-not-running", shared_path_, true, base::BindOnce(&GuestOsSharePathTest::UnsharePathCallback, @@ -856,12 +853,11 @@ TEST_F(GuestOsSharePathTest, UnsharePathPluginVmNotRunning) { SetUpVolume(); - DictionaryPrefUpdate update(profile()->GetPrefs(), + ScopedDictPrefUpdate update(profile()->GetPrefs(), prefs::kGuestOSPathsSharedToVms); - base::Value* shared_paths = update.Get(); - base::Value vms(base::Value::Type::LIST); - vms.Append(base::Value("PvmDefault")); - shared_paths->SetKey(shared_path_.value(), std::move(vms)); + base::Value::List vms; + vms.Append("PvmDefault"); + update->Set(shared_path_.value(), std::move(vms)); guest_os_share_path_->UnsharePath( "PvmDefault", shared_path_, true, base::BindOnce(&GuestOsSharePathTest::UnsharePathCallback, @@ -874,12 +870,11 @@ // Tests that it cannot unshare path when ARCVM is not running. TEST_F(GuestOsSharePathTest, UnsharePathArcvmNotRunning) { SetUpVolume(); - DictionaryPrefUpdate update(profile()->GetPrefs(), + ScopedDictPrefUpdate update(profile()->GetPrefs(), prefs::kGuestOSPathsSharedToVms); - base::Value* shared_paths = update.Get(); - base::Value vms(base::Value::Type::LIST); - vms.Append(base::Value(arc::kArcVmName)); - shared_paths->SetKey(shared_path_.value(), std::move(vms)); + base::Value::List vms; + vms.Append(arc::kArcVmName); + update->Set(shared_path_.value(), std::move(vms)); // Remove VmInfo from |arc_session_manager_| to simulate a stopped ARCVM. vm_tools::concierge::VmStoppedSignal stop_signal;
diff --git a/chrome/browser/ash/guest_os/guest_os_terminal.cc b/chrome/browser/ash/guest_os/guest_os_terminal.cc index 5d5e208..c3df1f28 100644 --- a/chrome/browser/ash/guest_os/guest_os_terminal.cc +++ b/chrome/browser/ash/guest_os/guest_os_terminal.cc
@@ -141,9 +141,8 @@ } // namespace void RemoveTerminalFromRegistry(PrefService* prefs) { - DictionaryPrefUpdate update(prefs, guest_os::prefs::kGuestOsRegistry); - base::Value* apps = update.Get(); - apps->RemoveKey(kTerminalSystemAppId); + ScopedDictPrefUpdate update(prefs, guest_os::prefs::kGuestOsRegistry); + update->Remove(kTerminalSystemAppId); } const std::string& GetTerminalHomeUrl() {
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc index 8138d83..6adab769 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -544,8 +544,9 @@ void DemoSession::OnSessionStateChanged() { switch (session_manager::SessionManager::Get()->session_state()) { case session_manager::SessionState::LOGIN_PRIMARY: - EnsureResourcesLoaded(base::BindOnce(&DemoSession::ShowSplashScreen, - weak_ptr_factory_.GetWeakPtr())); + EnsureResourcesLoaded( + base::BindOnce(&DemoSession::ConfigureAndStartSplashScreen, + weak_ptr_factory_.GetWeakPtr())); break; case session_manager::SessionState::ACTIVE: if (ShouldRemoveSplashScreen()) @@ -620,15 +621,13 @@ FROM_HERE, base::BindOnce(&LaunchDemoSystemWebApp)); } -void DemoSession::ShowSplashScreen() { - const std::string current_locale = g_browser_process->GetApplicationLocale(); - base::FilePath image_path = demo_resources_->path() - .Append(kSplashScreensPath) - .Append(current_locale + ".jpg"); - if (!base::PathExists(image_path)) { - image_path = - demo_resources_->path().Append(kSplashScreensPath).Append("en-US.jpg"); - } +base::FilePath GetSplashScreenImagePath(base::FilePath localized_image_path, + base::FilePath fallback_path) { + return base::PathExists(localized_image_path) ? localized_image_path + : fallback_path; +} + +void DemoSession::ShowSplashScreen(base::FilePath image_path) { WallpaperControllerClientImpl::Get()->ShowAlwaysOnTopWallpaper(image_path); remove_splash_screen_fallback_timer_->Start( FROM_HERE, kRemoveSplashScreenTimeout, @@ -636,6 +635,21 @@ weak_ptr_factory_.GetWeakPtr())); } +void DemoSession::ConfigureAndStartSplashScreen() { + const std::string current_locale = g_browser_process->GetApplicationLocale(); + base::FilePath localized_image_path = demo_resources_->path() + .Append(kSplashScreensPath) + .Append(current_locale + ".jpg"); + base::FilePath fallback_path = + demo_resources_->path().Append(kSplashScreensPath).Append("en-US.jpg"); + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, + base::BindOnce(&GetSplashScreenImagePath, localized_image_path, + fallback_path), + base::BindOnce(&DemoSession::ShowSplashScreen, + weak_ptr_factory_.GetWeakPtr())); +} + void DemoSession::RemoveSplashScreen() { if (splash_screen_removed_) return;
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.h b/chrome/browser/ash/login/demo_mode/demo_session.h index e9cbe86..3fda025bd 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.h +++ b/chrome/browser/ash/login/demo_mode/demo_session.h
@@ -203,8 +203,11 @@ // launch the app upon installation. void InstallAppFromUpdateUrl(const std::string& id); - // Shows the splash screen after demo mode resources are installed. - void ShowSplashScreen(); + // Find image path then show the splash screen. + void ConfigureAndStartSplashScreen(); + + // Show, and set the fallback timeout to remove, the splash screen. + void ShowSplashScreen(base::FilePath image_path); // Removes the splash screen. void RemoveSplashScreen();
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc index 7a6e717..c5f8b033 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/files/file_path.h" #include "base/strings/utf_string_conversions.h" +#include "base/task/thread_pool/thread_pool_instance.h" #include "base/timer/mock_timer.h" #include "chrome/browser/ash/login/demo_mode/demo_resources.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" @@ -191,6 +192,8 @@ ASSERT_TRUE(FinishResourcesComponentLoad( base::FilePath(kTestDemoModeResourcesMountPoint))); + // Wait for splash screen image to load and timer to be set + task_environment_.RunUntilIdle(); EXPECT_EQ(1, test_wallpaper_controller_.show_always_on_top_wallpaper_count()); EXPECT_EQ(0, test_wallpaper_controller_.remove_always_on_top_wallpaper_count()); @@ -243,6 +246,8 @@ ASSERT_TRUE(FinishResourcesComponentLoad( base::FilePath(kTestDemoModeResourcesMountPoint))); + // Wait for splash screen image to load and timer to be set + task_environment_.RunUntilIdle(); EXPECT_EQ(1, test_wallpaper_controller_.show_always_on_top_wallpaper_count()); EXPECT_EQ(0, test_wallpaper_controller_.remove_always_on_top_wallpaper_count());
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc index c1556a09..6c02e60 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
@@ -32,6 +32,7 @@ #include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ash/login/test/enrollment_helper_mixin.h" #include "chrome/browser/ash/login/test/js_checker.h" +#include "chrome/browser/ash/login/test/login_or_lock_screen_visible_waiter.h" #include "chrome/browser/ash/login/test/oobe_base_test.h" #include "chrome/browser/ash/login/test/oobe_screen_waiter.h" #include "chrome/browser/ash/login/test/oobe_screens_utils.h" @@ -39,6 +40,7 @@ #include "chrome/browser/ash/login/test/test_predicate_waiter.h" #include "chrome/browser/ash/login/ui/login_display_host.h" #include "chrome/browser/ash/login/wizard_controller.h" +#include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" #include "chrome/browser/component_updater/cros_component_installer_chromeos.h" #include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h" @@ -60,6 +62,7 @@ #include "chromeos/system/fake_statistics_provider.h" #include "chromeos/system/statistics_provider.h" #include "components/policy/core/common/cloud/mock_cloud_policy_store.h" +#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" @@ -334,12 +337,13 @@ } void AcceptTermsAndExpectDemoSetupProgress() { + test::LockDemoDeviceInstallAttributes(); + // TODO(b/246012796): If possible, re-enable waiting on the setup screen to + // be shown if (chromeos::features::IsOobeConsolidatedConsentEnabled()) { WaitForConsolidatedConsentScreen(); - OobeScreenWaiter setup_progress_waiter(DemoSetupScreenView::kScreenId); test::TapConsolidatedConsentAccept(); - setup_progress_waiter.Wait(); } else { test::WaitForEulaScreen(); test::TapEulaAccept(); @@ -348,11 +352,7 @@ test::OobeJS().ExpectVisiblePath(kArcTosDemoAppsNotice); - // As setup screen shows only progress indicator and disappears afterwards - // we need to set up waiter before the action that triggers the screen. - OobeScreenWaiter setup_progress_waiter(DemoSetupScreenView::kScreenId); AcceptArcTos(); - setup_progress_waiter.Wait(); } } @@ -428,7 +428,9 @@ EXPECT_EQ("admin-fr@cros-demo-mode.com", DemoSetupController::GetSubOrganizationEmail()); - OobeScreenWaiter(GetFirstSigninScreen()).Wait(); + // LoginOrLockScreen is shown at beginning of OOBE, so we need to wait until + // it's shown again when Demo setup completes + LoginOrLockScreenVisibleWaiter().WaitEvenIfShown(); EXPECT_TRUE(StartupUtils::IsOobeCompleted()); EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); @@ -524,7 +526,9 @@ EXPECT_EQ("admin-us@cros-demo-mode.com", DemoSetupController::GetSubOrganizationEmail()); - OobeScreenWaiter(GetFirstSigninScreen()).Wait(); + // LoginOrLockScreen is shown at beginning of OOBE, so we need to wait until + // it's shown again when Demo setup completes + LoginOrLockScreenVisibleWaiter().WaitEvenIfShown(); EXPECT_TRUE(StartupUtils::IsOobeCompleted()); EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); @@ -586,7 +590,9 @@ EXPECT_EQ("admin-us@cros-demo-mode.com", DemoSetupController::GetSubOrganizationEmail()); - OobeScreenWaiter(GetFirstSigninScreen()).Wait(); + // LoginOrLockScreen is shown at beginning of OOBE, so we need to wait until + // it's shown again when Demo setup completes + LoginOrLockScreenVisibleWaiter().WaitEvenIfShown(); EXPECT_EQ("ABC", g_browser_process->local_state()->GetString( prefs::kDemoModeRetailerId)); @@ -813,6 +819,7 @@ test::OobeJS().ClickOnPath(kDemoPreferencesNext); AcceptTermsAndExpectDemoSetupFailure(); + test::LockDemoDeviceInstallAttributes(); // We need to create another mock after showing error dialog. enrollment_helper_.ResetMock(); @@ -823,7 +830,9 @@ test::OobeJS().ClickOnPath(kDemoSetupErrorDialogRetry); - OobeScreenWaiter(GetFirstSigninScreen()).Wait(); + // LoginOrLockScreen is shown at beginning of OOBE, so we need to wait until + // it's shown again when Demo setup completes + LoginOrLockScreenVisibleWaiter().WaitEvenIfShown(); EXPECT_TRUE(StartupUtils::IsOobeCompleted()); EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); @@ -970,7 +979,9 @@ EXPECT_EQ("admin-ca@cros-demo-mode.com", DemoSetupController::GetSubOrganizationEmail()); - OobeScreenWaiter(GetFirstSigninScreen()).Wait(); + // LoginOrLockScreen is shown at beginning of OOBE, so we need to wait until + // it's shown again when Demo setup completes + LoginOrLockScreenVisibleWaiter().WaitEvenIfShown(); EXPECT_TRUE(StartupUtils::IsOobeCompleted()); EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); @@ -1093,7 +1104,9 @@ EXPECT_EQ("admin-us-blazey@cros-demo-mode.com", DemoSetupController::GetSubOrganizationEmail()); - OobeScreenWaiter(GetFirstSigninScreen()).Wait(); + // LoginOrLockScreen is shown at beginning of OOBE, so we need to wait until + // it's shown again when Demo setup completes + LoginOrLockScreenVisibleWaiter().WaitEvenIfShown(); EXPECT_TRUE(StartupUtils::IsOobeCompleted()); EXPECT_TRUE(StartupUtils::IsDeviceRegistered());
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.cc b/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.cc index 888174d3f..4b9e8785 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.cc
@@ -7,8 +7,12 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/logging.h" +#include "base/run_loop.h" #include "base/threading/thread_restrictions.h" +#include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_platform_part.h" #include "components/policy/proto/device_management_backend.pb.h" namespace ash { @@ -100,5 +104,25 @@ return true; } +// Helper InstallAttributes::LockResultCallback implementation. +void OnEnterpriseDeviceLock(base::OnceClosure runner_quit_task, + InstallAttributes::LockResult in_locked) { + LOG(INFO) << "Enterprise lock = " << in_locked; + std::move(runner_quit_task).Run(); +} + +void LockDemoDeviceInstallAttributes() { + base::RunLoop run_loop; + policy::BrowserPolicyConnectorAsh* connector = + g_browser_process->platform_part()->browser_policy_connector_ash(); + LOG(INFO) << "Locking demo mode install attributes"; + connector->GetInstallAttributes()->LockDevice( + policy::DEVICE_MODE_ENTERPRISE, "domain.com", + std::string(), // realm + "device-id", + base::BindOnce(&OnEnterpriseDeviceLock, run_loop.QuitClosure())); + run_loop.Run(); +} + } // namespace test } // namespace ash
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h b/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h index c4cac15..72c3fcd 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h +++ b/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h
@@ -43,6 +43,10 @@ bool SetupDummyOfflinePolicyDir(const std::string& account_id, base::ScopedTempDir* temp_dir); +// Set Install Attributes as part of faked enrollment so that the device is +// considered enterprise managed +void LockDemoDeviceInstallAttributes(); + } // namespace test } // namespace ash
diff --git a/chrome/browser/ash/login/lock/screen_locker_browsertest.cc b/chrome/browser/ash/login/lock/screen_locker_browsertest.cc index 099cc83..387968c 100644 --- a/chrome/browser/ash/login/lock/screen_locker_browsertest.cc +++ b/chrome/browser/ash/login/lock/screen_locker_browsertest.cc
@@ -10,6 +10,7 @@ #include "ash/wm/window_state.h" #include "base/bind.h" #include "base/run_loop.h" +#include "build/build_config.h" #include "chrome/browser/ash/login/lock/screen_locker_tester.h" #include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h" #include "chrome/browser/ash/login/ui/user_adding_screen.h" @@ -111,7 +112,13 @@ } // Test how locking the screen affects an active fullscreen window. -IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestFullscreenExit) { +// TODO(crbug.com/1364698): Fix flakiness on Linux builder. +#if BUILDFLAG(IS_LINUX) +#define MAYBE_TestFullscreenExit DISABLED_TestFullscreenExit +#else +#define MAYBE_TestFullscreenExit TestFullscreenExit +#endif +IN_PROC_BROWSER_TEST_F(ScreenLockerTest, MAYBE_TestFullscreenExit) { // 1) If the active browser window is in fullscreen and the fullscreen window // does not have all the pixels (e.g. the shelf is auto hidden instead of // hidden), locking the screen should exit fullscreen. The shelf is
diff --git a/chrome/browser/ash/login/saml/saml_browsertest.cc b/chrome/browser/ash/login/saml/saml_browsertest.cc index 662da9f0..2e8a7cf 100644 --- a/chrome/browser/ash/login/saml/saml_browsertest.cc +++ b/chrome/browser/ash/login/saml/saml_browsertest.cc
@@ -879,9 +879,8 @@ // Verifies that if the authenticated user's e-mail address cannot be retrieved, // an error message is shown. -// TODO(crbug.com/1348198): Flaky. IN_PROC_BROWSER_TEST_P(SamlTestWithFeatures, - DISABLED_FailToRetrieveAutenticatedUserEmailAddress) { + FailToRetrieveAutenticatedUserEmailAddress) { fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html"); StartSamlAndWaitForIdpPageLoad( saml_test_users::kFirstUserCorpExampleComEmail);
diff --git a/chrome/browser/ash/login/screens/lacros_data_migration_screen.cc b/chrome/browser/ash/login/screens/lacros_data_migration_screen.cc index ef1d8d50..11b0570 100644 --- a/chrome/browser/ash/login/screens/lacros_data_migration_screen.cc +++ b/chrome/browser/ash/login/screens/lacros_data_migration_screen.cc
@@ -6,6 +6,7 @@ #include "ash/constants/ash_switches.h" #include "base/command_line.h" +#include "base/memory/weak_ptr.h" #include "base/path_service.h" #include "base/strings/string_number_conversions.h" #include "base/task/bind_post_task.h" @@ -14,6 +15,7 @@ #include "base/time/time.h" #include "chrome/browser/ash/crosapi/browser_data_migrator.h" #include "chrome/browser/ash/crosapi/browser_util.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/lifetime/application_lifetime.h" @@ -36,20 +38,15 @@ } // namespace LacrosDataMigrationScreen::LacrosDataMigrationScreen( - LacrosDataMigrationScreenView* view) + base::WeakPtr<LacrosDataMigrationScreenView> view) : BaseScreen(LacrosDataMigrationScreenView::kScreenId, OobeScreenPriority::SCREEN_DEVICE_DEVELOPER_MODIFICATION), - view_(view), + view_(std::move(view)), attempt_restart_(base::BindRepeating(&chrome::AttemptRestart)) { DCHECK(view_); - if (view_) - view_->Bind(this); } -LacrosDataMigrationScreen::~LacrosDataMigrationScreen() { - if (view_) - view_->Unbind(); -} +LacrosDataMigrationScreen::~LacrosDataMigrationScreen() = default; void LacrosDataMigrationScreen::OnViewVisible() { // If set, do not post `ShowSkipButton()`. @@ -65,12 +62,6 @@ kShowSkipButtonDuration); } -void LacrosDataMigrationScreen::OnViewDestroyed( - LacrosDataMigrationScreenView* view) { - if (view_ == view) - view_ = nullptr; -} - void LacrosDataMigrationScreen::ShowImpl() { if (!view_) return; @@ -148,6 +139,11 @@ base::BindOnce(&LacrosDataMigrationScreen::OnMigrated, weak_factory_.GetWeakPtr())); + if (LoginDisplayHost::default_host() && + LoginDisplayHost::default_host()->GetOobeUI()) { + observation_.Observe(LoginDisplayHost::default_host()->GetOobeUI()); + } + // Show the screen. view_->Show(); @@ -156,15 +152,18 @@ } void LacrosDataMigrationScreen::OnProgressUpdate(int progress) { - view_->SetProgressValue(progress); + if (view_) { + view_->SetProgressValue(progress); + } } void LacrosDataMigrationScreen::ShowSkipButton() { - view_->ShowSkipButton(); + if (view_) { + view_->ShowSkipButton(); + } } - -void LacrosDataMigrationScreen::OnUserActionDeprecated( - const std::string& action_id) { +void LacrosDataMigrationScreen::OnUserAction(const base::Value::List& args) { + const std::string& action_id = args[0].GetString(); if (action_id == kUserActionSkip) { LOG(WARNING) << "User has skipped the migration."; if (migrator_) { @@ -189,10 +188,23 @@ base::BindOnce(&LacrosDataMigrationScreen::OnLocalStateCommited, weak_factory_.GetWeakPtr())); } else { - BaseScreen::OnUserActionDeprecated(action_id); + BaseScreen::OnUserAction(args); } } +void LacrosDataMigrationScreen::OnCurrentScreenChanged( + OobeScreenId current_screen, + OobeScreenId new_screen) { + if (new_screen == LacrosDataMigrationScreenView::kScreenId) { + OnViewVisible(); + observation_.Reset(); + } +} + +void LacrosDataMigrationScreen::OnDestroyingOobeUI() { + observation_.Reset(); +} + void LacrosDataMigrationScreen::OnMigrated(BrowserDataMigrator::Result result) { switch (result.kind) { case BrowserDataMigrator::ResultKind::kSkipped: @@ -230,10 +242,12 @@ chromeos::PowerManagerClient::Get()->GetLastStatus(); if (!proto.has_value()) return; - view_->SetLowBatteryStatus( - proto->battery_state() == - power_manager::PowerSupplyProperties_BatteryState_DISCHARGING && - proto->battery_percent() < kInsufficientBatteryPercent); + if (view_) { + view_->SetLowBatteryStatus( + proto->battery_state() == + power_manager::PowerSupplyProperties_BatteryState_DISCHARGING && + proto->battery_percent() < kInsufficientBatteryPercent); + } } device::mojom::WakeLock* LacrosDataMigrationScreen::GetWakeLock() {
diff --git a/chrome/browser/ash/login/screens/lacros_data_migration_screen.h b/chrome/browser/ash/login/screens/lacros_data_migration_screen.h index 480eb3c..ea55db7e 100644 --- a/chrome/browser/ash/login/screens/lacros_data_migration_screen.h +++ b/chrome/browser/ash/login/screens/lacros_data_migration_screen.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_ASH_LOGIN_SCREENS_LACROS_DATA_MIGRATION_SCREEN_H_ #include "base/callback_forward.h" +#include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "chrome/browser/ash/crosapi/browser_data_migrator.h" #include "chrome/browser/ash/login/screens/base_screen.h" @@ -19,11 +20,12 @@ // A screen that shows loading spinner during user data is copied to lacros // directory. The screen is shown during login. -class LacrosDataMigrationScreen - : public BaseScreen, - public chromeos::PowerManagerClient::Observer { +class LacrosDataMigrationScreen : public BaseScreen, + public chromeos::PowerManagerClient::Observer, + public OobeUI::Observer { public: - explicit LacrosDataMigrationScreen(LacrosDataMigrationScreenView* view); + explicit LacrosDataMigrationScreen( + base::WeakPtr<LacrosDataMigrationScreenView> view); ~LacrosDataMigrationScreen() override; LacrosDataMigrationScreen(const LacrosDataMigrationScreen&) = delete; LacrosDataMigrationScreen& operator=(const LacrosDataMigrationScreen&) = @@ -32,10 +34,6 @@ // Called when `view` gets visible. void OnViewVisible(); - // Called when `view` has been destroyed. If this instance is destroyed before - // the `view` it should call view->Unbind(). - void OnViewDestroyed(LacrosDataMigrationScreenView* view); - // Passed to `BrowserDataMigrator` as a callback to transmit the progress // value. `progress` is then passed to `LacrosDataMigrationView`. void OnProgressUpdate(int progress); @@ -63,7 +61,12 @@ // BaseScreen: void ShowImpl() override; void HideImpl() override; - void OnUserActionDeprecated(const std::string& action_id) override; + void OnUserAction(const base::Value::List& args) override; + + // OobeUI::Observer: + void OnCurrentScreenChanged(OobeScreenId current_screen, + OobeScreenId new_screen) override; + void OnDestroyingOobeUI() override; // Updates the low battery message. void UpdateLowBatteryStatus(); @@ -78,7 +81,7 @@ mojo::Remote<device::mojom::WakeLock> wake_lock_; - LacrosDataMigrationScreenView* view_; + base::WeakPtr<LacrosDataMigrationScreenView> view_; std::unique_ptr<BrowserDataMigrator> migrator_; bool skip_post_show_button_for_testing_ = false; base::RepeatingClosure attempt_restart_; @@ -88,6 +91,8 @@ chromeos::PowerManagerClient::Observer> power_manager_subscription_{this}; + base::ScopedObservation<OobeUI, OobeUI::Observer> observation_{this}; + base::WeakPtrFactory<LacrosDataMigrationScreen> weak_factory_{this}; };
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 6f21ff0..49361b59 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -659,7 +659,7 @@ base::BindRepeating(&WizardController::OnWrongHWIDScreenExit, weak_factory_.GetWeakPtr()))); append(std::make_unique<LacrosDataMigrationScreen>( - oobe_ui->GetView<LacrosDataMigrationScreenHandler>())); + oobe_ui->GetView<LacrosDataMigrationScreenHandler>()->AsWeakPtr())); append(std::make_unique<LacrosDataBackwardMigrationScreen>( oobe_ui->GetView<LacrosDataBackwardMigrationScreenHandler>() ->AsWeakPtr())); @@ -1700,7 +1700,7 @@ switch (result) { case DemoSetupScreen::Result::COMPLETED: PerformOOBECompletedActions(); - ShowLoginScreen(); + SwitchWebUItoMojo(); break; case DemoSetupScreen::Result::CANCELED: ShowWelcomeScreen();
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc index 6611be12..d5b69b45 100644 --- a/chrome/browser/ash/login/wizard_controller_browsertest.cc +++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -24,6 +24,7 @@ #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/ash/base/locale_util.h" #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" +#include "chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h" #include "chrome/browser/ash/login/enrollment/auto_enrollment_controller.h" #include "chrome/browser/ash/login/enrollment/enrollment_screen.h" #include "chrome/browser/ash/login/enrollment/enterprise_enrollment_helper.h" @@ -65,12 +66,14 @@ #include "chrome/browser/ash/net/network_portal_detector_test_impl.h" #include "chrome/browser/ash/net/rollback_network_config/fake_rollback_network_config.h" #include "chrome/browser/ash/net/rollback_network_config/rollback_network_config_service.h" +#include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/enrollment/auto_enrollment_client.h" #include "chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.h" #include "chrome/browser/ash/policy/enrollment/enrollment_config.h" #include "chrome/browser/ash/policy/enrollment/fake_auto_enrollment_client.h" #include "chrome/browser/ash/policy/server_backed_state/server_backed_device_state.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/lifetime/termination_notification.h" @@ -2608,6 +2611,7 @@ CheckCurrentScreen(DemoSetupScreenView::kScreenId); EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress()); + test::LockDemoDeviceInstallAttributes(); mock_demo_setup_screen_->ExitScreen(DemoSetupScreen::Result::COMPLETED); EXPECT_TRUE(StartupUtils::IsOobeCompleted());
diff --git a/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc b/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc index 6695c670..7f650eb 100644 --- a/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc +++ b/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc
@@ -12,12 +12,10 @@ #include "base/guid.h" #include "base/memory/raw_ptr.h" #include "base/test/mock_callback.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/autofill/android/personal_data_manager_android.h" #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/geo/country_names.h" -#include "components/autofill/core/common/autofill_features.h" #include "components/strings/grit/components_strings.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" @@ -38,12 +36,6 @@ class SaveUpdateAddressProfilePromptControllerTest : public testing::Test { public: void SetUp() override { - // Enable both explicit save prompts and structured names. - feature_list_.InitWithFeatures( - {features::kAutofillAddressProfileSavePrompt, - features::kAutofillEnableSupportForMoreStructureInNames}, - {}); - profile_ = test::GetFullProfile(); original_profile_ = test::GetFullProfile(); original_profile_.SetInfo(NAME_FULL, u"John Doe", GetLocale()); @@ -72,7 +64,6 @@ std::string GetLocale() { return "en-US"; } - base::test::ScopedFeatureList feature_list_; raw_ptr<MockSaveUpdateAddressProfilePromptView> prompt_view_; AutofillProfile profile_; AutofillProfile original_profile_;
diff --git a/chrome/browser/chrome_service_worker_browsertest.cc b/chrome/browser/chrome_service_worker_browsertest.cc index 473f69f9..f9c4389 100644 --- a/chrome/browser/chrome_service_worker_browsertest.cc +++ b/chrome/browser/chrome_service_worker_browsertest.cc
@@ -196,6 +196,7 @@ NavigateToPageAndWaitForReadyTitle("/test.html"); blink::TransferableMessage msg = blink::EncodeWebMessagePayload(message_data); + msg.sender_agent_cluster_id = base::UnguessableToken::Create(); GURL url = embedded_test_server()->GetURL("/scope/"); GetServiceWorkerContext()->StartServiceWorkerAndDispatchMessage(
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc index 9d419c2c..ebca411 100644 --- a/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -24,7 +24,6 @@ #include "build/build_config.h" #include "build/buildflag.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h" #include "chrome/browser/extensions/api/identity/identity_api.h" #include "chrome/browser/extensions/api/identity/identity_constants.h" @@ -54,6 +53,9 @@ #include "chrome/test/base/in_process_browser_test.h" #include "components/crx_file/id_util.h" #include "components/guest_view/browser/guest_view_base.h" +#include "components/guest_view/browser/guest_view_manager_delegate.h" +#include "components/guest_view/browser/guest_view_manager_factory.h" +#include "components/guest_view/browser/test_guest_view_manager.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/account_reconcilor.h" #include "components/signin/public/base/list_accounts_test_utils.h" @@ -62,11 +64,10 @@ #include "components/signin/public/identity_manager/accounts_mutator.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/identity_test_utils.h" -#include "content/public/browser/notification_service.h" -#include "content/public/browser/notification_source.h" #include "content/public/browser/storage_partition.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/api/extensions_api_client.h" #include "extensions/browser/api_test_utils.h" #include "extensions/common/api/oauth2.h" #include "extensions/common/extension_builder.h" @@ -99,7 +100,11 @@ #include "chromeos/startup/browser_init_params.h" #endif +using extensions::ExtensionsAPIClient; using guest_view::GuestViewBase; +using guest_view::GuestViewManager; +using guest_view::TestGuestViewManager; +using guest_view::TestGuestViewManagerFactory; using testing::_; using testing::Return; @@ -288,52 +293,6 @@ raw_ptr<OAuth2MintTokenFlow::Delegate> delegate_; }; -// Waits for a specific GURL to generate a NOTIFICATION_LOAD_STOP event and -// saves a pointer to the window embedding the WebContents, which can be later -// closed. -class WaitForGURLAndCloseWindow : public content::WindowedNotificationObserver { - public: - explicit WaitForGURLAndCloseWindow(GURL url) - : WindowedNotificationObserver( - content::NOTIFICATION_LOAD_STOP, - content::NotificationService::AllSources()), - url_(std::move(url)), - embedder_web_contents_(nullptr) {} - - // NotificationObserver: - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override { - content::NavigationController* web_auth_flow_controller = - content::Source<content::NavigationController>(source).ptr(); - content::WebContents* web_contents = - web_auth_flow_controller->DeprecatedGetWebContents(); - - if (web_contents->GetLastCommittedURL() == url_) { - // It is safe to keep the pointer here, because we know in a test, that - // the WebContents won't go away before CloseEmbedderWebContents is - // called. Don't copy this code to production. - GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents); - embedder_web_contents_ = guest->embedder_web_contents(); - // Condtionally invoke parent class so that Wait will not exit - // until the target URL arrives. - content::WindowedNotificationObserver::Observe(type, source, details); - } - } - - // Closes the window embedding the WebContents. The action is separated from - // the Observe method to make sure the list of observers is not deleted, - // while some event is already being processed. (That causes ASAN failures.) - void CloseEmbedderWebContents() { - if (embedder_web_contents_) - embedder_web_contents_->Close(); - } - - private: - GURL url_; - raw_ptr<content::WebContents> embedder_web_contents_; -}; - } // namespace class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction { @@ -3271,11 +3230,39 @@ class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { public: + void SetUp() override { + GuestViewManager::set_factory_for_testing(&factory_); + AsyncExtensionBrowserTest::SetUp(); + } + + void TearDown() override { + AsyncExtensionBrowserTest::TearDown(); + GuestViewManager::set_factory_for_testing(nullptr); + } + void SetUpCommandLine(base::CommandLine* command_line) override { AsyncExtensionBrowserTest::SetUpCommandLine(command_line); // Reduce performance test variance by disabling background networking. command_line->AppendSwitch(switches::kDisableBackgroundNetworking); } + + TestGuestViewManager* GetGuestViewManager() { + TestGuestViewManager* manager = static_cast<TestGuestViewManager*>( + TestGuestViewManager::FromBrowserContext(browser()->profile())); + // Test code may access the TestGuestViewManager before it would be created + // during creation of the first guest. + if (!manager) { + manager = static_cast<TestGuestViewManager*>( + GuestViewManager::CreateWithDelegate( + browser()->profile(), + ExtensionsAPIClient::Get()->CreateGuestViewManagerDelegate( + browser()->profile()))); + } + return manager; + } + + private: + TestGuestViewManagerFactory factory_; }; IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { @@ -3291,14 +3278,18 @@ ExtensionBuilder("Test").Build()); function->set_extension(empty_extension.get()); - WaitForGURLAndCloseWindow popup_observer(auth_url); - std::string args = "[{\"interactive\": true, \"url\": \"" + auth_url.spec() + "\"}]"; RunFunctionAsync(function.get(), args); - popup_observer.Wait(); - popup_observer.CloseEmbedderWebContents(); + TestGuestViewManager* guest_view_manager = GetGuestViewManager(); + auto* guest_view = guest_view_manager->WaitForSingleGuestViewCreated(); + ASSERT_TRUE(guest_view); + + guest_view_manager->WaitUntilAttached(guest_view); + auto* embedder_web_contents = guest_view->embedder_web_contents(); + ASSERT_TRUE(embedder_web_contents); + embedder_web_contents->Close(); EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function.get())); }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 85bcbd1..84f0fd6 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2706,14 +2706,6 @@ "expiry_milestone": 110 }, { - "name": "enable-payment-request-basic-card", - "owners": [ "web-payments-team@google.com" ], - // This flag is used by developers to disable the "basic-card" method, to - // make sure their web pages do not break after Chrome deprecates - // "basic-card" in M100. - "expiry_milestone": 100 - }, - { "name": "enable-pci-guard-ui", "owners": [ "jimmyxgong", "cros-peripherals@google.com" ], "expiry_milestone": 112 @@ -6526,7 +6518,7 @@ { "name" : "unified-side-panel", "owners": [ "chrome-desktop-ui-sea@google.com", "corising", "pbos", "tluk" ], - "expiry_milestone" : 107 + "expiry_milestone" : 109 }, { "name": "unsafely-treat-insecure-origin-as-secure",
diff --git a/chrome/browser/payments/BUILD.gn b/chrome/browser/payments/BUILD.gn index a3f4d358..7e83d16 100644 --- a/chrome/browser/payments/BUILD.gn +++ b/chrome/browser/payments/BUILD.gn
@@ -27,6 +27,7 @@ "payment_handler_just_in_time_installation_browsertest.cc", "payment_handler_ui_browsertest.cc", "payment_handler_uninstall_browsertest.cc", + "payment_method_redirect_browsertest.cc", "payment_request_app_store_billing_browsertest.cc", "payment_request_can_make_payment_browsertest.cc", "payment_request_can_make_payment_event_browsertest.cc",
diff --git a/chrome/browser/payments/payment_method_redirect_browsertest.cc b/chrome/browser/payments/payment_method_redirect_browsertest.cc new file mode 100644 index 0000000..814b97f --- /dev/null +++ b/chrome/browser/payments/payment_method_redirect_browsertest.cc
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "chrome/test/payments/payment_request_platform_browsertest_base.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace payments { +namespace { + +using PaymentMethodRedirectTest = PaymentRequestPlatformBrowserTestBase; + +// Verify that a payment method identifier can be an HTTP 301 permanent redirect +// to its subdomain. +// +// Original payment method being used: +// https://test.example/redirect/pay +// +// Redirect destination: +// https://subdomain.test.example/redirect/destination/pay +IN_PROC_BROWSER_TEST_F(PaymentMethodRedirectTest, Redirect) { + NavigateTo("/redirect/redirect.html"); + + std::string domain = "test.example"; + std::string subdomain = "subdomain." + domain; + SetDownloaderAndIgnorePortInOriginComparisonForTesting( + {{domain, https_server()}, {subdomain, https_server()}}); + std::string payment_method = "https://" + domain + "/redirect/pay"; + + EXPECT_EQ(true, content::EvalJs(GetActiveWebContents(), + content::JsReplace("checkCanMakePayment($1)", + payment_method))); +} + +} // namespace +} // namespace payments
diff --git a/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc b/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc index 9d34c60..c0c104e9 100644 --- a/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc +++ b/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/feature_list.h" +#include "base/system/sys_info.h" #include "base/time/default_tick_clock.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -208,6 +209,10 @@ int tab_count_threshold = performance_manager::features::kHighEfficiencyModePromoTabCountThreshold .Get(); + int memory_percent_threshold = + performance_manager::features:: + kHighEfficiencyModePromoMemoryPercentThreshold.Get(); + uint64_t system_memory_kb = base::SysInfo::AmountOfPhysicalMemory() / 1024; DCHECK_GT(tab_count_threshold, 0); user_performance_tuning_manager_ = base::WrapUnique( new performance_manager::user_tuning::UserPerformanceTuningManager( @@ -217,7 +222,8 @@ base::WrapUnique(new performance_manager::user_tuning:: UserPerformanceTuningManager:: UserPerformanceTuningReceiverImpl), - static_cast<size_t>(tab_count_threshold)))); + tab_count_threshold, + system_memory_kb * 100 / memory_percent_threshold))); } #endif
diff --git a/chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h b/chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h index 26d4bd7..3416198 100644 --- a/chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h +++ b/chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h
@@ -115,6 +115,7 @@ ~UserPerformanceTuningReceiverImpl() override; void NotifyTabCountThresholdReached() override; + void NotifyMemoryThresholdReached() override; }; explicit UserPerformanceTuningManager( @@ -133,6 +134,7 @@ void UpdateBatterySaverModeState(); void NotifyTabCountThresholdReached(); + void NotifyMemoryThresholdReached(); // base::PowerStateObserver: void OnPowerStateChange(bool on_battery_power) override;
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc index 5cff699..119af052 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc
@@ -115,6 +115,17 @@ })); } +void UserPerformanceTuningManager::UserPerformanceTuningReceiverImpl:: + NotifyMemoryThresholdReached() { + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce([]() { + // Hitting this CHECK would mean this task is running after + // PostMainMessageLoopRun, which shouldn't happen. + CHECK(g_user_performance_tuning_manager); + GetInstance()->NotifyMemoryThresholdReached(); + })); +} + UserPerformanceTuningManager::UserPerformanceTuningManager( PrefService* local_state, std::unique_ptr<UserPerformanceTuningNotifier> notifier, @@ -235,6 +246,12 @@ } } +void UserPerformanceTuningManager::NotifyMemoryThresholdReached() { + for (auto& obs : observers_) { + obs.OnMemoryThresholdReached(); + } +} + void UserPerformanceTuningManager::OnPowerStateChange(bool on_battery_power) { on_battery_power_ = on_battery_power;
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc index 29cd0783..be3be75f 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc
@@ -4,23 +4,36 @@ #include "chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h" +#include "components/performance_manager/public/graph/process_node.h" + namespace performance_manager::user_tuning { UserPerformanceTuningNotifier::UserPerformanceTuningNotifier( std::unique_ptr<Receiver> receiver, + uint64_t resident_set_threshold_kb, int tab_count_threshold) : receiver_(std::move(receiver)), + resident_set_threshold_kb_(resident_set_threshold_kb), tab_count_threshold_(tab_count_threshold) {} UserPerformanceTuningNotifier::~UserPerformanceTuningNotifier() = default; void UserPerformanceTuningNotifier::OnPassedToGraph(Graph* graph) { CHECK(graph->GetAllPageNodes().empty()); + graph_ = graph; graph->AddPageNodeObserver(this); + + metrics_interest_token_ = performance_manager::ProcessMetricsDecorator:: + RegisterInterestForProcessMetrics(graph); + graph->AddSystemNodeObserver(this); } void UserPerformanceTuningNotifier::OnTakenFromGraph(Graph* graph) { + graph->RemoveSystemNodeObserver(this); + metrics_interest_token_.reset(); + graph->RemovePageNodeObserver(this); + graph_ = nullptr; } void UserPerformanceTuningNotifier::OnPageNodeAdded(const PageNode* page_node) { @@ -46,6 +59,23 @@ } } +void UserPerformanceTuningNotifier::OnProcessMemoryMetricsAvailable( + const SystemNode* system_node) { + uint64_t total_rss = 0; + for (const ProcessNode* process_node : graph_->GetAllProcessNodes()) { + total_rss += process_node->GetResidentSetKb(); + } + + // Only notify when the threshold is crossed, not if an update keeps the total + // RSS above the threshold. + if (total_rss >= resident_set_threshold_kb_ && + previous_total_rss_ < resident_set_threshold_kb_) { + receiver_->NotifyMemoryThresholdReached(); + } + + previous_total_rss_ = total_rss; +} + void UserPerformanceTuningNotifier::MaybeAddTabAndNotify( const PageNode* page_node) { if (page_node->GetType() == PageType::kTab) {
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h index 74785f65..1e443d7 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h
@@ -5,8 +5,10 @@ #ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_USER_TUNING_USER_PERFORMANCE_TUNING_NOTIFIER_H_ #define CHROME_BROWSER_PERFORMANCE_MANAGER_USER_TUNING_USER_PERFORMANCE_TUNING_NOTIFIER_H_ +#include "components/performance_manager/public/decorators/process_metrics_decorator.h" #include "components/performance_manager/public/graph/graph.h" #include "components/performance_manager/public/graph/page_node.h" +#include "components/performance_manager/public/graph/system_node.h" namespace performance_manager::user_tuning { @@ -14,7 +16,8 @@ // the graph and notify the UserPerformanceTuningManager when certain thresholds // are met. class UserPerformanceTuningNotifier : public performance_manager::GraphOwned, - public PageNode::ObserverDefaultImpl { + public PageNode::ObserverDefaultImpl, + public SystemNode::ObserverDefaultImpl { public: // The instance of this delegate will have its different functions invoked on // the Performance Manager sequence by the @@ -26,9 +29,14 @@ // Called when the current tab count reaches the threshold specified by // `tab_count_threshold`. virtual void NotifyTabCountThresholdReached() = 0; + + // Called when the current total resident set size of all processes exceeds + // `resident_set_threshold_kb`. + virtual void NotifyMemoryThresholdReached() = 0; }; UserPerformanceTuningNotifier(std::unique_ptr<Receiver> delegate, + uint64_t resident_set_threshold_kb, int tab_count_threshold); ~UserPerformanceTuningNotifier() override; @@ -42,10 +50,20 @@ void OnTypeChanged(const PageNode* page_node, PageType previous_type) override; + // SystemNode::ObserverDefaultImpl: + void OnProcessMemoryMetricsAvailable(const SystemNode* system_node) override; + private: void MaybeAddTabAndNotify(const PageNode* page_node); std::unique_ptr<Receiver> receiver_; + raw_ptr<Graph> graph_; + + std::unique_ptr< + performance_manager::ProcessMetricsDecorator::ScopedMetricsInterestToken> + metrics_interest_token_; + const uint64_t resident_set_threshold_kb_ = 0; + uint64_t previous_total_rss_ = 0; const int tab_count_threshold_ = 0; int tab_count_ = 0;
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier_unittest.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier_unittest.cc index b59489ab..81d7e620 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier_unittest.cc +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier_unittest.cc
@@ -17,24 +17,33 @@ ++tab_count_threshold_reached_count_; } + void NotifyMemoryThresholdReached() override { + ++memory_percent_threshold_reached_count_; + } + int tab_count_threshold_reached_count_ = 0; + int memory_percent_threshold_reached_count_ = 0; }; void SetUp() override { GraphTestHarness::SetUp(); + graph()->PassToGraph( + std::make_unique<performance_manager::ProcessMetricsDecorator>()); + auto receiver = std::make_unique<TestReceiver>(); receiver_ = receiver.get(); - auto notifier = - std::make_unique<UserPerformanceTuningNotifier>(std::move(receiver), 2); + auto notifier = std::make_unique<UserPerformanceTuningNotifier>( + std::move(receiver), /*memory_theshold_kb=*/10, + /*tab_count_threshold=*/2); graph()->PassToGraph(std::move(notifier)); } raw_ptr<TestReceiver> receiver_; }; -TEST_F(UserPerformanceTuningNotifierTest, TestThresholdTriggered) { +TEST_F(UserPerformanceTuningNotifierTest, TestTabsThresholdTriggered) { EXPECT_EQ(0, receiver_->tab_count_threshold_reached_count_); // The threshold is 2, so having one tab doesn't trigger it. @@ -69,4 +78,25 @@ EXPECT_EQ(0, receiver_->tab_count_threshold_reached_count_); } +TEST_F(UserPerformanceTuningNotifierTest, TestMemoryThresholdTriggered) { + auto process1 = CreateNode<ProcessNodeImpl>(); + process1->set_resident_set_kb(8); + SystemNodeImpl::FromNode(graph()->GetSystemNode()) + ->OnProcessMemoryMetricsAvailable(); + EXPECT_EQ(0, receiver_->memory_percent_threshold_reached_count_); + + auto process2 = CreateNode<ProcessNodeImpl>(); + process2->set_resident_set_kb(5); + SystemNodeImpl::FromNode(graph()->GetSystemNode()) + ->OnProcessMemoryMetricsAvailable(); + EXPECT_EQ(1, receiver_->memory_percent_threshold_reached_count_); + + // Staying above the threshold doesn't re-trigger it. + auto process3 = CreateNode<ProcessNodeImpl>(); + process3->set_resident_set_kb(5); + SystemNodeImpl::FromNode(graph()->GetSystemNode()) + ->OnProcessMemoryMetricsAvailable(); + EXPECT_EQ(1, receiver_->memory_percent_threshold_reached_count_); +} + } // namespace performance_manager::user_tuning
diff --git a/chrome/browser/printing/print_backend_browsertest.cc b/chrome/browser/printing/print_backend_browsertest.cc index 329aa912..3d4816b 100644 --- a/chrome/browser/printing/print_backend_browsertest.cc +++ b/chrome/browser/printing/print_backend_browsertest.cc
@@ -352,36 +352,6 @@ std::unique_ptr<PrintBackendServiceTestImpl> print_backend_service_; }; -// A print backend service requires initialization prior to being used for a -// query/command. Verify that a query fails if one tries to use a new service -// without having performed initialization. -IN_PROC_BROWSER_TEST_F(PrintBackendBrowserTest, FailWithoutInit) { - // Launch the service, but without initializing to desired locale. - LaunchUninitialized(); - - mojom::DefaultPrinterNameResultPtr default_printer_name; - mojom::PrinterSemanticCapsAndDefaultsResultPtr printer_caps; - - // Safe to use base::Unretained(this) since waiting locally on the callback - // forces a shorter lifetime than `this`. - GetPrintBackendService()->GetDefaultPrinterName( - base::BindOnce(&PrintBackendBrowserTest::OnDidGetDefaultPrinterName, - base::Unretained(this), std::ref(default_printer_name))); - WaitUntilCallbackReceived(); - ASSERT_TRUE(default_printer_name->is_result_code()); - EXPECT_EQ(default_printer_name->get_result_code(), - mojom::ResultCode::kFailed); - - GetPrintBackendService()->GetPrinterSemanticCapsAndDefaults( - kDefaultPrinterName, - base::BindOnce( - &PrintBackendBrowserTest::OnDidGetPrinterSemanticCapsAndDefaults, - base::Unretained(this), std::ref(printer_caps))); - WaitUntilCallbackReceived(); - ASSERT_TRUE(printer_caps->is_result_code()); - EXPECT_EQ(printer_caps->get_result_code(), mojom::ResultCode::kFailed); -} - IN_PROC_BROWSER_TEST_F(PrintBackendBrowserTest, EnumeratePrinters) { LaunchService(); AddDefaultPrinter();
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 3f5c7ac8..0dd8334 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -408,15 +408,13 @@ : profile); } -#if !BUILDFLAG(IS_ANDROID) -// Helper function for `ScheduleEphemeralProfileForDeletion()`. +// Helper function for `ProfileManager` to identify if a profile is ephemeral. bool IsRegisteredAsEphemeral(ProfileAttributesStorage* storage, const base::FilePath& profile_dir) { ProfileAttributesEntry* entry = storage->GetProfileAttributesWithPath(profile_dir); return entry && entry->IsEphemeral(); } -#endif // Helper function that deletes entries from the kProfilesLastActive pref list. // It is called when every ephemeral profile is handled. @@ -436,7 +434,7 @@ } #endif -bool IsEphemeral(Profile* profile) { +bool IsForceEphemeralProfilesEnabled(Profile* profile) { return profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles); } @@ -1177,7 +1175,6 @@ const base::FilePath& profile_dir) { DCHECK_EQ(0u, chrome::GetBrowserCount(GetProfileByPath(profile_dir))); DCHECK(IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), profile_dir)); - absl::optional<base::FilePath> new_active_profile_dir = FindLastActiveProfile(base::BindRepeating( [](const base::FilePath& profile_dir, ProfileAttributesEntry* entry) { @@ -1870,8 +1867,8 @@ DCHECK(base::Contains(profiles_info_, profile_dir)); - Profile* profile = GetProfileByPath(profile_dir); - bool ephemeral = IsEphemeral(profile); + bool ephemeral = + IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), profile_dir); bool marked_for_deletion = IsProfileDirectoryMarkedForDeletion(profile_dir); // Remove from |profiles_info_|, eventually causing the Profile object's @@ -2313,7 +2310,7 @@ init_params.user_name = username; init_params.is_consented_primary_account = is_consented_primary_account; - init_params.is_ephemeral = IsEphemeral(profile); + init_params.is_ephemeral = IsForceEphemeralProfilesEnabled(profile); init_params.is_signed_in_with_credential_provider = profile->GetPrefs()->GetBoolean(prefs::kSignedInWithCredentialProvider); @@ -2366,7 +2363,8 @@ // Some profiles might become ephemeral after they are created. // Don't persist the System Profile as one of the last actives, it should // never get a browser. - if (!IsEphemeral(*it) && + if (!IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), + (*it)->GetPath()) && profile_paths.find(profile_path) == profile_paths.end() && profile_path != base::FilePath(chrome::kSystemProfileDir)) { profile_paths.insert(profile_path); @@ -2386,7 +2384,9 @@ DCHECK(!ShouldOpenPrimaryProfileFirstRun(profile)); #endif // BUILDFLAG(IS_CHROMEOS_LACROS) - if (!profile->IsOffTheRecord() && !IsEphemeral(profile) && + if (!profile->IsOffTheRecord() && + !IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), + profile->GetPath()) && !browser->is_type_app() && ++browser_counts_[profile] == 1) { active_profiles_.push_back(profile); SaveActiveProfiles(); @@ -2428,13 +2428,7 @@ base::FilePath path = profile->GetPath(); if (IsProfileDirectoryMarkedForDeletion(path)) { // Do nothing if the profile is already being deleted. - } else if (IsEphemeral(profile)) { - // Avoid scheduling deletion if it's a testing profile that is not - // registered with profile manager. - if (profile->AsTestingProfile() && - !IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), path)) { - return; - } + } else if (IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), path)) { // Delete if the profile is an ephemeral profile. ScheduleEphemeralProfileForDeletion(path); } else if (!profile->IsOffTheRecord()) { @@ -2505,7 +2499,8 @@ // Don't remember ephemeral profiles as last because they are not going to // persist after restart. - if (IsEphemeral(last_active)) + if (IsRegisteredAsEphemeral(&profile_manager_->GetProfileAttributesStorage(), + last_active->GetPath())) return; profile_manager_->UpdateLastUser(last_active);
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index fbfa8fa..0a332567 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -251,7 +251,6 @@ "screens/common/multidevice_setup.m.js", "screens/common/offline_ad_login.m.js", "screens/common/os_trial.m.js", - "screens/common/oobe_eula.m.js", "screens/common/os_install.m.js", "screens/common/recommend_apps.m.js", "screens/common/signin_fatal_error.m.js", @@ -296,6 +295,7 @@ "screens/common/managed_terms_of_service.js", "screens/common/marketing_opt_in.js", "screens/common/oobe_reset.js", + "screens/common/oobe_eula.js", "screens/common/parental_handoff.js", "screens/common/pin_setup.js", "screens/common/saml_confirm_password.js",
diff --git a/chrome/browser/resources/chromeos/login/screens.js b/chrome/browser/resources/chromeos/login/screens.js index 1349cfc..47d7e5d 100644 --- a/chrome/browser/resources/chromeos/login/screens.js +++ b/chrome/browser/resources/chromeos/login/screens.js
@@ -27,7 +27,7 @@ import './screens/common/marketing_opt_in.js'; import './screens/common/multidevice_setup.m.js'; import './screens/common/offline_ad_login.m.js'; -import './screens/common/oobe_eula.m.js'; +import './screens/common/oobe_eula.js'; import './screens/common/oobe_reset.js'; import './screens/common/os_install.m.js'; import './screens/common/os_trial.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index 2e34ad0a..c7676eb 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -23,7 +23,6 @@ ":hw_data_collection_module", ":multidevice_setup_module", ":offline_ad_login_module", - ":oobe_eula_module", ":os_install_module", ":os_trial_module", ":recommend_apps_module", @@ -66,7 +65,7 @@ ":managed_terms_of_service", ":marketing_opt_in", ":offline_ad_login.m", - ":oobe_eula.m", + ":oobe_eula", ":oobe_reset", ":os_install.m", ":os_trial.m", @@ -411,8 +410,8 @@ extra_deps = [ ":offline_ad_login_module" ] } -js_library("oobe_eula.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.m.js" ] +js_library("oobe_eula") { + sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js" ] deps = [ "../../:display_manager.m", "../../components:web_view_helper.m", @@ -428,7 +427,7 @@ "$externs_path/chrome_extensions.js", "$externs_path/webview_tag.js", ] - extra_deps = [ ":oobe_eula_module" ] + extra_deps = [ ":web_components" ] } js_library("oobe_reset") { @@ -753,15 +752,6 @@ namespace_rewrites = oobe_namespace_rewrites } -polymer_modulizer("oobe_eula") { - js_file = "oobe_eula.js" - html_file = "oobe_eula.html" - html_type = "dom-module" - auto_imports = oobe_auto_imports - namespace_rewrites = oobe_namespace_rewrites - migrated_imports = oobe_migrated_imports -} - polymer_modulizer("os_install") { js_file = "os_install.js" html_file = "os_install.html" @@ -836,6 +826,7 @@ "local_state_error.js", "managed_terms_of_service.js", "marketing_opt_in.js", + "oobe_eula.js", "oobe_reset.js", "parental_handoff.js", "pin_setup.js",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.html b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.html index cd6e730..fbd1a75 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.html +++ b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.html
@@ -4,189 +4,160 @@ found in the LICENSE file. --> -<link rel="import" href="chrome://resources/html/polymer.html"> +<style include="oobe-dialog-host-styles"> + a { + color: var(--google-blue-500); + text-decoration: none; + width: fit-content; + } -<link rel="import" href="chrome://resources/cr_elements/cr_shared_style.css.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> -<link rel="import" href="chrome://resources/html/action_link.html"> -<link rel="import" href="chrome://resources/html/assert.html"> -<link rel="import" href="chrome://resources/html/load_time_data.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> + oobe-modal-dialog { + --oobe-modal-dialog-content-height: 360px; + } -<link rel="import" href="../../cr_ui.html"> -<link rel="import" href="../../components/oobe_icons.html"> -<link rel="import" href="../../components/web_view_helper.html"> -<link rel="import" href="../../components/behaviors/login_screen_behavior.html"> -<link rel="import" href="../../components/behaviors/multi_step_behavior.html"> -<link rel="import" href="../../components/behaviors/oobe_i18n_behavior.html"> -<link rel="import" href="../../components/buttons/oobe_back_button.html"> -<link rel="import" href="../../components/buttons/oobe_text_button.html"> -<link rel="import" href="../../components/common_styles/common_styles.html"> -<link rel="import" href="../../components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="../../components/dialogs/oobe_adaptive_dialog.html"> -<link rel="import" href="../../components/dialogs/oobe_modal_dialog.html"> + #crosEulaFrame { + /* minimal height which allows popup dialogs looks fine. */ + min-height: 200px; + } -<dom-module id="oobe-eula-element"> - <template> - <style include="oobe-dialog-host-styles"> - a { - color: var(--google-blue-500); - text-decoration: none; - width: fit-content; - } + #additionalToS { + --oobe-modal-dialog-content-slot-padding-bottom: 0; + --oobe-modal-dialog-content-slot-padding-end: 0; + --oobe-modal-dialog-content-slot-padding-start: 0; + --oobe-modal-dialog-title-slot-padding-bottom: 16px; + --oobe-modal-dialog-width: 512px; + } - oobe-modal-dialog { - --oobe-modal-dialog-content-height: 360px; - } + #additionalChromeToSFrame { + padding-inline-end: 20px; + padding-inline-start: 20px; + } - #crosEulaFrame { - /* minimal height which allows popup dialogs looks fine. */ - min-height: 200px; - } + #logging { + min-height: unset; + } - #additionalToS { - --oobe-modal-dialog-content-slot-padding-bottom: 0; - --oobe-modal-dialog-content-slot-padding-end: 0; - --oobe-modal-dialog-content-slot-padding-start: 0; - --oobe-modal-dialog-title-slot-padding-bottom: 16px; - --oobe-modal-dialog-width: 512px; - } + #footer-more { + font-size: 13px; + padding-inline-start: 16px; + } - #additionalChromeToSFrame { - padding-inline-end: 20px; - padding-inline-start: 20px; - } + #additionalTerms, + #securitySettings, + #logging { + margin-top: 16px; + } - #logging { - min-height: unset; - } + #logging { + color: rgba(0, 0, 0, 0.54); + } - #footer-more { - font-size: 13px; - padding-inline-start: 16px; - } + cr-checkbox { + --cr-checkbox-label-padding-start: 16px; + } - #additionalTerms, - #securitySettings, - #logging { - margin-top: 16px; - } + #usageStatsLabelContainer { + color: var(--google-grey-700); /* #5F6368 */ + line-height: 18px; + } - #logging { - color: rgba(0, 0, 0, 0.54); - } + #usageStatsLabel { + cursor: pointer; + } - cr-checkbox { - --cr-checkbox-label-padding-start: 16px; - } - - #usageStatsLabelContainer { - color: var(--google-grey-700); /* #5F6368 */ - line-height: 18px; - } - - #usageStatsLabel { - cursor: pointer; - } - - #settings-close-button { - padding-inline-end: 18px; - } - </style> - <link rel="stylesheet" href="chrome://resources/css/throbber.css"> - <oobe-adaptive-dialog id="eulaLoadingDialog" for-step="loading" - role="dialog" - aria-label$="[[i18nDynamic(locale, 'termsOfServiceLoading')]]"> - <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> - <h1 slot="title"> - [[i18nDynamic(locale, 'termsOfServiceLoading')]] - </h1> - </oobe-adaptive-dialog> - <!-- As this dialog have pre-loading logic that require access to elements, - dialog is marked as no-lazy. --> - <oobe-adaptive-dialog id="eulaDialog" for-step="eula" role="dialog" - aria-label$="[[i18nDynamic(locale, 'oobeEulaSectionTitle')]]" - aria-describedby="crosEulaFrame" no-lazy> - <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> - <h1 slot="title"> - [[i18nDynamic(locale, 'oobeEulaSectionTitle')]] - </h1> - <div slot="content" class="flex layout vertical"> - <webview id="crosEulaFrame" allowTransparency - role="document" class="flex oobe-tos-webview" - aria-label$="[[i18nDynamic(locale, 'oobeEulaIframeLabel')]]" - on-contentload="onFrameLoad_"> - </webview> - <div id="footer-more" class="layout vertical"> - <a id="additionalTerms" on-click="onAdditionalTermsClicked_" - class="oobe-local-link" is="action-link"> - [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]] - </a> - <a id="securitySettings" class="oobe-local-link" is="action-link" - on-click="onSecuritySettingsClicked_" - hidden="[[securitySettingsInfoHidden_]]"> - [[i18nDynamic(locale, 'eulaSystemSecuritySettings')]] - </a> - <div id="logging" class="layout horizontal"> - <cr-checkbox id="usageStats" class="layout start self-center" - checked="{{usageStatsChecked}}" on-change="onUsageChanged_" - aria-labelledby="usageStatsLabel"> - <div id="usageStatsLabelContainer"> - <span id="usageStatsLabel"> - [[i18nDynamic(locale, 'checkboxLogging')]] - </span> - <a id="learnMore" class="oobe-local-link" is="action-link" - on-click="onUsageStatsHelpLinkClicked_"> - [[i18nDynamic(locale, 'learnMore')]] - </a> - </div> - </cr-checkbox> - </div> - </div> - </div> - <div slot="back-navigation"> - <oobe-back-button id="backButton" hidden="[[backButtonHidden_]]" - on-click="onEulaBackButtonPressed_"></oobe-back-button> - </div> - <div slot="bottom-buttons"> - <oobe-text-button id="acceptButton" inverse on-click="eulaAccepted_" - class="focus-on-show" - text-key="oobeEulaAcceptAndContinueButtonText"> - </oobe-text-button> - </div> - </oobe-adaptive-dialog> - <oobe-adaptive-dialog id="securitySettingsDialog" role="dialog" - for-step="security" - aria-label$="[[i18nDynamic(locale, 'eulaSystemSecuritySettings')]]"> - <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> - <h1 slot="title"> - [[i18nDynamic(locale, 'eulaSystemSecuritySettings')]] - </h1> - <p slot="subtitle"> - [[tpmDescription_]] - </p> - <div slot="bottom-buttons" class="flex layout horizontal"> - <div class="flex"></div> - <oobe-text-button id="settings-close-button" inverse - class="focus-on-show" - text-key="eulaSystemSecuritySettingsOkButton" - on-click="onSecuritySettingsCloseClicked_"></oobe-text-button> - </div> - </oobe-adaptive-dialog> - <oobe-modal-dialog id="additionalToS" ignore-popstate - on-close="focusAdditionalTermsLink_" - on-cancel="focusAdditionalTermsLink_"> - <div slot="title"> + #settings-close-button { + padding-inline-end: 18px; + } +</style> +<oobe-adaptive-dialog id="eulaLoadingDialog" for-step="loading" role="dialog" + aria-label$="[[i18nDynamic(locale, 'termsOfServiceLoading')]]"> + <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> + <h1 slot="title"> + [[i18nDynamic(locale, 'termsOfServiceLoading')]] + </h1> +</oobe-adaptive-dialog> +<!-- As this dialog have pre-loading logic that require access to elements, + dialog is marked as no-lazy. --> +<oobe-adaptive-dialog id="eulaDialog" for-step="eula" role="dialog" + aria-label$="[[i18nDynamic(locale, 'oobeEulaSectionTitle')]]" + aria-describedby="crosEulaFrame" no-lazy> + <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> + <h1 slot="title"> + [[i18nDynamic(locale, 'oobeEulaSectionTitle')]] + </h1> + <div slot="content" class="flex layout vertical"> + <webview id="crosEulaFrame" allowTransparency role="document" + class="flex oobe-tos-webview" + aria-label$="[[i18nDynamic(locale, 'oobeEulaIframeLabel')]]" + on-contentload="onFrameLoad_"> + </webview> + <div id="footer-more" class="layout vertical"> + <a id="additionalTerms" on-click="onAdditionalTermsClicked_" + class="oobe-local-link" is="action-link"> [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]] + </a> + <a id="securitySettings" class="oobe-local-link" is="action-link" + on-click="onSecuritySettingsClicked_" + hidden="[[securitySettingsInfoHidden_]]"> + [[i18nDynamic(locale, 'eulaSystemSecuritySettings')]] + </a> + <div id="logging" class="layout horizontal"> + <cr-checkbox id="usageStats" class="layout start self-center" + checked="{{usageStatsChecked}}" + on-change="onUsageChanged_" aria-labelledby="usageStatsLabel"> + <div id="usageStatsLabelContainer"> + <span id="usageStatsLabel"> + [[i18nDynamic(locale, 'checkboxLogging')]] + </span> + <a id="learnMore" class="oobe-local-link" is="action-link" + on-click="onUsageStatsHelpLinkClicked_"> + [[i18nDynamic(locale, 'learnMore')]] + </a> + </div> + </cr-checkbox> </div> - <webview slot="content" role="document" class="flex oobe-tos-webview" - id="additionalChromeToSFrame"> - </webview> - <oobe-text-button id="closeAdditionalTos" slot="buttons" - on-click="hideToSDialog_" text-key="oobeModalDialogClose" inverse> - </oobe-text-button> - </oobe-modal-dialog> - </template> - <script src="oobe_eula.js"></script> -</dom-module> + </div> + </div> + <div slot="back-navigation"> + <oobe-back-button id="backButton" hidden="[[backButtonHidden_]]" + on-click="onEulaBackButtonPressed_"> + </oobe-back-button> + </div> + <div slot="bottom-buttons"> + <oobe-text-button id="acceptButton" inverse on-click="eulaAccepted_" + class="focus-on-show" + text-key="oobeEulaAcceptAndContinueButtonText"> + </oobe-text-button> + </div> +</oobe-adaptive-dialog> +<oobe-adaptive-dialog id="securitySettingsDialog" role="dialog" + for-step="security" + aria-label$="[[i18nDynamic(locale, 'eulaSystemSecuritySettings')]]"> + <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> + <h1 slot="title"> + [[i18nDynamic(locale, 'eulaSystemSecuritySettings')]] + </h1> + <p slot="subtitle"> + [[tpmDescription_]] + </p> + <div slot="bottom-buttons" class="flex layout horizontal"> + <div class="flex"></div> + <oobe-text-button id="settings-close-button" inverse class="focus-on-show" + text-key="eulaSystemSecuritySettingsOkButton" + on-click="onSecuritySettingsCloseClicked_"></oobe-text-button> + </div> +</oobe-adaptive-dialog> +<oobe-modal-dialog id="additionalToS" ignore-popstate + on-close="focusAdditionalTermsLink_" + on-cancel="focusAdditionalTermsLink_"> + <div slot="title"> + [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]] + </div> + <webview slot="content" role="document" class="flex oobe-tos-webview" + id="additionalChromeToSFrame"> + </webview> + <oobe-text-button id="closeAdditionalTos" slot="buttons" + on-click="hideToSDialog_" text-key="oobeModalDialogClose" + inverse> + </oobe-text-button> +</oobe-modal-dialog>
diff --git a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js index 271f98c..bd4fe2e 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js +++ b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js
@@ -2,7 +2,29 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/* #js_imports_placeholder */ +import '//resources/cr_elements/cr_shared_style.css.js'; +import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; +import '//resources/js/action_link.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import '//resources/polymer/v3_0/paper-styles/color.js'; +import '../../components/oobe_icons.m.js'; +import '../../components/common_styles/common_styles.m.js'; +import '../../components/common_styles/oobe_dialog_host_styles.m.js'; +import '../../components/dialogs/oobe_adaptive_dialog.m.js'; +import '../../components/dialogs/oobe_modal_dialog.m.js'; + +import {assert} from '//resources/js/assert.m.js'; +import {loadTimeData} from '//resources/js/load_time_data.m.js'; +import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.m.js'; +import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.m.js'; +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.m.js'; +import '../../components/buttons/oobe_back_button.m.js'; +import '../../components/buttons/oobe_text_button.m.js'; +import {WebViewHelper} from '../../components/web_view_helper.m.js'; +import {Oobe} from '../../cr_ui.m.js'; + // Enum that describes the current state of the Terms Of Service screen const EulaScreenState = { @@ -255,9 +277,8 @@ * @implements {MultiStepBehaviorInterface} * @implements {OobeI18nBehaviorInterface} */ -const EulaScreenBase = Polymer.mixinBehaviors( - [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], - Polymer.Element); +const EulaScreenBase = mixinBehaviors( + [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], PolymerElement); // TODO(crbug.com/1184731) - Replace PolymerElement with OobeTextButton @@ -281,7 +302,9 @@ return 'oobe-eula-element'; } - /* #html_template_placeholder */ + static get template() { + return html`{__html_template__}`; + } static get properties() { return { @@ -515,8 +538,7 @@ * @private */ focusAdditionalTermsLink_() { - Polymer.RenderStatus.afterNextRender( - this, () => this.$.additionalTerms.focus()); + afterNextRender(this, () => this.$.additionalTerms.focus()); } /** @@ -549,8 +571,7 @@ */ onSecuritySettingsCloseClicked_() { this.setUIStep(EulaScreenState.EULA); - Polymer.RenderStatus.afterNextRender( - this, () => this.$.securitySettings.focus()); + afterNextRender(this, () => this.$.securitySettings.focus()); } /**
diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html index e9e95a3..119a7092 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.html +++ b/chrome/browser/resources/settings/site_settings/site_details.html
@@ -18,6 +18,18 @@ #usageHeader { padding: 0 var(--cr-section-padding); } + + #usageDetails { + align-items: center; + display: flex; + flex: 1; + flex-direction: row; + } + + #fpsPolicyContainer { + display: flex; + padding: 8px; + } </style> <!-- Confirm reset settings dialog. --> <cr-dialog id="confirmResetSettings" close-text="$i18n{close}" @@ -78,16 +90,34 @@ </div> <div class="list-item" id="storage" hidden$="[[!hasUsage_(storedData_, numCookies_)]]"> - <div class="start" id="storageText"> - <div id="storedData" hidden$="[[!storedData_]]"> - [[storedData_]] + <div id="usageDetails"> + <div> + <div id="storageText"> + <div id="storedData" hidden$="[[!storedData_]]"> + [[storedData_]] + </div> + <div hidden$="[[!hasDataAndCookies_( + storedData_,numCookies_)]]"> + · + </div> + <div id="numCookies" hidden$="[[!numCookies_]]"> + [[numCookies_]] + </div> + </div> + <div id="fpsMembership" class="secondary" + hidden$="[[!fpsMembership_]]"> + [[fpsMembership_]] + </div> </div> - <div hidden$="[[!hasDataAndCookies_(storedData_, numCookies_)]]"> - · - </div> - <div id="numCookies" hidden$="[[!numCookies_]]"> - [[numCookies_]] - </div> + <template is="dom-if" if="[[fpsEnterprisePref_]]"> + <div id="fpsPolicyContainer"> + <cr-policy-pref-indicator + id="fpsPolicy" pref="[[fpsEnterprisePref_]]" + icon-aria-label="[[label]]" focus-row-control + focus-type="policy"> + </cr-policy-pref-indicator> + </div> + </template> </div> <cr-button id="clearStorage" role="button" aria-disabled="false" on-click="onConfirmClearStorage_" @@ -95,9 +125,6 @@ $i18n{siteSettingsDelete} </cr-button> </div> - <div id="fpsMembership" hidden$="[[!fpsMembership_]]"> - [[fpsMembership_]] - </div> </div> </div>
diff --git a/chrome/browser/resources/settings/site_settings/site_details.ts b/chrome/browser/resources/settings/site_settings/site_details.ts index 99f9f6b9..ac99bc1a 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.ts +++ b/chrome/browser/resources/settings/site_settings/site_details.ts
@@ -114,6 +114,11 @@ value: '', }, + /** + * Mock preference used to power managed policy icon for first party sets. + */ + fpsEnterprisePref_: Object, + enableExperimentalWebPlatformFeatures_: { type: Boolean, value() { @@ -141,6 +146,7 @@ private storedData_: string; private numCookies_: string; private fpsMembership_: string; + private fpsEnterprisePref_: chrome.settingsPrivate.PrefObject; private enableExperimentalWebPlatformFeatures_: boolean; private enableWebBluetoothNewPermissionsBackend_: boolean; @@ -153,8 +159,9 @@ this.addWebUIListener( 'usage-total-changed', - (host: string, data: string, cookies: string, fps: string) => { - this.onUsageTotalChanged_(host, data, cookies, fps); + (host: string, data: string, cookies: string, fps: string, + fpsPolicy: boolean) => { + this.onUsageTotalChanged_(host, data, cookies, fps, fpsPolicy); }); this.addWebUIListener( @@ -216,13 +223,20 @@ * @param usage The string showing how much data the given host is using. * @param cookies The string showing how many cookies the given host is using. * @param fpsMembership The string showing first party set membership details. + * @param fpsPolicy Whether a policy is applied to this FPS member. */ private onUsageTotalChanged_( - host: string, usage: string, cookies: string, fpsMembership: string) { + host: string, usage: string, cookies: string, fpsMembership: string, + fpsPolicy: boolean) { if (this.fetchingForHost_ === host) { this.storedData_ = usage; this.numCookies_ = cookies; this.fpsMembership_ = fpsMembership; + this.fpsEnterprisePref_ = fpsPolicy ? Object.assign({ + enforcement: chrome.settingsPrivate.Enforcement.ENFORCED, + controlledBy: chrome.settingsPrivate.ControlledBy.DEVICE_POLICY, + }) : + undefined; } }
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc index 8ec40d5..a0f4600 100644 --- a/chrome/browser/signin/chrome_signin_helper.cc +++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -10,40 +10,21 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/logging.h" -#include "base/memory/ref_counted.h" #include "base/metrics/histogram_functions.h" #include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" #include "base/supports_user_data.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/browser_process.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_io_data.h" #include "chrome/browser/signin/account_consistency_mode_manager.h" #include "chrome/browser/signin/account_reconcilor_factory.h" -#include "chrome/browser/signin/chrome_signin_client.h" -#include "chrome/browser/signin/chrome_signin_client_factory.h" -#include "chrome/browser/signin/cookie_reminter_factory.h" -#include "chrome/browser/signin/dice_response_handler.h" #include "chrome/browser/signin/header_modification_delegate_impl.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/signin/process_dice_header_delegate_impl.h" #include "chrome/browser/signin/signin_features.h" -#include "chrome/browser/signin/signin_manager.h" -#include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_ui_util.h" -#include "chrome/browser/tab_contents/tab_util.h" -#include "chrome/browser/ui/webui/signin/login_ui_service.h" -#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" -#include "chrome/browser/ui/webui/signin/signin_ui_error.h" -#include "chrome/common/url_constants.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/signin/core/browser/account_reconcilor.h" -#include "components/signin/core/browser/cookie_reminter.h" #include "components/signin/public/base/account_consistency_method.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/base/signin_buildflags.h" @@ -55,16 +36,16 @@ #if BUILDFLAG(IS_ANDROID) #include "chrome/browser/android/signin/signin_bridge.h" +#include "chrome/common/webui_url_constants.h" #include "ui/android/view_android.h" #else #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/browser_window.h" -#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" #endif // BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/browser_window.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h" #endif // BUILDFLAG(IS_CHROMEOS) @@ -73,7 +54,15 @@ #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chrome/browser/browser_process.h" +#include "chrome/browser/signin/signin_manager_factory.h" +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + #if BUILDFLAG(ENABLE_DICE_SUPPORT) +#include "chrome/browser/signin/dice_response_handler.h" +#include "chrome/browser/signin/process_dice_header_delegate_impl.h" +#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" #include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h" #endif @@ -221,7 +210,7 @@ should_ignore_guest_webview = HeaderModificationDelegateImpl::ShouldIgnoreGuestWebViewRequest( web_contents); -#endif +#endif // BUILDFLAG(ENABLE_EXTENSIONS) Browser* browser = chrome::FindBrowserWithWebContents(web_contents); // Do not do anything if the navigation happened in the "background". @@ -261,7 +250,6 @@ // 2. Displaying a reauthentication window if (!manage_accounts_params.email.empty()) { - // TODO(https://crbug.com/1226055): enable this for lacros. #if BUILDFLAG(IS_CHROMEOS_ASH) // Do not display the re-authentication dialog if this event was triggered // by supervision being enabled for an account. In this situation, a @@ -287,24 +275,6 @@ return; } - // The account's cookie is invalid but the cookie has not been removed by - // |AccountReconcilor|. Ideally, this should not happen. At this point, - // |AccountReconcilor| cannot detect this state because its source of truth - // (/ListAccounts) is giving us false positives (claiming an invalid account - // to be valid). We need to store that this account's cookie is actually - // invalid, so that if/when this account is re-authenticated, we can force a - // reconciliation for this account instead of treating it as a no-op. - // See https://crbug.com/1012649 for details. - AccountInfo maybe_account_info = - identity_manager->FindExtendedAccountInfoByEmailAddress( - manage_accounts_params.email); - if (!maybe_account_info.IsEmpty()) { - CookieReminter* const cookie_reminter = - CookieReminterFactory::GetForProfile(profile); - cookie_reminter->ForceCookieRemintingOnNextTokenUpdate( - maybe_account_info); - } - // Display a re-authentication dialog. signin_ui_util::ShowReauthForAccount( profile, manage_accounts_params.email, @@ -329,12 +299,6 @@ return; } - // As per https://crbug.com/1286822 and internal b/215509741, the session - // may sometimes become invalid on the server without notice. When this - // happens, the user may try to fix it by signing-in again. - // Trigger a cookie jar update now to fix the session if needed. - identity_manager->GetAccountsCookieMutator()->TriggerCookieJarUpdate(); - AccountProfileMapper* mapper = g_browser_process->profile_manager()->GetAccountProfileMapper(); SigninManagerFactory::GetForProfile(profile)->StartLacrosSigninFlow( @@ -346,7 +310,7 @@ ::GetAccountManagerFacade(profile->GetPath().value()) ->ShowAddAccountDialog(account_manager::AccountManagerFacade:: AccountAdditionSource::kOgbAddAccount); -#endif +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) return; }
diff --git a/chrome/browser/signin/cookie_reminter_factory.cc b/chrome/browser/signin/cookie_reminter_factory.cc deleted file mode 100644 index efb7958..0000000 --- a/chrome/browser/signin/cookie_reminter_factory.cc +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/signin/cookie_reminter_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/identity_manager_factory.h" -#include "components/signin/core/browser/cookie_reminter.h" - -CookieReminterFactory::CookieReminterFactory() - : ProfileKeyedServiceFactory("CookieReminter") { - DependsOn(IdentityManagerFactory::GetInstance()); -} - -CookieReminterFactory::~CookieReminterFactory() {} - -// static -CookieReminter* CookieReminterFactory::GetForProfile(Profile* profile) { - return static_cast<CookieReminter*>( - GetInstance()->GetServiceForBrowserContext(profile, true)); -} - -// static -CookieReminterFactory* CookieReminterFactory::GetInstance() { - return base::Singleton<CookieReminterFactory>::get(); -} - -KeyedService* CookieReminterFactory::BuildServiceInstanceFor( - content::BrowserContext* context) const { - Profile* profile = Profile::FromBrowserContext(context); - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile); - return new CookieReminter(identity_manager); -}
diff --git a/chrome/browser/signin/cookie_reminter_factory.h b/chrome/browser/signin/cookie_reminter_factory.h deleted file mode 100644 index 9b621fa..0000000 --- a/chrome/browser/signin/cookie_reminter_factory.h +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SIGNIN_COOKIE_REMINTER_FACTORY_H_ -#define CHROME_BROWSER_SIGNIN_COOKIE_REMINTER_FACTORY_H_ - -#include "base/memory/singleton.h" -#include "chrome/browser/profiles/profile_keyed_service_factory.h" - -class CookieReminter; -class Profile; - -class CookieReminterFactory : public ProfileKeyedServiceFactory { - public: - static CookieReminter* GetForProfile(Profile* profile); - static CookieReminterFactory* GetInstance(); - - private: - friend struct base::DefaultSingletonTraits<CookieReminterFactory>; - - CookieReminterFactory(); - ~CookieReminterFactory() override; - - // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( - content::BrowserContext* profile) const override; -}; - -#endif // CHROME_BROWSER_SIGNIN_COOKIE_REMINTER_FACTORY_H_
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc index 5ac4ce9f..b03cc45 100644 --- a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc +++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
@@ -27,9 +27,9 @@ sync_pb::DataTypeProgressMarker marker2; CHECK(marker1.ParseFromString(serialized1)); CHECK(marker2.ParseFromString(serialized2)); - marker1.clear_gc_directive(); - marker2.clear_gc_directive(); DCHECK(marker1.data_type_id() == marker2.data_type_id()); + DCHECK(!marker1.has_gc_directive()); + DCHECK(!marker2.has_gc_directive()); if (syncer::GetModelTypeFromSpecificsFieldNumber(marker1.data_type_id()) == syncer::AUTOFILL_WALLET_DATA ||
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 0793f470..5c82755 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -950,6 +950,7 @@ <translation id="6192907950379606605">Get image descriptions</translation> <translation id="6196315980958524839">Passwords are saved to Google Password Manager on this device</translation> <translation id="620197886010707372">Open app for <ph name="APPNAME" /> with Google Play?</translation> +<translation id="6202812185118613467">Sign back in to start sync</translation> <translation id="6203593061661911168">Download will start when on Wi-Fi</translation> <translation id="6210748933810148297">Not <ph name="EMAIL" />?</translation> <translation id="6211386937064921208">Previewing this page</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 57efee4..79ecf80 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -950,6 +950,7 @@ <translation id="6192907950379606605">รับคำอธิบายรูปภาพ</translation> <translation id="6196315980958524839">รหัสผ่านจะบันทึกอยู่ในเครื่องมือจัดการรหัสผ่านของ Google ในอุปกรณ์นี้</translation> <translation id="620197886010707372">เปิดแอปสำหรับ <ph name="APPNAME" /> ใน Google Play ไหม</translation> +<translation id="6202812185118613467">ลงชื่อเข้าใช้อีกครั้งเพื่อเริ่มซิงค์</translation> <translation id="6203593061661911168">การดาวน์โหลดจะเริ่มเมื่อมีการเชื่อมต่อ Wi-Fi</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> ไม่ใช่บัญชีที่ฉันจะใช้</translation> <translation id="6211386937064921208">แสดงตัวอย่างหน้าเว็บนี้</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 7aa3da6f..f303c43 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -950,6 +950,7 @@ <translation id="6192907950379606605">Rasm tavsiflari chiqsin</translation> <translation id="6196315980958524839">Parollar shu qurilmadagi Google Parollar menejeriga saqlanadi.</translation> <translation id="620197886010707372"><ph name="APPNAME" /> ilovasi Google Play orqali ochilsinmi?</translation> +<translation id="6202812185118613467">Sinxronizatsiyani boshlash uchun hisobga qayta kiring.</translation> <translation id="6203593061661911168">Yuklab olish Wi-Fi orqali ishga tushadi</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> emasmi?</translation> <translation id="6211386937064921208">Bu sahifaga razm solyapsiz</translation>
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc index 20c29e1..4d02cc7 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -2968,7 +2968,8 @@ // This verifies that app icons are invalidated in case icon version was // changed which means ARC sends icons using updated processing. -TEST_P(ArcAppModelIconTest, IconInvalidationOnIconVersionUpdate) { +// TODO(crbug.com/1364812): Flaky. +TEST_P(ArcAppModelIconTest, DISABLED_IconInvalidationOnIconVersionUpdate) { ArcAppListPrefs* const prefs = ArcAppListPrefs::Get(profile_.get()); ASSERT_TRUE(prefs);
diff --git a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc index 705658e..7b213aa 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc +++ b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
@@ -203,7 +203,8 @@ sync_pb::ModelTypeState model_type_state; model_type_state.set_initial_sync_done(true); - processor->OnUpdateReceived(model_type_state, std::move(updates)); + processor->OnUpdateReceived(model_type_state, std::move(updates), + /*gc_directive=*/absl::nullopt); // ClientTagBasedModelTypeProcessor uses ModelTypeProcessorProxy during // activation, which involves task posting for receiving updates. base::RunLoop().RunUntilIdle();
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc index ba717f11..eeb1b5f 100644 --- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc +++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
@@ -109,11 +109,11 @@ } void SetPluginVmImagePref(std::string url, std::string hash) { - DictionaryPrefUpdate update(browser()->profile()->GetPrefs(), + ScopedDictPrefUpdate update(browser()->profile()->GetPrefs(), plugin_vm::prefs::kPluginVmImage); - base::Value* plugin_vm_image = update.Get(); - plugin_vm_image->SetStringKey("url", url); - plugin_vm_image->SetStringKey("hash", hash); + base::Value::Dict& plugin_vm_image = update.Get(); + plugin_vm_image.Set("url", url); + plugin_vm_image.Set("hash", hash); } void WaitForSetupToFinish() {
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc index 1c904d8..1023b38 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -428,14 +428,7 @@ // Checks that the NTP is navigated to the logout URL, instead of creating // another tab. -// Flaky on Linux, at least. crbug.com/1116606 -// Flaky on Mac because of crbug.com/1273102. -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) -#define MAYBE_SignoutFromNTP DISABLED_SignoutFromNTP -#else -#define MAYBE_SignoutFromNTP SignoutFromNTP -#endif -IN_PROC_BROWSER_TEST_F(ProfileMenuViewSignoutTest, MAYBE_SignoutFromNTP) { +IN_PROC_BROWSER_TEST_F(ProfileMenuViewSignoutTest, SignoutFromNTP) { // Start from the NTP. ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL)));
diff --git a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc index 30abec1b..40384907 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc
@@ -63,9 +63,13 @@ if (IsInitialized()) { contents()->SetDelegate(nullptr); - // Schedule the profile for deletion, it's not needed any more. - g_browser_process->profile_manager()->ScheduleEphemeralProfileForDeletion( - profile_->GetPath()); + // Schedule the profile for deletion if it wasn't deleted yet, since it's + // not needed any more. + if (!ProfileManager::IsProfileDirectoryMarkedForDeletion( + profile_->GetPath())) { + g_browser_process->profile_manager() + ->ScheduleEphemeralProfileForDeletion(profile_->GetPath()); + } } ProfileMetrics::LogProfileAddSignInFlowOutcome(
diff --git a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc index 75a80e4..3db1e2a 100644 --- a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc +++ b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
@@ -274,9 +274,9 @@ void InlineLoginUIBrowserTest::AddEmailToOneClickRejectedList( const std::string& email) { PrefService* pref_service = browser()->profile()->GetPrefs(); - ListPrefUpdate updater(pref_service, - prefs::kReverseAutologinRejectedEmailList); - if (!base::Contains(updater->GetListDeprecated(), base::Value(email))) { + ScopedListPrefUpdate updater(pref_service, + prefs::kReverseAutologinRejectedEmailList); + if (!base::Contains(*updater, base::Value(email))) { updater->Append(email); } }
diff --git a/chrome/browser/ui/views/task_manager_view_browsertest.cc b/chrome/browser/ui/views/task_manager_view_browsertest.cc index fa0c56e2..655983a 100644 --- a/chrome/browser/ui/views/task_manager_view_browsertest.cc +++ b/chrome/browser/ui/views/task_manager_view_browsertest.cc
@@ -88,9 +88,9 @@ if (!local_state) FAIL(); - DictionaryPrefUpdate dict_update(local_state, + ScopedDictPrefUpdate dict_update(local_state, prefs::kTaskManagerColumnVisibility); - dict_update->DictClear(); + dict_update->clear(); } void ToggleColumnVisibility(TaskManagerView* view, int col_id) {
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_button.cc b/chrome/browser/ui/views/toolbar/chrome_labs_button.cc index 1f3439f3..2c24f8c 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_button.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_button.cc
@@ -120,23 +120,23 @@ void ChromeLabsButton::UpdateDotIndicator() { #if BUILDFLAG(IS_CHROMEOS_ASH) - DictionaryPrefUpdate update( + ScopedDictPrefUpdate update( browser_view_->browser()->profile()->GetPrefs(), chrome_labs_prefs::kChromeLabsNewBadgeDictAshChrome); #else - DictionaryPrefUpdate update(g_browser_process->local_state(), + ScopedDictPrefUpdate update(g_browser_process->local_state(), chrome_labs_prefs::kChromeLabsNewBadgeDict); #endif - base::Value* new_badge_prefs = update.Get(); + base::Value::Dict& new_badge_prefs = update.Get(); std::vector<std::string> lab_internal_names; const std::vector<LabInfo>& all_labs = model_->GetLabInfo(); bool should_show_dot_indicator = base::ranges::any_of( - all_labs.begin(), all_labs.end(), [new_badge_prefs](const LabInfo& lab) { + all_labs.begin(), all_labs.end(), [&new_badge_prefs](const LabInfo& lab) { absl::optional<int> new_badge_pref_value = - new_badge_prefs->FindIntKey(lab.internal_name); + new_badge_prefs.FindInt(lab.internal_name); // Show the dot indicator if new experiments have not been seen yet. return new_badge_pref_value == chrome_labs_prefs::kChromeLabsNewExperimentPrefValue; });
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_utils.cc b/chrome/browser/ui/views/toolbar/chrome_labs_utils.cc index 01e27a6..4ce7bb9 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_utils.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_utils.cc
@@ -50,14 +50,14 @@ void UpdateChromeLabsNewBadgePrefs(Profile* profile, const ChromeLabsBubbleViewModel* model) { #if BUILDFLAG(IS_CHROMEOS_ASH) - DictionaryPrefUpdate update( + ScopedDictPrefUpdate update( profile->GetPrefs(), chrome_labs_prefs::kChromeLabsNewBadgeDictAshChrome); #else - DictionaryPrefUpdate update(g_browser_process->local_state(), + ScopedDictPrefUpdate update(g_browser_process->local_state(), chrome_labs_prefs::kChromeLabsNewBadgeDict); #endif - base::Value* new_badge_prefs = update.Get(); + base::Value::Dict& new_badge_prefs = update.Get(); std::vector<std::string> lab_internal_names; const std::vector<LabInfo>& all_labs = model->GetLabInfo(); @@ -68,15 +68,15 @@ if (IsChromeLabsFeatureValid(lab, profile) && (lab.internal_name != flag_descriptions::kScrollableTabStripFlagId)) { lab_internal_names.push_back(lab.internal_name); - if (!new_badge_prefs->FindKey(lab.internal_name)) { - new_badge_prefs->SetIntKey( + if (!new_badge_prefs.Find(lab.internal_name)) { + new_badge_prefs.Set( lab.internal_name, chrome_labs_prefs::kChromeLabsNewExperimentPrefValue); } } } std::vector<std::string> entries_to_remove; - for (auto pref : new_badge_prefs->DictItems()) { + for (auto pref : new_badge_prefs) { // The size of |lab_internal_names| is capped around 3-5 elements. if (!base::Contains(lab_internal_names, pref.first)) { entries_to_remove.push_back(pref.first); @@ -84,5 +84,5 @@ } for (const std::string& key : entries_to_remove) - new_badge_prefs->RemoveKey(key); + new_badge_prefs.Remove(key); }
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc b/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc index 0d02f34..a97471d 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc
@@ -201,16 +201,15 @@ } #if BUILDFLAG(IS_CHROMEOS_ASH) - DictionaryPrefUpdate update( + ScopedDictPrefUpdate update( profile->GetPrefs(), chrome_labs_prefs::kChromeLabsNewBadgeDictAshChrome); #else - DictionaryPrefUpdate update(g_browser_process->local_state(), + ScopedDictPrefUpdate update(g_browser_process->local_state(), chrome_labs_prefs::kChromeLabsNewBadgeDict); #endif - base::Value* new_badge_prefs = update.Get(); - absl::optional<int> start_day = - new_badge_prefs->FindIntKey(lab.internal_name); + base::Value::Dict& new_badge_prefs = update.Get(); + absl::optional<int> start_day = new_badge_prefs.FindInt(lab.internal_name); DCHECK(start_day); uint32_t current_day = GetCurrentDay(); if (*start_day == chrome_labs_prefs::kChromeLabsNewExperimentPrefValue) { @@ -218,7 +217,7 @@ // epoch (1970-01-01). This value is the first day the user sees the new // experiment in Chrome Labs and will be used to determine whether or not to // show the new badge. - new_badge_prefs->SetIntKey(lab.internal_name, current_day); + new_badge_prefs.Set(lab.internal_name, static_cast<int>(current_day)); return true; } int days_elapsed = current_day - *start_day;
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index 99e5e5e..549b255 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -1082,8 +1082,9 @@ return; GURL url = GetAppStartURL(site); { - ListPrefUpdate updateList(profile()->GetPrefs(), prefs::kWebAppSettings); - updateList->GetList().EraseIf([&](const base::Value& item) { + ScopedListPrefUpdate update_list(profile()->GetPrefs(), + prefs::kWebAppSettings); + update_list->EraseIf([&](const base::Value& item) { return *item.GetDict().FindString(kManifestId) == url.spec(); }); } @@ -1818,13 +1819,12 @@ run_loop.Quit(); })); { - ListPrefUpdate update(profile()->GetPrefs(), - prefs::kWebAppInstallForceList); - size_t removed_count = - update->GetList().EraseIf([&](const base::Value& item) { - const base::Value* url_value = item.GetDict().Find(kUrlKey); - return url_value && url_value->GetString() == url.spec(); - }); + ScopedListPrefUpdate update(profile()->GetPrefs(), + prefs::kWebAppInstallForceList); + size_t removed_count = update->EraseIf([&](const base::Value& item) { + const base::Value* url_value = item.GetDict().Find(kUrlKey); + return url_value && url_value->GetString() == url.spec(); + }); ASSERT_GT(removed_count, 0U); } run_loop.Run(); @@ -2743,9 +2743,9 @@ item.Set(kDefaultLaunchContainerKey, std::move(default_launch_container)); item.Set(kCreateDesktopShortcutKey, create_shortcut); item.Set(kInstallAsShortcut, install_as_shortcut); - ListPrefUpdate update(profile()->GetPrefs(), - prefs::kWebAppInstallForceList); - update->GetList().Append(std::move(item)); + ScopedListPrefUpdate update(profile()->GetPrefs(), + prefs::kWebAppInstallForceList); + update->Append(std::move(item)); } active_app_id_ = observer.Wait(); AppReadinessWaiter(profile(), active_app_id_).Await(); @@ -2755,8 +2755,8 @@ const char* policy) { GURL url = GetAppStartURL(site); { - ListPrefUpdate update(profile()->GetPrefs(), prefs::kWebAppSettings); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(profile()->GetPrefs(), prefs::kWebAppSettings); + base::Value::List& update_list = update.Get(); update_list.EraseIf([&](const base::Value& item) { return *item.GetDict().FindString(kManifestId) == url.spec(); }); @@ -2789,13 +2789,12 @@ })); std::string url_spec = provider()->registrar().GetAppStartUrl(id).spec(); { - ListPrefUpdate update(profile()->GetPrefs(), - prefs::kWebAppInstallForceList); - size_t removed_count = - update->GetList().EraseIf([&](const base::Value& item) { - const base::Value* url_value = item.GetDict().Find(kUrlKey); - return url_value && url_value->GetString() == url_spec; - }); + ScopedListPrefUpdate update(profile()->GetPrefs(), + prefs::kWebAppInstallForceList); + size_t removed_count = update->EraseIf([&](const base::Value& item) { + const base::Value* url_value = item.GetDict().Find(kUrlKey); + return url_value && url_value->GetString() == url_spec; + }); ASSERT_GT(removed_count, 0U); } run_loop.Run();
diff --git a/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.cc index c30f49d..d08e81f 100644 --- a/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.cc
@@ -12,18 +12,10 @@ namespace chromeos { -constexpr StaticOobeScreenId LacrosDataMigrationScreenView::kScreenId; - LacrosDataMigrationScreenHandler::LacrosDataMigrationScreenHandler() - : BaseScreenHandler(kScreenId) { - set_user_acted_method_path_deprecated( - "login.LacrosDataMigrationScreen.userActed"); -} + : BaseScreenHandler(kScreenId) {} -LacrosDataMigrationScreenHandler::~LacrosDataMigrationScreenHandler() { - if (screen_) - screen_->OnViewDestroyed(this); -} +LacrosDataMigrationScreenHandler::~LacrosDataMigrationScreenHandler() = default; void LacrosDataMigrationScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { @@ -49,64 +41,31 @@ IDS_LACROS_DATA_MIGRATION_SCREEN_ERROR_GOTO_FILES_BUTTON); } -void LacrosDataMigrationScreenHandler::Bind(LacrosDataMigrationScreen* screen) { - BaseScreenHandler::SetBaseScreenDeprecated(screen); - screen_ = screen; -} - -void LacrosDataMigrationScreenHandler::Unbind() { - BaseScreenHandler::SetBaseScreenDeprecated(nullptr); - screen_ = nullptr; -} - void LacrosDataMigrationScreenHandler::Show() { - if (!IsJavascriptAllowed()) { - show_on_init_ = true; - return; - } - observation_.Observe(GetOobeUI()); ShowInWebUI(); } void LacrosDataMigrationScreenHandler::SetProgressValue(int progress) { - CallJS("login.LacrosDataMigrationScreen.setProgressValue", progress); + CallExternalAPI("setProgressValue", progress); } void LacrosDataMigrationScreenHandler::ShowSkipButton() { - CallJS("login.LacrosDataMigrationScreen.showSkipButton"); + CallExternalAPI("showSkipButton"); } void LacrosDataMigrationScreenHandler::SetLowBatteryStatus(bool low_battery) { - CallJS("login.LacrosDataMigrationScreen.setLowBatteryStatus", low_battery); + CallExternalAPI("setLowBatteryStatus", low_battery); } void LacrosDataMigrationScreenHandler::SetFailureStatus( const absl::optional<uint64_t>& required_size, bool show_goto_files) { - CallJS("login.LacrosDataMigrationScreen.setFailureStatus", - required_size.has_value() - ? ui::FormatBytes(static_cast<int64_t>(required_size.value())) - : std::u16string(), - show_goto_files); -} - -void LacrosDataMigrationScreenHandler::OnCurrentScreenChanged( - OobeScreenId current_screen, - OobeScreenId new_screen) { - if (new_screen == kScreenId && screen_) - screen_->OnViewVisible(); - observation_.Reset(); -} - -void LacrosDataMigrationScreenHandler::OnDestroyingOobeUI() { - observation_.Reset(); -} - -void LacrosDataMigrationScreenHandler::InitializeDeprecated() { - if (show_on_init_) { - Show(); - show_on_init_ = false; - } + CallExternalAPI( + "setFailureStatus", + required_size.has_value() + ? ui::FormatBytes(static_cast<int64_t>(required_size.value())) + : std::u16string(), + show_goto_files); } } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.h index 816087f..6b8c713 100644 --- a/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/lacros_data_migration_screen_handler.h
@@ -5,30 +5,23 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_LACROS_DATA_MIGRATION_SCREEN_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_LACROS_DATA_MIGRATION_SCREEN_HANDLER_H_ +#include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace ash { -class LacrosDataMigrationScreen; -} - namespace chromeos { // Interface for dependency injection between LacrosDataMigrationScreen and its // WebUI representation. -class LacrosDataMigrationScreenView { +class LacrosDataMigrationScreenView + : public base::SupportsWeakPtr<LacrosDataMigrationScreenView> { public: - constexpr static StaticOobeScreenId kScreenId{"lacros-data-migration"}; + inline constexpr static StaticOobeScreenId kScreenId{ + "lacros-data-migration", "LacrosDataMigrationScreen"}; - virtual ~LacrosDataMigrationScreenView() {} - - // Binds `screen` to the view. - virtual void Bind(ash::LacrosDataMigrationScreen* screen) = 0; - - // Unbinds the screen from the view. - virtual void Unbind() = 0; + virtual ~LacrosDataMigrationScreenView() = default; // Shows the contents of the screen. virtual void Show() = 0; @@ -51,8 +44,7 @@ }; class LacrosDataMigrationScreenHandler : public BaseScreenHandler, - public LacrosDataMigrationScreenView, - public OobeUI::Observer { + public LacrosDataMigrationScreenView { public: using TView = LacrosDataMigrationScreenView; @@ -68,30 +60,12 @@ ::login::LocalizedValuesBuilder* builder) override; // LacrosDataMigrationScreenView: - void Bind(ash::LacrosDataMigrationScreen* screen) override; - void Unbind() override; void Show() override; void SetProgressValue(int progress) override; void ShowSkipButton() override; void SetLowBatteryStatus(bool low_battery) override; void SetFailureStatus(const absl::optional<uint64_t>& required_size, bool show_goto_files) override; - - // OobeUI::Observer: - void OnCurrentScreenChanged(OobeScreenId current_screen, - OobeScreenId new_screen) override; - void OnDestroyingOobeUI() override; - - private: - // BaseScreenHandler: - void InitializeDeprecated() override; - - ash::LacrosDataMigrationScreen* screen_ = nullptr; - - // Whether the screen should be shown right after initialization. - bool show_on_init_ = false; - - base::ScopedObservation<OobeUI, OobeUI::Observer> observation_{this}; }; } // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc index 46b89fdc..3a334c5 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -755,6 +755,7 @@ std::string usage_string; std::string cookie_string; std::string fps_string; + bool fpsPolicy = false; for (const auto& site : root->children()) { std::string title = base::UTF16ToUTF8(site->GetTitle()); if (title != usage_host_) @@ -789,9 +790,10 @@ IDS_SETTINGS_SITE_SETTINGS_NUM_COOKIES, num_cookies)); } + auto* privacy_sandbox_service = + PrivacySandboxServiceFactory::GetForProfile(profile_); auto fps_map = - GetFpsMap(PrivacySandboxServiceFactory::GetForProfile(profile_), - cookies_tree_model_.get()); + GetFpsMap(privacy_sandbox_service, cookies_tree_model_.get()); auto etld_plus1 = GetEtldPlusOne(site->GetDetailedInfo().origin); if (fps_map.count(etld_plus1)) { fps_string = @@ -800,12 +802,14 @@ IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_MEMBERSHIP_LABEL), "MEMBERS", static_cast<int>(fps_map[etld_plus1].second), "FPS_OWNER", fps_map[etld_plus1].first)); + fpsPolicy = privacy_sandbox_service->IsPartOfManagedFirstPartySet( + ConvertEtldToSchemefulSite(etld_plus1)); } break; } FireWebUIListener("usage-total-changed", base::Value(usage_host_), base::Value(usage_string), base::Value(cookie_string), - base::Value(fps_string)); + base::Value(fps_string), base::Value(fpsPolicy)); } void SiteSettingsHandler::OnContentSettingChanged(
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 386d9c3..e75908b0 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -500,7 +500,8 @@ void ValidateUsageInfo(const std::string& expected_usage_host, const std::string& expected_usage_string, const std::string& expected_cookie_string, - const std::string& expected_fps_member_count_string) { + const std::string& expected_fps_member_count_string, + const bool expected_fps_policy) { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); EXPECT_EQ("cr.webUIListenerCallback", data.function_name()); @@ -518,6 +519,9 @@ ASSERT_TRUE(data.arg_nth(4)->is_string()); EXPECT_EQ(expected_fps_member_count_string, data.arg_nth(4)->GetString()); + + ASSERT_TRUE(data.arg_nth(5)->is_bool()); + EXPECT_EQ(expected_fps_policy, data.arg_nth(5)->GetBool()); } void CreateIncognitoProfile() { @@ -3015,11 +3019,21 @@ ConvertEtldToSchemefulSite("google.com")}, {ConvertEtldToSchemefulSite("unrelated.com"), ConvertEtldToSchemefulSite("unrelated.com")}, + {ConvertEtldToSchemefulSite("ungrouped.com"), + ConvertEtldToSchemefulSite("ungrouped.com")}, }; EXPECT_CALL(*mock_privacy_sandbox_service(), GetFirstPartySets()) - .Times(3) + .Times(4) .WillRepeatedly(Return(first_party_sets)); + EXPECT_CALL(*mock_privacy_sandbox_service(), IsPartOfManagedFirstPartySet(_)) + .Times(1) + .WillOnce(Return(false)); + EXPECT_CALL( + *mock_privacy_sandbox_service(), + IsPartOfManagedFirstPartySet(ConvertEtldToSchemefulSite("ungrouped.com"))) + .Times(1) + .WillOnce(Return(true)); // Confirm that usage info only returns unpartitioned storage. SetUpCookiesTreeModel(); @@ -3031,20 +3045,26 @@ args.Append("www.example.com"); handler()->HandleFetchUsageTotal(args); handler()->OnGetUsageInfo(); - ValidateUsageInfo("www.example.com", "2 B", "1 cookie", ""); + ValidateUsageInfo("www.example.com", "2 B", "1 cookie", "", false); args.clear(); args.Append("example.com"); handler()->HandleFetchUsageTotal(args); handler()->OnGetUsageInfo(); - ValidateUsageInfo("example.com", "", "1 cookie", ""); + ValidateUsageInfo("example.com", "", "1 cookie", "", false); args.clear(); args.Append("google.com"); handler()->HandleFetchUsageTotal(args); handler()->OnGetUsageInfo(); ValidateUsageInfo("google.com", "", "2 cookies", - "Allowed for 2 google.com sites"); + "Allowed for 2 google.com sites", false); + args.clear(); + args.Append("ungrouped.com"); + handler()->HandleFetchUsageTotal(args); + handler()->OnGetUsageInfo(); + ValidateUsageInfo("ungrouped.com", "", "1 cookie", + "Allowed for 1 ungrouped.com site", true); } TEST_F(SiteSettingsHandlerTest, NonTreeModelDeletion) {
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 2758c468..90ecc48 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1663566514-f56fe366b1f360f6d16fdd0d1bcaab37366ba833.profdata +chrome-linux-main-1663588623-804b1adbe784dc30c50f2abf71ce5bf6d9691add.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index ff5c4b96..80d74e4f 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1663566514-9601272b52e842a191079ee9cc0f2a5b91b212b3.profdata +chrome-mac-arm-main-1663588623-0d21a7834a2120d659431afc87e83e7fbb336a63.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 7697f60..12d741b 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1663566514-961fdfd6e3118d77503f9a24905b297e20da4aa4.profdata +chrome-mac-main-1663588623-6b779d178efd28075e69d3dc57b9626971d19d87.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 9e8a518f..e5c6a36e 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1663566514-c0dde79fdf0e1aa6435563023c1e91ad6092f8df.profdata +chrome-win32-main-1663599267-3bca381c6a982340a6ab5b946eae59659e7fb5ff.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 134bde6..b0ed40cb 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1663566514-f6da677bee1d54cf18a94948ef2bd09ad2af604d.profdata +chrome-win64-main-1663599267-49bc27a19df9c0cee01e18f9210e05d2e30047ea.profdata
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn index b6656f9..3b366fe 100644 --- a/chrome/installer/linux/BUILD.gn +++ b/chrome/installer/linux/BUILD.gn
@@ -94,13 +94,16 @@ # TODO(mmoss) Any convenient way to get all the relevant build files? # (e.g. all locales, resources, etc.) packaging_files = packaging_files_binaries + [ - "$root_out_dir/vk_swiftshader_icd.json", "$root_out_dir/xdg-mime", "$root_out_dir/xdg-settings", "$root_out_dir/locales/en-US.pak", "$root_out_dir/MEIPreload/manifest.json", "$root_out_dir/MEIPreload/preloaded_data.pb", ] +if (enable_swiftshader) { + packaging_files += [ "$root_out_dir/vk_swiftshader_icd.json" ] +} + if (use_qt) { # Even though this is a shared library, add it to `packaging_files` instead of # `packaging_files_shlibs` to skip the dependency check. This is intentional
diff --git a/chrome/services/printing/print_backend_service_impl.cc b/chrome/services/printing/print_backend_service_impl.cc index d37be63..d281e90 100644 --- a/chrome/services/printing/print_backend_service_impl.cc +++ b/chrome/services/printing/print_backend_service_impl.cc
@@ -9,6 +9,7 @@ #include <utility> #include <vector> +#include "base/check.h" #include "base/containers/adapters.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" @@ -406,13 +407,7 @@ void PrintBackendServiceImpl::EnumeratePrinters( mojom::PrintBackendService::EnumeratePrintersCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run( - mojom::PrinterListResult::NewResultCode(mojom::ResultCode::kFailed)); - return; - } - + DCHECK(print_backend_); PrinterList printer_list; mojom::ResultCode result = print_backend_->EnumeratePrinters(printer_list); if (result != mojom::ResultCode::kSuccess) { @@ -425,12 +420,7 @@ void PrintBackendServiceImpl::GetDefaultPrinterName( mojom::PrintBackendService::GetDefaultPrinterNameCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run(mojom::DefaultPrinterNameResult::NewResultCode( - mojom::ResultCode::kFailed)); - return; - } + DCHECK(print_backend_); std::string default_printer; mojom::ResultCode result = print_backend_->GetDefaultPrinterName(default_printer); @@ -447,14 +437,7 @@ const std::string& printer_name, mojom::PrintBackendService::GetPrinterSemanticCapsAndDefaultsCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run( - mojom::PrinterSemanticCapsAndDefaultsResult::NewResultCode( - mojom::ResultCode::kFailed)); - return; - } - + DCHECK(print_backend_); crash_keys_ = std::make_unique<crash_keys::ScopedPrinterInfo>( print_backend_->GetPrinterDriverInfo(printer_name)); @@ -475,13 +458,7 @@ void PrintBackendServiceImpl::FetchCapabilities( const std::string& printer_name, mojom::PrintBackendService::FetchCapabilitiesCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run(mojom::PrinterCapsAndInfoResult::NewResultCode( - mojom::ResultCode::kFailed)); - return; - } - + DCHECK(print_backend_); crash_keys_ = std::make_unique<crash_keys::ScopedPrinterInfo>( print_backend_->GetPrinterDriverInfo(printer_name)); @@ -528,12 +505,7 @@ void PrintBackendServiceImpl::UseDefaultSettings( mojom::PrintBackendService::UseDefaultSettingsCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run( - mojom::PrintSettingsResult::NewResultCode(mojom::ResultCode::kFailed)); - return; - } + DCHECK(print_backend_); // Use a one-time `PrintingContext` to get the print settings. std::unique_ptr<PrintingContext> context = @@ -588,20 +560,10 @@ void PrintBackendServiceImpl::UpdatePrintSettings( base::Value::Dict job_settings, mojom::PrintBackendService::UpdatePrintSettingsCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run( - mojom::PrintSettingsResult::NewResultCode(mojom::ResultCode::kFailed)); - return; - } + DCHECK(print_backend_); const std::string* printer_name = job_settings.FindString(kSettingDeviceName); - if (!printer_name) { - DLOG(ERROR) << "Job settings is missing printer name"; - std::move(callback).Run( - mojom::PrintSettingsResult::NewResultCode(mojom::ResultCode::kFailed)); - return; - } + DCHECK(printer_name); crash_keys_ = std::make_unique<crash_keys::ScopedPrinterInfo>( print_backend_->GetPrinterDriverInfo(*printer_name)); @@ -643,11 +605,7 @@ mojom::PrintTargetType target_type, const PrintSettings& settings, mojom::PrintBackendService::StartPrintingCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } + DCHECK(print_backend_); #if BUILDFLAG(IS_CHROMEOS) && defined(USE_CUPS) CupsConnectionPool* connection_pool = CupsConnectionPool::GetInstance(); @@ -697,19 +655,9 @@ const gfx::Rect& page_content_rect, float shrink_factor, mojom::PrintBackendService::RenderPrintedPageCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } - + DCHECK(print_backend_); DocumentHelper* document_helper = GetDocumentHelper(document_cookie); - if (!document_helper) { - DLOG(ERROR) << "Unrecognized document " << document_cookie - << " for printing page " << page_index; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } + DCHECK(document_helper); // Safe to use `base::Unretained(this)` because `this` outlives the async // call and callback. The entire service process goes away when `this` @@ -729,18 +677,9 @@ mojom::MetafileDataType data_type, base::ReadOnlySharedMemoryRegion serialized_document, mojom::PrintBackendService::RenderPrintedDocumentCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } - + DCHECK(print_backend_); DocumentHelper* document_helper = GetDocumentHelper(document_cookie); - if (!document_helper) { - DLOG(ERROR) << "Unrecognized document " << document_cookie << " to be done"; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } + DCHECK(document_helper); // Safe to use `base::Unretained(this)` because `this` outlives the async // call and callback. The entire service process goes away when `this` @@ -756,18 +695,9 @@ void PrintBackendServiceImpl::DocumentDone( int document_cookie, mojom::PrintBackendService::DocumentDoneCallback callback) { - if (!print_backend_) { - DLOG(ERROR) << "Print backend instance needs initialization for locale."; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } - + DCHECK(print_backend_); DocumentHelper* document_helper = GetDocumentHelper(document_cookie); - if (!document_helper) { - DLOG(ERROR) << "Unrecognized document " << document_cookie << " to be done"; - std::move(callback).Run(mojom::ResultCode::kFailed); - return; - } + DCHECK(document_helper); // Safe to use `base::Unretained(this)` because `this` outlives the async // call and callback. The entire service process goes away when `this`
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 558bb40..ba923a7 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -1005,6 +1005,17 @@ alert_button.Click() self.assertTrue(self._driver.IsAlertOpen()) + def testClickElementThatRestartsBrowser(self): + # https://bugs.chromium.org/p/chromedriver/issues/detail?id=4221 + self._driver.Load('chrome://flags') + reset_all = self._driver.FindElement('css selector', + '#experiment-reset-all') + reset_all.Click() + relaunch = self._driver.FindElement('css selector', + '#experiment-restart-button') + # Clicking Relaunch should not crash chromedriver. + relaunch.Click() + def testClickElementJustOutsidePage(self): # https://bugs.chromium.org/p/chromedriver/issues/detail?id=3878 self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html')) @@ -5429,10 +5440,39 @@ # Wait indefinitely until time out. conn.WaitForResponse(-1) - # TODO(nechaev): Test over tab switching by different means. -class ClassiTest(ChromeDriverBaseTestWithWebServer): + def testContextCountForIFrames(self): + path = os.path.join(chrome_paths.GetTestData(), 'chromedriver', + 'nested.html') + url = 'file://' + urllib.request.pathname2url(path) + # This is a regression test. Loading the same url twice leads + # to the duplication of the nested browsing context. + self._driver.Load(url) + self._driver.Load(url) + + conn = self.createWebSocketConnection() + + cmd_id = conn.SendCommand({ + 'method': 'browsingContext.getTree', + 'params': { + } + }) + resp = conn.WaitForResponse(cmd_id) + contexts = resp['result']['contexts'] + + self.assertIsNotNone(contexts) + self.assertIsInstance(contexts, list) + self.assertEqual(1, len(contexts)) + + parent_context = contexts[0] + children = parent_context['children'] + self.assertIsNotNone(children) + self.assertIsInstance(children, list) + self.assertEqual(1, len(children)) + + +class ClassicTest(ChromeDriverBaseTestWithWebServer): def testAfterLastPage(self): driver = self.CreateDriver(web_socket_url = False)
diff --git a/chrome/test/chromedriver/window_commands.cc b/chrome/test/chromedriver/window_commands.cc index 31c6cbf..25fee057 100644 --- a/chrome/test/chromedriver/window_commands.cc +++ b/chrome/test/chromedriver/window_commands.cc
@@ -724,6 +724,11 @@ // When pageload strategy is None, new navigation can occur during // execution of a command. Retry the command. continue; + } else if (status.code() == kDisconnected) { + // Some commands, like clicking a button or link which closes the window, + // may result in a kDisconnected error code. |web_view| may be invalid at + // at this point. + return status; } else if (status.IsError()) { // If the command failed while a new page or frame started loading, retry // the command after the pending navigation has completed.
diff --git a/chrome/test/data/webui/mocha_adapter.js b/chrome/test/data/webui/mocha_adapter.js index 91ce3446..7026468 100644 --- a/chrome/test/data/webui/mocha_adapter.js +++ b/chrome/test/data/webui/mocha_adapter.js
@@ -94,5 +94,5 @@ // Mocha timeouts are set to 2 seconds initially. This isn't nearly enough for // slower bots (e.g., Dr. Memory). Disable timeouts globally, because the C++ // will handle it (and has scaled timeouts for slower bots). - enableTimeouts: false, + timeout: '0', });
diff --git a/chrome/test/data/webui/settings/site_details_tests.ts b/chrome/test/data/webui/settings/site_details_tests.ts index 4fbde8a3..d85dc8c 100644 --- a/chrome/test/data/webui/settings/site_details_tests.ts +++ b/chrome/test/data/webui/settings/site_details_tests.ts
@@ -516,10 +516,41 @@ assertEquals('foo.com', hostRequested); webUIListenerCallback( 'usage-total-changed', hostRequested, '1 KB', '10 cookies', - 'Allowed for 1 foo.com site'); + 'Allowed for 1 foo.com site', false); assertFalse(testElement.$.fpsMembership.hidden); assertEquals( 'Allowed for 1 foo.com site', testElement.$.fpsMembership.textContent!.trim()); + flush(); + // Assert first party set policy is null. + const fpsPolicy = + testElement.shadowRoot!.querySelector<HTMLElement>('#fpsPolicy'); + assertEquals(null, fpsPolicy); + }); + test( + 'first party set policy shown when managed key is set to true', + async function() { + const origin = 'https://foo.com:443'; + browserProxy.setPrefs(prefs); + testElement = createSiteDetails(origin); + + const results = await Promise.all([ + websiteUsageProxy.whenCalled('fetchUsageTotal'), + ]); + + const hostRequested = results[0]; + assertEquals('foo.com', hostRequested); + webUIListenerCallback( + 'usage-total-changed', hostRequested, '1 KB', '10 cookies', + 'Allowed for 1 foo.com site', true); + assertFalse(testElement.$.fpsMembership.hidden); + assertEquals( + 'Allowed for 1 foo.com site', + testElement.$.fpsMembership.textContent!.trim()); + flush(); + // Assert first party set policy is shown. + const fpsPolicy = + testElement.shadowRoot!.querySelector<HTMLElement>('#fpsPolicy'); + assertFalse(fpsPolicy!.hidden); }); });
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index be46a51..2c0ace0 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -183,9 +183,6 @@ # https://crbug.com/1341076 "launcher.BubbleLaunchApp.disable_launcher_app_sort", - # https://crbug.com/1236234 - "lacros.AudioPlay", - # https://crbug.com/1346149 "apps.Sharesheet", @@ -247,6 +244,9 @@ "inputs.VirtualKeyboardLoginScreen.clamshell", "inputs.VirtualKeyboardLoginScreen.tablet", "inputs.VirtualKeyboardTypingUserMode.incognito", + + # https://crbug.com/1365284 + "crostini.RestartApp.clamshell_stable", ] # To create filters to be used on specific builders add them like this: @@ -260,4 +260,11 @@ tast_disabled_tests_from_lacros_all = [ # https://crbug.com/1329764 "policy.HistoryClustersVisible", + + # https://crbug.com/1361163 + "lacros.AudioPinnedStream.play", + "lacros.AudioPinnedStream.record", + + # https://crbug.com/1236234 + "lacros.AudioPlay", ]
diff --git a/components/BUILD.gn b/components/BUILD.gn index 0d03737..ab721c66f 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -103,7 +103,6 @@ deps = [ "//base", - "//components/access_code_cast/common:unit_tests", "//components/apdu:unit_tests", "//components/assist_ranker:unit_tests", "//components/autofill/core/browser:unit_tests", @@ -526,6 +525,7 @@ # Desktop - only deps. if (!is_android && !is_ios) { deps += [ + "//components/access_code_cast/common:unit_tests", # See comment in components / guest_view / browser / BUILD.gn for why # guest_view is currently non - mobile. "//components/guest_view/browser:unit_tests",
diff --git a/components/access_code_cast/common/BUILD.gn b/components/access_code_cast/common/BUILD.gn index 63e8b26..0687c5e 100644 --- a/components/access_code_cast/common/BUILD.gn +++ b/components/access_code_cast/common/BUILD.gn
@@ -18,4 +18,7 @@ "//components/access_code_cast/common", "//testing/gtest", ] + data = [ + "//tools/metrics/histograms/enums.xml", + ] }
diff --git a/components/access_code_cast/common/access_code_cast_metrics_unittest.cc b/components/access_code_cast/common/access_code_cast_metrics_unittest.cc index 06e6e0c2..3cdda4b1 100644 --- a/components/access_code_cast/common/access_code_cast_metrics_unittest.cc +++ b/components/access_code_cast/common/access_code_cast_metrics_unittest.cc
@@ -4,7 +4,9 @@ #include "components/access_code_cast/common/access_code_cast_metrics.h" +#include "base/metrics/histogram_functions.h" #include "base/time/time.h" +#include "base/test/metrics/histogram_enum_reader.h" #include "base/test/metrics/histogram_tester.h" #include "testing/gtest/include/gtest/gtest.h" @@ -85,8 +87,12 @@ 1 /* RouteRequest::OK */, AccessCodeCastCastMode::kDesktopMirror); histogram_tester.ExpectBucketCount( "AccessCodeCast.Discovery.CastModeOnSuccess", 2, 1); + AccessCodeCastMetrics::OnCastSessionResult( + 1 /* RouteRequest::OK */, AccessCodeCastCastMode::kRemotePlayback); + histogram_tester.ExpectBucketCount( + "AccessCodeCast.Discovery.CastModeOnSuccess", 3, 1); histogram_tester.ExpectTotalCount( - "AccessCodeCast.Discovery.CastModeOnSuccess", 3); + "AccessCodeCast.Discovery.CastModeOnSuccess", 4); } TEST(AccessCodeCastMetricsTest, RecordDialogLoadTime) { @@ -147,3 +153,43 @@ histogram_tester.ExpectBucketCount( "AccessCodeCast.Discovery.RememberedDevicesCount", 100, 2); } + +TEST(AccessCodeCastMetricsTest, CheckMetricsEnums) { + base::HistogramTester histogram_tester; + + // AddSinkResult + absl::optional<base::HistogramEnumEntryMap> add_sink_results = + base::ReadEnumFromEnumsXml("AccessCodeCastAddSinkResult"); + EXPECT_TRUE(add_sink_results->size() == + static_cast<int>(AccessCodeCastAddSinkResult::kMaxValue) + 1) + << "'AccessCodeCastAddSinkResult' enum was changed in " + "access_code_cast_metrics.h. Please update the entry in " + "enums.xml to match."; + + // CastMode + absl::optional<base::HistogramEnumEntryMap> cast_modes = + base::ReadEnumFromEnumsXml("AccessCodeCastCastMode"); + EXPECT_TRUE(cast_modes->size() == + static_cast<int>(AccessCodeCastCastMode::kMaxValue) + 1) + << "'AccessCodeCastCastMode' enum was changed in " + "access_code_cast_metrics.h. Please update the entry in " + "enums.xml to match."; + + // DialogCloseReason + absl::optional<base::HistogramEnumEntryMap> dialog_close_reasons = + base::ReadEnumFromEnumsXml("AccessCodeCastDialogCloseReason"); + EXPECT_TRUE(dialog_close_reasons->size() == + static_cast<int>(AccessCodeCastDialogCloseReason::kMaxValue) + 1) + << "'AccessCodeCastDialogCloseReason' enum was changed in " + "access_code_cast_metrics.h. Please update the entry in " + "enums.xml to match."; + + // DialogOpenLocation + absl::optional<base::HistogramEnumEntryMap> dialog_open_locations = + base::ReadEnumFromEnumsXml("AccessCodeCastDialogOpenLocation"); + EXPECT_TRUE(dialog_open_locations->size() == + static_cast<int>(AccessCodeCastDialogOpenLocation::kMaxValue) + 1) + << "'AccessCodeCastDialogOpenLocation' enum was changed in " + "access_code_cast_metrics.h. Please update the entry in " + "enums.xml to match."; +}
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index c11311f9..710ad64 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -499,16 +499,6 @@ return std::u16string(); } -// Helper for |InferLabelForElement()| that infers a label, if possible, from -// the aria-label. e.g. <input aria-label="foo"> -std::u16string InferLabelFromAriaLabel(const WebFormControlElement& element) { - static const base::NoDestructor<WebString> kAriaLabel("aria-label"); - if (element.HasAttribute(*kAriaLabel)) - return element.GetAttribute(*kAriaLabel).Utf16(); - - return std::u16string(); -} - // Helper for |InferLabelForElement()| that infers a label, from // the value attribute when it is present and user has not typed in (if // element's value attribute is same as the element's value). @@ -811,7 +801,7 @@ } // If we didn't find a placeholder, check for aria-label text. - inferred_label = InferLabelFromAriaLabel(element); + inferred_label = GetAriaLabel(element.GetDocument(), element); if (IsLabelValid(inferred_label)) { label_source = FormFieldData::LabelSource::kAriaLabel; label = std::move(inferred_label);
diff --git a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc index 20fc762..819539a 100644 --- a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc
@@ -189,7 +189,8 @@ for (const AutofillSpecifics& specifics : remote_data) { initial_updates.push_back(SpecificsToUpdateResponse(specifics)); } - real_processor_->OnUpdateReceived(state, std::move(initial_updates)); + real_processor_->OnUpdateReceived(state, std::move(initial_updates), + /*gc_directive=*/absl::nullopt); } void SaveSpecificsToTable(
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc index 352a769..40b5b3f 100644 --- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
@@ -315,7 +315,8 @@ for (const AutofillProfileSpecifics& specifics : remote_data) { initial_updates.push_back(SpecificsToUpdateResponse(specifics)); } - real_processor_->OnUpdateReceived(state, std::move(initial_updates)); + real_processor_->OnUpdateReceived(state, std::move(initial_updates), + /*gc_directive=*/absl::nullopt); } void ApplySyncChanges(EntityChangeList changes) {
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc index 3490016..635a42f 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
@@ -360,7 +360,8 @@ for (const WalletMetadataSpecifics& specifics : remote_data) { updates.push_back(SpecificsToUpdateResponse(specifics)); } - real_processor_->OnUpdateReceived(state, std::move(updates)); + real_processor_->OnUpdateReceived(state, std::move(updates), + /*gc_directive=*/absl::nullopt); } void ReceiveTombstones( @@ -377,7 +378,8 @@ updates.push_back( SpecificsToUpdateResponse(specifics, /*is_deleted=*/true)); } - real_processor_->OnUpdateReceived(state, std::move(updates)); + real_processor_->OnUpdateReceived(state, std::move(updates), + /*gc_directive=*/absl::nullopt); } EntityData SpecificsToEntity(const WalletMetadataSpecifics& specifics,
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_offer_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_offer_sync_bridge_unittest.cc index c7afaca..3a34d93 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_offer_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_offer_sync_bridge_unittest.cc
@@ -32,6 +32,7 @@ #include "components/sync/model/in_memory_metadata_change_list.h" #include "components/sync/model/sync_data.h" #include "components/sync/protocol/autofill_offer_specifics.pb.h" +#include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/entity_data.h" #include "components/sync/protocol/entity_specifics.pb.h" #include "components/sync/protocol/model_type_state.pb.h" @@ -179,14 +180,16 @@ // Initialize the processor with initial_sync_done. sync_pb::ModelTypeState state; state.set_initial_sync_done(true); - state.mutable_progress_marker() - ->mutable_gc_directive() - ->set_version_watermark(1); + + sync_pb::GarbageCollectionDirective gc_directive; + gc_directive.set_version_watermark(1); + syncer::UpdateResponseDataList initial_updates; for (const AutofillOfferSpecifics& specifics : remote_data) { initial_updates.push_back(SpecificsToUpdateResponse(specifics)); } - real_processor_->OnUpdateReceived(state, std::move(initial_updates)); + real_processor_->OnUpdateReceived(state, std::move(initial_updates), + gc_directive); } std::vector<AutofillOfferSpecifics> GetAllLocalData() {
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc index ceea96b..c48d4c79 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -39,6 +39,7 @@ #include "components/sync/model/in_memory_metadata_change_list.h" #include "components/sync/model/sync_data.h" #include "components/sync/protocol/autofill_specifics.pb.h" +#include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/entity_data.h" #include "components/sync/protocol/entity_metadata.pb.h" #include "components/sync/protocol/entity_specifics.pb.h" @@ -268,14 +269,15 @@ // Initialize the processor with initial_sync_done. sync_pb::ModelTypeState state; state.set_initial_sync_done(true); - state.mutable_progress_marker() - ->mutable_gc_directive() - ->set_version_watermark(1); + + sync_pb::GarbageCollectionDirective gc_directive; + gc_directive.set_version_watermark(1); syncer::UpdateResponseDataList initial_updates; for (const AutofillWalletSpecifics& specifics : remote_data) { initial_updates.push_back(SpecificsToUpdateResponse(specifics)); } - real_processor_->OnUpdateReceived(state, std::move(initial_updates)); + real_processor_->OnUpdateReceived(state, std::move(initial_updates), + gc_directive); } void ExpectCountsOfWalletMetadataInDB(unsigned int cards_count,
diff --git a/components/autofill/ios/form_util/resources/fill.js b/components/autofill/ios/form_util/resources/fill.js index 64337649..1237455 100644 --- a/components/autofill/ios/form_util/resources/fill.js +++ b/components/autofill/ios/form_util/resources/fill.js
@@ -1269,25 +1269,6 @@ /** * Helper for |InferLabelForElement()| that infers a label, if possible, from - * the aria-label attribute. - * - * It is based on the logic in - * string16 InferLabelFromAriaLabel(const WebFormControlElement& element) - * in chromium/src/components/autofill/content/renderer/form_autofill_util.cc. - * - * @param {FormControlElement} element An element to examine. - * @return {string} The label of element. - */ -__gCrWeb.fill.inferLabelFromAriaLabel = function(element) { - if (!element) { - return ''; - } - - return element.getAttribute('aria-label') || ''; -}; - -/** - * Helper for |InferLabelForElement()| that infers a label, if possible, from * the value attribute when it is present and user has not typed in (if * element's value attribute is same as the element's value). * @@ -1761,7 +1742,7 @@ } // If we didn't find a placeholder, check for the aria-label case. - inferredLabel = __gCrWeb.fill.inferLabelFromAriaLabel(element); + inferredLabel = __gCrWeb.fill.getAriaLabel(element); if (__gCrWeb.fill.IsLabelValid(inferredLabel)) { return inferredLabel; }
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc index 6235b77..9d9dfa74 100644 --- a/components/autofill_assistant/browser/controller.cc +++ b/components/autofill_assistant/browser/controller.cc
@@ -45,7 +45,10 @@ namespace { bool ShouldSendModelVersionInContext(const TriggerContext& trigger_context) { - return trigger_context.GetScriptParameters() + return base::FeatureList::IsEnabled( + autofill_assistant::features:: + kAutofillAssistantSendModelVersionInClientContext) || + trigger_context.GetScriptParameters() .GetSendAnnotateDomModelVersion() || base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kAutofillAssistantAnnotateDom);
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc index 0809963..5cf30b7c 100644 --- a/components/autofill_assistant/browser/controller_unittest.cc +++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -2672,6 +2672,25 @@ TriggerContext::Options())); } +TEST_F(ControllerTest, AttachesAvailableModelVersionWhenFeatureEnabled) { + scoped_feature_list_.Reset(); + scoped_feature_list_.InitAndEnableFeature( + features::kAutofillAssistantSendModelVersionInClientContext); + + EXPECT_CALL(mock_client_, GetAnnotateDomModelVersion) + .WillOnce(RunOnceCallback<0>(123456)); + EXPECT_CALL(*mock_service_, UpdateAnnotateDomModelContext(123456)); + EXPECT_CALL(*mock_service_, GetScriptsForUrl) + .WillOnce(RunOnceCallback<2>(net::HTTP_OK, "", + ServiceRequestSender::ResponseInfo{})); + + controller_->Start(GURL("https://www.example.com"), + std::make_unique<TriggerContext>( + /* parameters = */ std::make_unique<ScriptParameters>( + base::flat_map<std::string, std::string>{}), + TriggerContext::Options())); +} + TEST_F(ControllerTest, UpdatesJsFlowLibraryLoaded) { EXPECT_CALL(*mock_service_, UpdateJsFlowLibraryLoaded(true));
diff --git a/components/autofill_assistant/browser/features.cc b/components/autofill_assistant/browser/features.cc index fe00e67f6..6b967e8 100644 --- a/components/autofill_assistant/browser/features.cc +++ b/components/autofill_assistant/browser/features.cc
@@ -130,6 +130,11 @@ const base::Feature kAutofillAssistantRemoteAssistantUi{ "AutofillAssistantRemoteAssistantUi", base::FEATURE_DISABLED_BY_DEFAULT}; +// Send the Moonracer model version in the client context. +const base::Feature kAutofillAssistantSendModelVersionInClientContext{ + "AutofillAssistantSendModelVersionInClientContext", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Used to configure URL heuristics for upcoming new features. extern const base::Feature kAutofillAssistantUrlHeuristic1{ "AutofillAssistantUrlHeuristic1", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/autofill_assistant/browser/features.h b/components/autofill_assistant/browser/features.h index 4742851..cc164ab 100644 --- a/components/autofill_assistant/browser/features.h +++ b/components/autofill_assistant/browser/features.h
@@ -33,6 +33,7 @@ extern const base::Feature kAutofillAssistantSignGetActionsRequests; extern const base::Feature kAutofillAssistantSignGetNoRoundTripScriptsByHashRequests; +extern const base::Feature kAutofillAssistantSendModelVersionInClientContext; extern const base::Feature kAutofillAssistantUrlHeuristic1; extern const base::Feature kAutofillAssistantUrlHeuristic2; extern const base::Feature kAutofillAssistantUrlHeuristic3;
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc index d95e19a..7d0d7590 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc
@@ -100,6 +100,7 @@ mojo::PendingAssociatedReceiver<mojom::AutofillAssistantAgent> pending_receiver) { receiver_.Bind(std::move(pending_receiver)); + receiver_.reset_on_disconnect(); } void AutofillAssistantAgent::OnDestruct() { @@ -135,14 +136,23 @@ base::TimeDelta model_timeout, base::OnceCallback<void(mojom::ModelStatus, base::File, const std::string&)> callback) { - GetDriver().GetAnnotateDomModel(model_timeout, std::move(callback)); + mojo::AssociatedRemote<mojom::AutofillAssistantDriver>& driver = GetDriver(); + + if (!driver || !driver.is_connected()) { + std::move(callback).Run(mojom::ModelStatus::kUnexpectedError, base::File(), + /*overrides_policy=*/""); + return; + } + driver->GetAnnotateDomModel(model_timeout, std::move(callback)); } -mojom::AutofillAssistantDriver& AutofillAssistantAgent::GetDriver() { +mojo::AssociatedRemote<mojom::AutofillAssistantDriver>& +AutofillAssistantAgent::GetDriver() { if (!driver_) { render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(&driver_); + driver_.reset_on_disconnect(); } - return *driver_; + return driver_; } void AutofillAssistantAgent::OnGetModelFile(
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent.h b/components/autofill_assistant/content/renderer/autofill_assistant_agent.h index 3242fd6..06962af8 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent.h +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent.h
@@ -66,7 +66,7 @@ base::OnceCallback< void(mojom::ModelStatus, base::File, const std::string&)> callback); - mojom::AutofillAssistantDriver& GetDriver(); + mojo::AssociatedRemote<mojom::AutofillAssistantDriver>& GetDriver(); void OnGetModelFile(base::Time start_time, blink::WebLocalFrame* frame,
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc index 2c3d3dd..a548d57 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc
@@ -53,7 +53,6 @@ void(mojom::ModelStatus, base::File, const std::string&)> callback), (override)); - private: mojo::AssociatedReceiverSet<mojom::AutofillAssistantDriver> receivers_; }; @@ -134,6 +133,52 @@ EXPECT_FALSE(web_element.HasAttribute("semantic-prediction")); } +TEST_F(AutofillAssistantAgentBrowserTest, ReconnectsAfterDisconnect) { + EXPECT_CALL(autofill_assistant_driver_, GetAnnotateDomModel) + .Times(2) + .WillRepeatedly( + [&](base::TimeDelta model_timeout, + base::OnceCallback<void(mojom::ModelStatus, base::File, + const std::string&)> callback) { + std::move(callback).Run(mojom::ModelStatus::kSuccess, + model_file_.Duplicate(), std::string()); + }); + + base::MockCallback<base::OnceCallback<void(mojom::NodeDataStatus, + const std::vector<NodeData>&)>> + callback; + + EXPECT_CALL(callback, Run(mojom::NodeDataStatus::kSuccess, SizeIs(1))) + .Times(2); + + LoadHTML(R"( + <div> + <h1>Shipping address</h1> + <label for="street">Street Address</label><input id="street"> + </div>)"); + + autofill_assistant_agent_->GetSemanticNodes( + /* role= */ 47 /* ADDRESS_LINE1 */, + /* objective= */ 7 /* FILL_DELIVERY_ADDRESS */, + /* ignore_objective= */ false, + /* model_timeout= */ base::Milliseconds(1000), callback.Get()); + + base::RunLoop().RunUntilIdle(); + + // Simulate a destroyed driver: + autofill_assistant_driver_.receivers_.Clear(); + + base::RunLoop().RunUntilIdle(); + + autofill_assistant_agent_->GetSemanticNodes( + /* role= */ 47 /* ADDRESS_LINE1 */, + /* objective= */ 7 /* FILL_DELIVERY_ADDRESS */, + /* ignore_objective= */ false, + /* model_timeout= */ base::Milliseconds(1000), callback.Get()); + + base::RunLoop().RunUntilIdle(); +} + TEST_F(AutofillAssistantAgentBrowserTest, GetSemanticNodesModelTimeout) { // Do not reply to the model call. EXPECT_CALL(autofill_assistant_driver_, GetAnnotateDomModel)
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc index f667c52c..d586cd0 100644 --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc
@@ -90,6 +90,10 @@ int64_t file_size_bytes; if (bookmark_file_exists && base::GetFileSize(path, &file_size_bytes)) { metrics::RecordFileSizeAtStartup(file_size_bytes); + metrics::RecordAverageNodeSizeAtStartup( + stats.total_url_bookmark_count == 0 + ? 0 + : file_size_bytes / stats.total_url_bookmark_count); } }
diff --git a/components/bookmarks/common/bookmark_metrics.cc b/components/bookmarks/common/bookmark_metrics.cc index 41a44351..15c956f 100644 --- a/components/bookmarks/common/bookmark_metrics.cc +++ b/components/bookmarks/common/bookmark_metrics.cc
@@ -107,4 +107,8 @@ base::UmaHistogramCounts100("Bookmarks.Clone.NumCloned", num_cloned); } +void RecordAverageNodeSizeAtStartup(size_t size_in_bytes) { + base::UmaHistogramCounts10000("Bookmarks.AverageNodeSize", size_in_bytes); +} + } // namespace bookmarks::metrics
diff --git a/components/bookmarks/common/bookmark_metrics.h b/components/bookmarks/common/bookmark_metrics.h index 24d60ba4..492dc6a 100644 --- a/components/bookmarks/common/bookmark_metrics.h +++ b/components/bookmarks/common/bookmark_metrics.h
@@ -57,6 +57,9 @@ // bookmarks that were selected. void RecordCloneBookmarkNode(int num_cloned); +// Records the approximate average node size at startup. +void RecordAverageNodeSizeAtStartup(size_t size_in_bytes); + } // namespace metrics } // namespace bookmarks
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index 20201fa2..7cf71a7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">ጣቢያዎች የእንቅስቃሴ ዳሳሾችን እንዲደርሱባቸው ይፍቀዱ (የሚመከር)</translation> <translation id="5050380848339752099">ይህ ጣቢያ ማንነት ከማያሳውቅ ሁነታ ውጭ ላለ መተግበሪያ መረጃ ሊያጋራ ነው።</translation> <translation id="5063480226653192405">አጠቃቀም</translation> +<translation id="5091013926750941408">የተንቀሳቃሽ ስልክ ጣቢያ</translation> <translation id="509133520954049755">የዴስክቶፕ እይታን ይጠይቁ</translation> <translation id="5100237604440890931">ተሰብስቧል - ለመዘርጋት ጠቅ ያድርጉ</translation> <translation id="5123685120097942451">ማንነት የማያሳውቅ ትር</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 59ad033..c218e4c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">السماح للمواقع الإلكترونية بالوصول إلى مستشعرات الحركة (مُقترَح)</translation> <translation id="5050380848339752099">هذا الموقع الإلكتروني على وشك مشاركة معلومات مع أحد التطبيقات خارج وضع التصفُّح المتخفي.</translation> <translation id="5063480226653192405">الاستخدام</translation> +<translation id="5091013926750941408">موقع إلكتروني متوافق مع الأجهزة الجوّالة</translation> <translation id="509133520954049755">طلب العرض المخصَّص للكمبيوتر المكتبي</translation> <translation id="5100237604440890931">تم التصغير - انقر للتوسيع.</translation> <translation id="5123685120097942451">علامة تبويب "التصفُّح المتخفي"</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index 7e4ca0e..4a0e203 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">ম'শ্বন ছেন্সৰসমূহলৈ এক্সেছ পাবলৈ ছাইটসমূহক অনুমতি দিয়ক (চুপাৰিছ কৰা)</translation> <translation id="5050380848339752099">এই ছাইটটোৱে ইনক’গনিট’ ম’ডৰ বাহিৰৰ এটা এপৰ সৈতে তথ্য শ্বেয়াৰ কৰিবলৈ লৈছে।</translation> <translation id="5063480226653192405">ব্যৱহাৰ</translation> +<translation id="5091013926750941408">ম’বাইল ছাইট</translation> <translation id="509133520954049755">ডেস্কটপ ভিউৰ অনুৰোধ জনাওক</translation> <translation id="5100237604440890931">সংকুচিত - সম্প্ৰসাৰণ কৰিবলৈ টিপক</translation> <translation id="5123685120097942451">ইনক’গনিট’ টেব</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb index 383c1639..a387cf7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Разрешаване на достъпа на сайтовете до сензорите за движение (препоръчително)</translation> <translation id="5050380848339752099">Този сайт е напът да сподели информация с приложение, което не е в режим „инкогнито“.</translation> <translation id="5063480226653192405">Употреба</translation> +<translation id="5091013926750941408">Мобилен сайт</translation> <translation id="509133520954049755">Заявяване на изглед за настолни компютри</translation> <translation id="5100237604440890931">Свито – кликнете за разгъване.</translation> <translation id="5123685120097942451">Раздел в режим „инкогнито“</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb index 919a7e5..f5665f9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Caniatáu i wefannau gael mynediad at synwyryddion symudiad (argymhellir)</translation> <translation id="5050380848339752099">Mae'r wefan hon ar fin rhannu gwybodaeth ag ap y tu allan i'r modd Anhysbys.</translation> <translation id="5063480226653192405">Defnydd</translation> +<translation id="5091013926750941408">Gwefan symudol</translation> <translation id="509133520954049755">Gofyn am wedd bwrdd gwaith</translation> <translation id="5100237604440890931">Wedi'i grebachu - cliciwch i'w ehangu.</translation> <translation id="5123685120097942451">Tab anhysbys</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index d71d7d7..1f2d746 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Tillad, at websites kan få adgang til bevægelsessensorer (anbefales)</translation> <translation id="5050380848339752099">Dette website skal til at dele oplysninger med en app uden for inkognitotilstand.</translation> <translation id="5063480226653192405">Databrug</translation> +<translation id="5091013926750941408">Mobilwebsite</translation> <translation id="509133520954049755">Anmod om computervenlig visning</translation> <translation id="5100237604440890931">Skjult – klik for at udvide.</translation> <translation id="5123685120097942451">Inkognitofane</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index d142099..5cc7aa1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -115,6 +115,7 @@ <translation id="3333961966071413176">All contacts</translation> <translation id="3362437373201486687">Scanning for Bluetooth devices</translation> <translation id="3386292677130313581">Ask before allowing sites to know your location (recommended)</translation> +<translation id="3521663503435878242">Sites under <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Block sites from creating a 3D map of your surroundings or tracking camera position</translation> <translation id="3551268116566418498">Leave Incognito mode?</translation> <translation id="3586500876634962664">Camera and microphone use</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index ff2e6a9..a1b8343 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Permitir que los sitios accedan a los sensores de movimiento (recomendado)</translation> <translation id="5050380848339752099">Este sitio va a compartir información con una aplicación fuera del modo Incógnito.</translation> <translation id="5063480226653192405">Uso</translation> +<translation id="5091013926750941408">Sitio web móvil</translation> <translation id="509133520954049755">Solicita la vista para ordenador</translation> <translation id="5100237604440890931">Contraído (hacer clic para ampliar)</translation> <translation id="5123685120097942451">Pestaña de Incógnito</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index d7ffb2cc6..0ddc556f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Luba saitide jaoks juurdepääs liikumisanduritele (soovitatav)</translation> <translation id="5050380848339752099">See sait jagab teavet väljaspool inkognito režiimi oleva rakendusega.</translation> <translation id="5063480226653192405">Kasutus</translation> +<translation id="5091013926750941408">Mobiilisait</translation> <translation id="509133520954049755">Taotle arvutivaadet</translation> <translation id="5100237604440890931">Ahendatud – laiendamiseks klõpsake.</translation> <translation id="5123685120097942451">Inkognito vaheleht</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index 12bc27a..746c679f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">مجاز بودن دسترسی سایتها به حسگرهای حرکتی (توصیه میشود)</translation> <translation id="5050380848339752099">این سایت میخواهد خارج از «حالت ناشناس»، اطلاعاتی را با برنامهای همرسانی کند.</translation> <translation id="5063480226653192405">کاربر </translation> +<translation id="5091013926750941408">سایت ویژه تلفن همراه</translation> <translation id="509133520954049755">درخواست نمای رایانه</translation> <translation id="5100237604440890931">کوچک شده - برای بزرگ کردن کلیک کنید.</translation> <translation id="5123685120097942451">برگه ناشناس</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index 5c5c81f..93805f2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">સાઇટને મોશન સેન્સરના ઍક્સેસની મંજૂરી આપો (સુઝાવ આપીએ છીએ)</translation> <translation id="5050380848339752099">આ સાઇટ છૂપા મોડની બહારની એક ઍપ સાથે માહિતી શેર કરવા જઈ રહી છે.</translation> <translation id="5063480226653192405">ઉપયોગ</translation> +<translation id="5091013926750941408">મોબાઇલ સાઇટ</translation> <translation id="509133520954049755">ડેસ્કટૉપ વ્યૂની વિનંતી કરો</translation> <translation id="5100237604440890931">સંકુચિત - વિસ્તૃત કરવા માટે ક્લિક કરો.</translation> <translation id="5123685120097942451">છૂપા મોડમાંની ટૅબ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index 03e9c48d..d772dbe 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">साइटों को मोशन सेंसर ऐक्सेस करने दें (सुझाया गया)</translation> <translation id="5050380848339752099">यह साइट गुप्त मोड से बाहर के किसी ऐप्लिकेशन के साथ जानकारी शेयर करने वाली है.</translation> <translation id="5063480226653192405">उपयोग</translation> +<translation id="5091013926750941408">मोबाइल साइट</translation> <translation id="509133520954049755">डेस्कटॉप व्यू के लिए अनुरोध करें</translation> <translation id="5100237604440890931">छोटा किया गया - पूरा खोलने के लिए क्लिक करें.</translation> <translation id="5123685120097942451">गुप्त टैब</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index bdc1607..84636ee5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">A mozgásérzékelőkhöz való hozzáférés engedélyezése a webhelyek számára (ajánlott)</translation> <translation id="5050380848339752099">A webhely adatokat kíván megosztani az inkognitó módon kívüli alkalmazással.</translation> <translation id="5063480226653192405">Használat</translation> +<translation id="5091013926750941408">Mobilwebhely</translation> <translation id="509133520954049755">Asztali nézet kérelmezése</translation> <translation id="5100237604440890931">Összecsukva – kattintson a kibontáshoz.</translation> <translation id="5123685120097942451">Inkognitó lap</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index 4b37a43..92286e9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Consenti ai siti di accedere ai sensori di movimento (opzione consigliata)</translation> <translation id="5050380848339752099">Questo sito sta per condividere informazioni con un'app esterna alla modalità di navigazione in incognito.</translation> <translation id="5063480226653192405">Utilizzo</translation> +<translation id="5091013926750941408">Sito mobile</translation> <translation id="509133520954049755">Richiedi visualizzazione desktop</translation> <translation id="5100237604440890931">Compresso. Fai clic per espandere.</translation> <translation id="5123685120097942451">Scheda di navigazione in incognito</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index cb36e4f2..a5e22b2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">התרת גישה של אתרים אל חיישני התנועה (מומלץ)</translation> <translation id="5050380848339752099">אתר זה עומד לשתף מידע עם אפליקציה מחוץ למצב האנונימי.</translation> <translation id="5063480226653192405">שימוש</translation> +<translation id="5091013926750941408">אתר לנייד</translation> <translation id="509133520954049755">שליחת בקשה לתצוגה למחשב</translation> <translation id="5100237604440890931">מכווץ – יש ללחוץ כדי להרחיב.</translation> <translation id="5123685120097942451">כרטיסייה אנונימית</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index fa8b1c81..abcb7177 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">사이트의 움직임 감지 센서 액세스 허용(권장)</translation> <translation id="5050380848339752099">이 사이트에서 시크릿 모드 외부의 앱을 사용하여 정보를 공유하려고 합니다.</translation> <translation id="5063480226653192405">사용</translation> +<translation id="5091013926750941408">모바일 사이트</translation> <translation id="509133520954049755">데스크톱 뷰 요청</translation> <translation id="5100237604440890931">접힘 - 펼치려면 클릭</translation> <translation id="5123685120097942451">시크릿 탭</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index 43d61cd0..16d39dc 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Leidžiama svetainėms pasiekti judesio jutiklius (rekomenduojama)</translation> <translation id="5050380848339752099">Šioje svetainėje ketinama bendrinti informaciją su programa ne inkognito režimu.</translation> <translation id="5063480226653192405">Naudojimas</translation> +<translation id="5091013926750941408">Svetainė mobiliesiems</translation> <translation id="509133520954049755">Pateikti užklausą dėl rodinio versijos staliniams kompiuteriams</translation> <translation id="5100237604440890931">Sutraukta – spustelėkite, kad išskleistumėte</translation> <translation id="5123685120097942451">Inkognito skirtukas</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index 576a5683..495570c9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Сайтад хөдөлгөөн мэдрэгчид хандахыг зөвшөөрөх (санал болгосон)</translation> <translation id="5050380848339752099">Энэ сайт Нууцлалтай горимоос гадуур апптай мэдээлэл хуваалцах гэж байна.</translation> <translation id="5063480226653192405">Ашиглалт</translation> +<translation id="5091013926750941408">Мобайл сайт</translation> <translation id="509133520954049755">Дэлгэц дээр харагдах байдлаар харах хүсэлт тавих</translation> <translation id="5100237604440890931">Задарсан, энд дарж өргөтгөнө үү.</translation> <translation id="5123685120097942451">Нууцлалтай таб</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index 1ffe7fd..c9d9956 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Zezwalaj stronom na dostęp do czujników ruchu (zalecane)</translation> <translation id="5050380848339752099">Ta strona zamierza udostępnić informacje aplikacji poza trybem incognito.</translation> <translation id="5063480226653192405">Wykorzystanie</translation> +<translation id="5091013926750941408">Strona mobilna</translation> <translation id="509133520954049755">Żądaj wersji na komputery</translation> <translation id="5100237604440890931">Zwinięty – kliknij, by rozwinąć.</translation> <translation id="5123685120097942451">Karta incognito</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb index 10ee98db9..2952926 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Spletnim mestom dovoli dostop do tipal gibanja (priporočeno)</translation> <translation id="5050380848339752099">To spletno mesto bo delilo podatke z aplikacijo zunaj anonimnega načina.</translation> <translation id="5063480226653192405">Uporaba</translation> +<translation id="5091013926750941408">Spletno mesto za mobilne naprave</translation> <translation id="509133520954049755">Zahtevaj pogled za namizni računalnik</translation> <translation id="5100237604440890931">Strnjeno – kliknite, če želite razširiti.</translation> <translation id="5123685120097942451">Anonimni zavihek</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index bc4ad69..075c0a8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -115,6 +115,7 @@ <translation id="3333961966071413176">รายชื่อติดต่อทั้งหมด</translation> <translation id="3362437373201486687">กำลังสแกนหาอุปกรณ์บลูทูธ</translation> <translation id="3386292677130313581">ถามก่อนอนุญาตให้เว็บไซต์ทราบตำแหน่งของคุณ (แนะนำ)</translation> +<translation id="3521663503435878242">เว็บไซต์ภายใต้ <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">บล็อกไม่ให้เว็บไซต์สร้างแผนที่ 3 มิติของสิ่งที่อยู่รอบตัวคุณหรือติดตามตำแหน่งของกล้อง</translation> <translation id="3551268116566418498">ออกจากโหมดไม่ระบุตัวตนไหม</translation> <translation id="3586500876634962664">การใช้กล้องและไมโครโฟน</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index b768244..760b29da 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Sitelerin hareket sensörlerine erişmesine izin ver (önerilen)</translation> <translation id="5050380848339752099">Bu site, Gizli mod dışında bir uygulama ile bilgi paylaşımında bulunmak üzere.</translation> <translation id="5063480226653192405">Kullanım</translation> +<translation id="5091013926750941408">Mobil site</translation> <translation id="509133520954049755">Masaüstü görünümü iste</translation> <translation id="5100237604440890931">Daraltıldı - Genişletmek için tıklayın.</translation> <translation id="5123685120097942451">Gizli sekme</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 028b273..9e09459e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">Надати сайтам доступ до датчиків руху (рекомендовано)</translation> <translation id="5050380848339752099">Цей сайт збирається надіслати інформацію зовнішньому додатку, поки ви в режимі анонімного перегляду.</translation> <translation id="5063480226653192405">Використання</translation> +<translation id="5091013926750941408">Мобільний сайт</translation> <translation id="509133520954049755">Запит на версію для ПК</translation> <translation id="5100237604440890931">Згорнуто – натисніть, щоб розгорнути.</translation> <translation id="5123685120097942451">Анонімна вкладка</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 36e4cca..f843ba4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -115,6 +115,7 @@ <translation id="3333961966071413176">Barcha kontaktlar</translation> <translation id="3362437373201486687">Bluetooth qurilmalar qidirilmoqda</translation> <translation id="3386292677130313581">Joylashuv ma’lumotini ko‘rishiga ruxsat so‘ralsin (tavsiya etiladi)</translation> +<translation id="3521663503435878242"><ph name="DOMAIN" /> domenidagi saytlar</translation> <translation id="3538390592868664640">Saytlarni atrofingizning 3D xaritasini yaratish yoki kamera joylashuvini aniqlashdan bloklash</translation> <translation id="3551268116566418498">Inkognito rejimi tark etilsinmi?</translation> <translation id="3586500876634962664">Kamera va mikrofonni ishlatish</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index ab56cbfc..a3c49cf7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -182,6 +182,7 @@ <translation id="5048398596102334565">允許網站存取動作感應器 (建議)</translation> <translation id="5050380848339752099">此網站即將退出無痕模式並與外部應用程式分享資料。</translation> <translation id="5063480226653192405">用量</translation> +<translation id="5091013926750941408">流動網站</translation> <translation id="509133520954049755">要求桌面電腦檢視模式</translation> <translation id="5100237604440890931">已收合 - 點擊即可展開。</translation> <translation id="5123685120097942451">無痕式分頁</translation>
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 57310aca..7610923 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "12.4", - "log_list_timestamp": "2022-09-18T12:55:01Z", + "version": "12.5", + "log_list_timestamp": "2022-09-19T12:54:38Z", "operators": [ { "name": "Google",
diff --git a/components/content_creation/notes/core/templates/template_store.cc b/components/content_creation/notes/core/templates/template_store.cc index e2bc27b..9a4ebb7 100644 --- a/components/content_creation/notes/core/templates/template_store.cc +++ b/components/content_creation/notes/core/templates/template_store.cc
@@ -69,7 +69,8 @@ void TemplateStore::FetchTemplates(GetTemplatesCallback callback) { fetcher_->Start(base::BindOnce(&TemplateStore::OnFetchTemplateComplete, - base::Unretained(this), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), + std::move(callback))); } void TemplateStore::GetTemplates(GetTemplatesCallback callback) { @@ -88,8 +89,7 @@ } else { base::PostTaskAndReplyWithResult( task_runner_.get(), FROM_HERE, - base::BindOnce(&TemplateStore::BuildDefaultTemplates, - base::Unretained(this)), + base::BindOnce(&TemplateStore::BuildDefaultTemplates), base::BindOnce(&TemplateStore::OnTemplatesReceived, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -101,6 +101,7 @@ ParseTemplatesFromString(response_body)); } +// static std::vector<NoteTemplate> TemplateStore::BuildDefaultTemplates() { std::vector<NoteTemplate> templates = { GetClassicTemplate(), GetFriendlyTemplate(), GetFreshTemplate(),
diff --git a/components/content_creation/notes/core/templates/template_store.h b/components/content_creation/notes/core/templates/template_store.h index 92fa987..a0ba5a55 100644 --- a/components/content_creation/notes/core/templates/template_store.h +++ b/components/content_creation/notes/core/templates/template_store.h
@@ -71,7 +71,7 @@ // Function which generates the ordered list of default templates to be // offered to the user. - std::vector<NoteTemplate> BuildDefaultTemplates(); + static std::vector<NoteTemplate> BuildDefaultTemplates(); // Function which generates the ordered list of pulled templates to be // offered to the user.
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc index 7b530ff..7291fcc9 100644 --- a/components/guest_view/browser/guest_view_base.cc +++ b/components/guest_view/browser/guest_view_base.cc
@@ -36,20 +36,24 @@ base::LazyInstance<WebContentsGuestViewMap>::Leaky g_webcontents_guestview_map = LAZY_INSTANCE_INITIALIZER; +void DestroyGuestIfUnattached(GuestViewBase* guest) { + std::unique_ptr<GuestViewBase> owned_guest = + guest->GetGuestViewManager()->TransferOwnership(guest); + owned_guest.reset(); +} + } // namespace SetSizeParams::SetSizeParams() = default; SetSizeParams::~SetSizeParams() = default; -// TODO(832879): It would be better to have proper ownership semantics than -// manually destroying guests and their WebContents. -// -// This observer ensures that the GuestViewBase destroys itself when its -// embedder goes away. It also tracks when the embedder's fullscreen is -// toggled so the guest can change itself accordingly. +// This observer ensures that unattached guests don't outlive their owner +// WebContents. It also tracks when the embedder's fullscreen is toggled so the +// guest can change itself accordingly. class GuestViewBase::OwnerContentsObserver : public WebContentsObserver { public: - OwnerContentsObserver(GuestViewBase* guest, WebContents* owner_web_contents) + explicit OwnerContentsObserver(base::SafeRef<GuestViewBase> guest, + WebContents* owner_web_contents) : WebContentsObserver(owner_web_contents), guest_(guest) {} OwnerContentsObserver(const OwnerContentsObserver&) = delete; @@ -58,37 +62,16 @@ ~OwnerContentsObserver() override = default; // WebContentsObserver implementation. - void WebContentsDestroyed() override { - // If the embedder is destroyed then destroy the guest. - Destroy(); - } - - void PrimaryPageChanged(content::Page& page) override { - // TODO(1206312, 1205920): It is incorrect to assume that a navigation will - // destroy the embedder. - // If the embedder navigates to a different page then destroy the guest. - Destroy(); - } - - void PrimaryMainFrameRenderProcessGone( - base::TerminationStatus status) override { - if (destroyed_) - return; - // If the embedder process is destroyed, then destroy the guest. - Destroy(); - } + void WebContentsDestroyed() override { DestroyGuestIfUnattached(&*guest_); } void DidToggleFullscreenModeForTab(bool entered_fullscreen, bool will_cause_resize) override { - if (destroyed_) - return; - is_fullscreen_ = entered_fullscreen; guest_->EmbedderFullscreenToggled(is_fullscreen_); } void PrimaryMainFrameWasResized(bool width_changed) override { - if (destroyed_ || !web_contents()->GetDelegate()) + if (!web_contents()->GetDelegate()) return; bool current_fullscreen = @@ -101,36 +84,18 @@ } void DidUpdateAudioMutingState(bool muted) override { - if (destroyed_) - return; - guest_->web_contents()->SetAudioMuted(muted); } - void RenderFrameDeleted(content::RenderFrameHost* rfh) override { - guest_->OnRenderFrameHostDeleted(rfh->GetProcess()->GetID(), - rfh->GetRoutingID()); - } - private: bool is_fullscreen_ = false; - bool destroyed_ = false; - raw_ptr<GuestViewBase> guest_; - - void Destroy() { - if (destroyed_) - return; - destroyed_ = true; - - // The outer WebContents have ownership of attached OOPIF-based guests, so - // we are not responsible for their deletion. - bool also_delete = !guest_->web_contents()->GetOuterWebContents(); - guest_->Destroy(also_delete); - } + const base::SafeRef<GuestViewBase> guest_; }; -// This observer ensures that the GuestViewBase destroys itself if its opener +// This observer ensures that a GuestViewBase is destroyed if if its opener // WebContents goes away before the GuestViewBase is attached. +// TODO(mcnee): This behaviour is WebViewGuest specific and could be moved there +// instead. class GuestViewBase::OpenerLifetimeObserver : public WebContentsObserver { public: explicit OpenerLifetimeObserver(GuestViewBase* guest) @@ -144,11 +109,10 @@ // WebContentsObserver implementation. void WebContentsDestroyed() override { - if (guest_->attached()) - return; - - // If the opener is destroyed then destroy the guest. - guest_->Destroy(true); + // If the opener is destroyed and the guest has not been attached, then + // destroy the guest. + // Destroys `this`. + DestroyGuestIfUnattached(guest_); } private: @@ -163,22 +127,34 @@ } GuestViewBase::~GuestViewBase() { + DCHECK(!is_being_destroyed_); + is_being_destroyed_ = true; + + // It is important to clear owner_web_contents_ after the call to + // StopTrackingEmbedderZoomLevel(), but before the rest of + // the statements in this function. + StopTrackingEmbedderZoomLevel(); + owner_web_contents_ = nullptr; + // This is not necessarily redundant with the removal when the guest contents // is destroyed, since we may never have initialized a guest WebContents. GetGuestViewManager()->RemoveGuest(guest_instance_id_); + + pending_events_.clear(); } -void GuestViewBase::Init(const base::Value::Dict& create_params, - WebContentsCreatedCallback callback) { +void GuestViewBase::Init(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, + GuestCreatedCallback callback) { if (!GetGuestViewManager()->IsGuestAvailableToContext(this)) { // The derived class did not create a WebContents so this class serves no // purpose. Let's self-destruct. - delete this; + owned_this.reset(); std::move(callback).Run(nullptr); return; } - CreateWebContents(create_params, + CreateWebContents(std::move(owned_this), create_params, base::BindOnce(&GuestViewBase::CompleteInit, weak_ptr_factory_.GetWeakPtr(), create_params.Clone(), std::move(callback))); @@ -200,10 +176,9 @@ zoom::ZoomController::CreateForWebContents(guest_web_contents); // At this point, we have just created the guest WebContents, we need to add - // an observer to the owner WebContents. This observer will be responsible - // for destroying the guest WebContents if the owner goes away. - owner_contents_observer_ = - std::make_unique<OwnerContentsObserver>(this, owner_web_contents_); + // an observer to the owner WebContents. + owner_contents_observer_ = std::make_unique<OwnerContentsObserver>( + weak_ptr_factory_.GetSafeRef(), owner_web_contents_); WebContentsObserver::Observe(guest_web_contents); guest_web_contents->SetDelegate(this); @@ -381,8 +356,6 @@ GetViewType(), owner_web_contents(), create_params); } -void GuestViewBase::OnRenderFrameHostDeleted(int process_id, int routing_id) {} - void GuestViewBase::DidAttach() { DCHECK(attach_in_progress_); // Clear this flag here, as functions called below may check attached(). @@ -412,36 +385,6 @@ ->GetSiteURL(); } -void GuestViewBase::Destroy(bool also_delete) { - if (is_being_destroyed_) - return; - - is_being_destroyed_ = true; - - // It is important to clear owner_web_contents_ after the call to - // StopTrackingEmbedderZoomLevel(), but before the rest of - // the statements in this function. - StopTrackingEmbedderZoomLevel(); - owner_web_contents_ = nullptr; - - DCHECK(web_contents()); - - // Give the derived class an opportunity to perform some cleanup. - WillDestroy(); - - // Invalidate weak pointers now so that bound callbacks cannot be called late - // into destruction. We must call this after WillDestroy because derived types - // may wish to access their openers. - weak_ptr_factory_.InvalidateWeakPtrs(); - - g_webcontents_guestview_map.Get().erase(web_contents()); - GetGuestViewManager()->RemoveGuest(guest_instance_id_); - pending_events_.clear(); - - if (also_delete) - delete web_contents(); -} - void GuestViewBase::SetAttachParams(const base::Value::Dict& params) { attach_params_ = params.Clone(); view_instance_id_ = @@ -457,6 +400,7 @@ } void GuestViewBase::WillAttach( + std::unique_ptr<GuestViewBase> owned_this, WebContents* embedder_web_contents, content::RenderFrameHost* outer_contents_frame, int element_instance_id, @@ -471,8 +415,8 @@ if (owner_web_contents_ != embedder_web_contents) { DCHECK_EQ(owner_contents_observer_->web_contents(), owner_web_contents_); owner_web_contents_ = embedder_web_contents; - owner_contents_observer_ = - std::make_unique<OwnerContentsObserver>(this, embedder_web_contents); + owner_contents_observer_ = std::make_unique<OwnerContentsObserver>( + weak_ptr_factory_.GetSafeRef(), embedder_web_contents); SetOwnerHost(); } @@ -486,15 +430,24 @@ web_contents()->ResumeLoadingCreatedWebContents(); + // From this point on, `this` is scoped to the guest contents' lifetime. We + // self-destruct in WebContentsDestroyed. + owned_this.release(); + self_owned_ = true; + std::unique_ptr<WebContents> owned_guest_contents = + std::move(owned_guest_contents_); + DCHECK_EQ(owned_guest_contents.get(), web_contents()); + // Since this inner WebContents is created from the browser side we do // not have RemoteFrame mojo channels so we pass in // NullAssociatedRemote/Receivers. New channels will be bound when the // `CreateView` IPC is sent. owner_web_contents_->AttachInnerWebContents( - base::WrapUnique<WebContents>(web_contents()), outer_contents_frame, + std::move(owned_guest_contents), outer_contents_frame, /*remote_frame=*/mojo::NullAssociatedRemote(), /*remote_frame_host_receiver=*/mojo::NullAssociatedReceiver(), is_full_page_plugin); + // We don't ACK until after AttachToOuterWebContentsFrame, so that // |outer_contents_frame| gets swapped before the AttachToEmbedderFrame // callback is run. We also need to send the ACK before queued events are sent @@ -539,17 +492,14 @@ } void GuestViewBase::WebContentsDestroyed() { - Destroy(false); - - // Let the derived class know that its WebContents is in the process of - // being destroyed. web_contents() is still valid at this point. - // TODO(fsamuel): This allows for reentrant code into WebContents during - // destruction. This could potentially lead to bugs. Perhaps we should get rid - // of this? - GuestDestroyed(); + g_webcontents_guestview_map.Get().erase(web_contents()); + GetGuestViewManager()->RemoveGuest(guest_instance_id_); // Self-destruct. - delete this; + if (self_owned_) { + DCHECK(!is_being_destroyed_); + delete this; + } } void GuestViewBase::DidFinishNavigation( @@ -699,6 +649,7 @@ } void GuestViewBase::AttachToOuterWebContentsFrame( + std::unique_ptr<GuestViewBase> owned_this, content::RenderFrameHost* embedder_frame, int32_t element_instance_id, bool is_full_page_plugin, @@ -706,7 +657,8 @@ attachment_callback) { auto completion_callback = base::BindOnce(&GuestViewBase::DidAttach, weak_ptr_factory_.GetWeakPtr()); - WillAttach(WebContents::FromRenderFrameHost(embedder_frame), embedder_frame, + WillAttach(std::move(owned_this), + WebContents::FromRenderFrameHost(embedder_frame), embedder_frame, element_instance_id, is_full_page_plugin, std::move(completion_callback), std::move(attachment_callback)); } @@ -757,18 +709,31 @@ } } -void GuestViewBase::CompleteInit(base::Value::Dict create_params, - WebContentsCreatedCallback callback, - WebContents* guest_web_contents) { +void GuestViewBase::CompleteInit( + base::Value::Dict create_params, + GuestCreatedCallback callback, + std::unique_ptr<GuestViewBase> owned_this, + std::unique_ptr<content::WebContents> guest_web_contents) { if (!guest_web_contents) { // The derived class did not create a WebContents so this class serves no // purpose. Let's self-destruct. - delete this; + owned_this.reset(); std::move(callback).Run(nullptr); return; } - InitWithWebContents(create_params, guest_web_contents); - std::move(callback).Run(guest_web_contents); + InitWithWebContents(create_params, guest_web_contents.get()); + TakeGuestContentsOwnership(std::move(guest_web_contents)); + std::move(callback).Run(std::move(owned_this)); +} + +void GuestViewBase::TakeGuestContentsOwnership( + std::unique_ptr<WebContents> guest_web_contents) { + DCHECK(!owned_guest_contents_); + owned_guest_contents_ = std::move(guest_web_contents); +} + +void GuestViewBase::ClearOwnedGuestContents() { + owned_guest_contents_.reset(); } double GuestViewBase::GetEmbedderZoomFactor() const {
diff --git a/components/guest_view/browser/guest_view_base.h b/components/guest_view/browser/guest_view_base.h index edf41edf..af4e605 100644 --- a/components/guest_view/browser/guest_view_base.h +++ b/components/guest_view/browser/guest_view_base.h
@@ -65,9 +65,14 @@ static GuestViewBase* FromRenderFrameHostId( const content::GlobalRenderFrameHostId& rfh_id); + ~GuestViewBase() override; GuestViewBase(const GuestViewBase&) = delete; GuestViewBase& operator=(const GuestViewBase&) = delete; + using WebContentsCreatedCallback = base::OnceCallback<void( + std::unique_ptr<GuestViewBase> guest, + std::unique_ptr<content::WebContents> guest_contents)>; + // Given a |web_contents|, returns the top level owner WebContents. If // |web_contents| does not belong to a GuestView, it will be returned // unchanged. @@ -114,10 +119,11 @@ // This creates a WebContents and initializes |this| GuestViewBase to use the // newly created WebContents. - using WebContentsCreatedCallback = - base::OnceCallback<void(content::WebContents*)>; - void Init(const base::Value::Dict& create_params, - WebContentsCreatedCallback callback); + using GuestCreatedCallback = + base::OnceCallback<void(std::unique_ptr<GuestViewBase> guest)>; + void Init(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, + GuestCreatedCallback callback); void InitWithWebContents(const base::Value::Dict& create_params, content::WebContents* guest_web_contents); @@ -178,9 +184,6 @@ // Whether the guest view is inside a plugin document. bool is_full_page_plugin() const { return is_full_page_plugin_; } - // Destroy this guest. - void Destroy(bool also_delete); - // Saves the attach state of the custom element hosting this GuestView. void SetAttachParams(const base::Value::Dict& params); @@ -195,6 +198,7 @@ // HTMLFrameOwnerElement associated with the GuestView's element in the // embedder process) which will be used for attaching. void AttachToOuterWebContentsFrame( + std::unique_ptr<GuestViewBase> owned_this, content::RenderFrameHost* embedder_frame, int32_t element_instance_id, bool is_full_page_plugin, @@ -210,17 +214,13 @@ protected: explicit GuestViewBase(content::WebContents* owner_web_contents); - ~GuestViewBase() override; - GuestViewBase* GetOpener() const { return opener_.get(); } void SetOpener(GuestViewBase* opener); - // TODO(ekaramad): If a guest is based on BrowserPlugin and is embedded inside - // a cross-process frame, we need to notify the destruction of the frame so - // that the clean-up on the browser side is done appropriately. Remove this - // method when BrowserPlugin is removed (https://crbug.com/535197). - virtual void OnRenderFrameHostDeleted(int process_id, int routing_id); + void TakeGuestContentsOwnership( + std::unique_ptr<content::WebContents> guest_web_contents); + void ClearOwnedGuestContents(); // WebContentsDelegate implementation. bool HandleKeyboardEvent( @@ -234,11 +234,13 @@ // WebContentsObserver implementation. void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; + void WebContentsDestroyed() override; // Given a set of initialization parameters, a concrete subclass of // GuestViewBase can create a specialized WebContents that it returns back to // GuestViewBase. - virtual void CreateWebContents(const base::Value::Dict& create_params, + virtual void CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) = 0; // This method is called after the guest has been attached to an embedder and @@ -264,12 +266,6 @@ // completed loading. virtual void GuestViewDidStopLoading() {} - // This method is called when the guest WebContents has been destroyed. This - // object will be destroyed after this call returns. - // - // This gives the derived class an opportunity to perform some cleanup. - virtual void GuestDestroyed() {} - // This method is invoked when the guest RenderView is ready, e.g. because we // recreated it after a crash or after reattachment. // @@ -304,12 +300,6 @@ // an opportunity to perform setup actions before attachment. virtual void WillAttachToEmbedder() {} - // This method is called when the guest WebContents is about to be destroyed. - // - // This gives the derived class an opportunity to perform some cleanup prior - // to destruction. - virtual void WillDestroy() {} - // Convert sizes in pixels from logical to physical numbers of pixels. // Note that a size can consist of a fractional number of logical pixels // (hence |logical_pixels| is represented as a double), but will always @@ -360,7 +350,6 @@ // WebContentsObserver implementation. void DidStopLoading() final; void RenderViewReady() final; - void WebContentsDestroyed() final; // ui_zoom::ZoomObserver implementation. void OnZoomChanged( @@ -369,8 +358,9 @@ void SendQueuedEvents(); void CompleteInit(base::Value::Dict create_params, - WebContentsCreatedCallback callback, - content::WebContents* guest_web_contents); + GuestCreatedCallback callback, + std::unique_ptr<GuestViewBase> owned_this, + std::unique_ptr<content::WebContents> guest_web_contents); // Dispatches the onResize event to the embedder. void DispatchOnResizeEvent(const gfx::Size& old_size, @@ -394,7 +384,8 @@ // TODO(ekaramad): Revisit this once MimeHandlerViewGuest is frame-based // (https://crbug.com/659750); either remove or unify with // BrowserPluginGuestDelegate::WillAttach. - void WillAttach(content::WebContents* embedder_web_contents, + void WillAttach(std::unique_ptr<GuestViewBase> owned_this, + content::WebContents* embedder_web_contents, content::RenderFrameHost* outer_contents_frame, int browser_plugin_instance_id, bool is_full_page_plugin, @@ -456,6 +447,16 @@ // element may not match the size of the guest. gfx::Size guest_size_; + // When the guest is created, a guest WebContents is created and we take + // ownership of it here until it's ready to be attached. On attachment, + // ownership of the guest WebContents is taken by the embedding WebContents. + std::unique_ptr<content::WebContents> owned_guest_contents_; + + // Before attachment a GuestViewBase is owned with a unique_ptr. After + // attachment, a GuestViewBase is self-owned and scoped to the lifetime of the + // guest WebContents. + bool self_owned_ = false; + // Indicates whether autosize mode is enabled or not. bool auto_size_enabled_ = false;
diff --git a/components/guest_view/browser/guest_view_manager.cc b/components/guest_view/browser/guest_view_manager.cc index 4643c74..38f0f12 100644 --- a/components/guest_view/browser/guest_view_manager.cc +++ b/components/guest_view/browser/guest_view_manager.cc
@@ -157,13 +157,59 @@ void GuestViewManager::CreateGuest(const std::string& view_type, content::WebContents* owner_web_contents, const base::Value::Dict& create_params, - WebContentsCreatedCallback callback) { - GuestViewBase* guest = CreateGuestInternal(owner_web_contents, view_type); + UnownedGuestCreatedCallback callback) { + OwnedGuestCreatedCallback ownership_transferring_callback = base::BindOnce( + [](UnownedGuestCreatedCallback callback, + std::unique_ptr<GuestViewBase> guest) { + auto* raw_guest = guest.get(); + if (raw_guest) { + raw_guest->GetGuestViewManager()->ManageOwnership(std::move(guest)); + } + std::move(callback).Run(raw_guest); + }, + std::move(callback)); + CreateGuestAndTransferOwnership(view_type, owner_web_contents, create_params, + std::move(ownership_transferring_callback)); +} + +void GuestViewManager::CreateGuestAndTransferOwnership( + const std::string& view_type, + content::WebContents* owner_web_contents, + const base::Value::Dict& create_params, + OwnedGuestCreatedCallback callback) { + std::unique_ptr<GuestViewBase> guest = + CreateGuestInternal(owner_web_contents, view_type); if (!guest) { std::move(callback).Run(nullptr); return; } - guest->Init(create_params, std::move(callback)); + auto* raw_guest = guest.get(); + raw_guest->Init(std::move(guest), create_params, std::move(callback)); +} + +std::unique_ptr<GuestViewBase> GuestViewManager::TransferOwnership( + GuestViewBase* guest) { + for (auto it = owned_guests_.begin(); it != owned_guests_.end(); ++it) { + if (it->second.get() == guest) { + std::unique_ptr<GuestViewBase> owned_guest = std::move(it->second); + owned_guests_.erase(it); + return owned_guest; + } + } + + return nullptr; +} + +void GuestViewManager::ManageOwnership(std::unique_ptr<GuestViewBase> guest) { + // TODO(crbug.com/769461): Guest types for which it is incorrect to assume the + // embedder WebContents' main frame's process is the embedding process can't + // be stored this way until issue 769461 is addressed. + DCHECK(!guest->CanBeEmbeddedInsideCrossProcessFrames()); + RenderProcessHost* embedder_process = + guest->owner_web_contents()->GetPrimaryMainFrame()->GetProcess(); + DCHECK(embedder_process); + ObserveEmbedderLifetime(embedder_process); + owned_guests_.insert({embedder_process->GetID(), std::move(guest)}); } std::unique_ptr<content::WebContents> @@ -171,15 +217,18 @@ const std::string& view_type, content::WebContents* owner_web_contents, const content::WebContents::CreateParams& create_params) { - auto* guest = CreateGuestInternal(owner_web_contents, view_type); + std::unique_ptr<GuestViewBase> guest = + CreateGuestInternal(owner_web_contents, view_type); if (!guest) return nullptr; + content::WebContents::CreateParams guest_create_params(create_params); - guest_create_params.guest_delegate = guest; + guest_create_params.guest_delegate = guest.get(); std::unique_ptr<content::WebContents> guest_web_contents = WebContents::Create(guest_create_params); guest->InitWithWebContents(base::Value::Dict(), guest_web_contents.get()); + ManageOwnership(std::move(guest)); // Ownership of the guest WebContents goes to the content layer until we get // it back in AddNewContents. return guest_web_contents; @@ -275,6 +324,7 @@ void GuestViewManager::EmbedderProcessDestroyed(int embedder_process_id) { embedders_observed_.erase(embedder_process_id); + owned_guests_.erase(embedder_process_id); CallViewDestructionCallbacks(embedder_process_id); } @@ -340,7 +390,7 @@ CallViewDestructionCallbacks(embedder_process_id, kInstanceIDNone); } -GuestViewBase* GuestViewManager::CreateGuestInternal( +std::unique_ptr<GuestViewBase> GuestViewManager::CreateGuestInternal( content::WebContents* owner_web_contents, const std::string& view_type) { if (guest_view_registry_.empty()) @@ -379,25 +429,29 @@ int embedder_process_id, int view_instance_id, base::OnceClosure callback) { - // When an embedder is registered for the first time, create an observer to - // watch for its destruction. - if (!embedders_observed_.count(embedder_process_id)) { - RenderProcessHost* rph = RenderProcessHost::FromID(embedder_process_id); - // The RenderProcessHost may already be gone. - if (!rph) { - std::move(callback).Run(); - return; - } - - embedders_observed_.insert(embedder_process_id); - // EmbedderRenderProcessHostObserver owns itself. - new EmbedderRenderProcessHostObserver(weak_ptr_factory_.GetWeakPtr(), rph); + RenderProcessHost* rph = RenderProcessHost::FromID(embedder_process_id); + // The RenderProcessHost may already be gone. + if (!rph) { + std::move(callback).Run(); + return; } + ObserveEmbedderLifetime(rph); + view_destruction_callback_map_[embedder_process_id][view_instance_id] .push_back(std::move(callback)); } +void GuestViewManager::ObserveEmbedderLifetime( + RenderProcessHost* embedder_process) { + if (!embedders_observed_.count(embedder_process->GetID())) { + embedders_observed_.insert(embedder_process->GetID()); + // EmbedderRenderProcessHostObserver owns itself. + new EmbedderRenderProcessHostObserver(weak_ptr_factory_.GetWeakPtr(), + embedder_process); + } +} + bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { return delegate_->IsGuestAvailableToContext(guest); }
diff --git a/components/guest_view/browser/guest_view_manager.h b/components/guest_view/browser/guest_view_manager.h index e49c102..1b9d5d2 100644 --- a/components/guest_view/browser/guest_view_manager.h +++ b/components/guest_view/browser/guest_view_manager.h
@@ -75,8 +75,9 @@ int GetNextInstanceID(); - using GuestViewCreateFunction = base::RepeatingCallback<GuestViewBase*( - content::WebContents* owner_web_contents)>; + using GuestViewCreateFunction = + base::RepeatingCallback<std::unique_ptr<GuestViewBase>( + content::WebContents* owner_web_contents)>; using GuestViewCleanUpFunction = base::RepeatingCallback<void(content::BrowserContext*, int embedder_process_id, @@ -92,12 +93,24 @@ int view_instance_id, base::OnceClosure callback); - using WebContentsCreatedCallback = - base::OnceCallback<void(content::WebContents*)>; + using UnownedGuestCreatedCallback = base::OnceCallback<void(GuestViewBase*)>; + using OwnedGuestCreatedCallback = + base::OnceCallback<void(std::unique_ptr<GuestViewBase>)>; + // Creates a guest and has the GuestViewManager assume ownership. void CreateGuest(const std::string& view_type, content::WebContents* owner_web_contents, const base::Value::Dict& create_params, - WebContentsCreatedCallback callback); + UnownedGuestCreatedCallback callback); + // Creates a guest which the caller will own. + void CreateGuestAndTransferOwnership(const std::string& view_type, + content::WebContents* owner_web_contents, + const base::Value::Dict& create_params, + OwnedGuestCreatedCallback callback); + + // Transfers ownership of `guest` to the caller. + std::unique_ptr<GuestViewBase> TransferOwnership(GuestViewBase* guest); + // Have `this` manage ownership of `guest`. + void ManageOwnership(std::unique_ptr<GuestViewBase> guest); std::unique_ptr<content::WebContents> CreateGuestWithWebContentsParams( const std::string& view_type, @@ -154,12 +167,16 @@ void CallViewDestructionCallbacks(int embedder_process_id); // Creates a guest of the provided |view_type|. - GuestViewBase* CreateGuestInternal(content::WebContents* owner_web_contents, - const std::string& view_type); + std::unique_ptr<GuestViewBase> CreateGuestInternal( + content::WebContents* owner_web_contents, + const std::string& view_type); // Adds GuestView types to the GuestView registry. void RegisterGuestViewTypes(); + // Starts observing an embedder process's lifetime. + void ObserveEmbedderLifetime(content::RenderProcessHost* embedder_process); + // Indicates whether the provided |guest| can be used in the context it has // been created. bool IsGuestAvailableToContext(GuestViewBase* guest); @@ -241,6 +258,13 @@ // This tracks which GuestView embedders are currently being observed. std::set<int> embedders_observed_; + // Maps embedder process ids to unattached guests whose lifetimes are being + // managed by this GuestViewManager. An unattached guest's lifetime is scoped + // to the process that created it by this manager. Ownership is taken from + // this manager via `TransferOwnership` upon guest attachment, or for cases + // where an unattached guest needs to be destroyed earlier. + std::multimap<int, std::unique_ptr<GuestViewBase>> owned_guests_; + // |view_destruction_callback_map_| maps from embedder process ID to view ID // to a vector of callback functions to be called when that view is destroyed. using Callbacks = std::vector<base::OnceClosure>;
diff --git a/components/guest_view/browser/guest_view_message_handler.cc b/components/guest_view/browser/guest_view_message_handler.cc index a81fba7..6419d2e 100644 --- a/components/guest_view/browser/guest_view_message_handler.cc +++ b/components/guest_view/browser/guest_view_message_handler.cc
@@ -102,6 +102,10 @@ return; } + std::unique_ptr<GuestViewBase> owned_guest = + manager->TransferOwnership(guest); + DCHECK_EQ(owned_guest.get(), guest); + content::WebContents* owner_web_contents = guest->owner_web_contents(); DCHECK(owner_web_contents); auto* embedder_frame = RenderFrameHost::FromID( @@ -120,9 +124,9 @@ "Extensions.GuestView.ChangeOwnerWebContentsOnAttach", changed_owner_web_contents); - guest->AttachToOuterWebContentsFrame(embedder_frame, element_instance_id, - false /* is_full_page_plugin */, - std::move(callback)); + guest->AttachToOuterWebContentsFrame( + std::move(owned_guest), embedder_frame, element_instance_id, + false /* is_full_page_plugin */, std::move(callback)); } } // namespace guest_view
diff --git a/components/history/core/browser/sync/history_sync_bridge.cc b/components/history/core/browser/sync/history_sync_bridge.cc index 8ec0a61..1c5694b0d 100644 --- a/components/history/core/browser/sync/history_sync_bridge.cc +++ b/components/history/core/browser/sync/history_sync_bridge.cc
@@ -427,13 +427,10 @@ absl::optional<syncer::ModelError> HistorySyncBridge::MergeSyncData( std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_data) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - // Note: History is not synced retroactively - only visits created *after* - // turning Sync on get synced. So there's nothing to upload here. Just apply - // the incoming changes to the local history DB. - return ApplySyncChanges(std::move(metadata_change_list), - std::move(entity_data)); + // Since HISTORY is in ApplyUpdatesImmediatelyTypes(), MergeSyncData() should + // never be called. + NOTREACHED(); + return {}; } absl::optional<syncer::ModelError> HistorySyncBridge::ApplySyncChanges(
diff --git a/components/history/core/browser/sync/history_sync_bridge_unittest.cc b/components/history/core/browser/sync/history_sync_bridge_unittest.cc index 3badcd9..9a0a3b0 100644 --- a/components/history/core/browser/sync/history_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/history_sync_bridge_unittest.cc
@@ -293,9 +293,10 @@ return entity_change_list; } - void MergeSyncData( + void ApplyInitialSyncChanges( const std::vector<sync_pb::HistorySpecifics>& specifics_vector) { - // Just before the merge, the processor starts tracking metadata. + // Just before passing on the initial updates, the processor starts tracking + // metadata. processor()->SetIsTrackingMetadata(true); // Populate a MetadataChangeList with an update for each entity. @@ -312,11 +313,14 @@ processor()->AddRemoteEntity(storage_key, std::move(data)); } + // Note that because HISTORY is in ApplyUpdatesImmediatelyTypes(), the + // processor doesn't actually call MergeSyncData, but rather + // ApplySyncChanges. absl::optional<syncer::ModelError> error = - bridge()->MergeSyncData(std::move(metadata_changes), - CreateAddEntityChangeList(specifics_vector)); + bridge()->ApplySyncChanges(std::move(metadata_changes), + CreateAddEntityChangeList(specifics_vector)); if (error) { - ADD_FAILURE() << "MergeSyncData failed: " << error->ToString(); + ADD_FAILURE() << "ApplySyncChanges failed: " << error->ToString(); } } @@ -392,11 +396,11 @@ std::unique_ptr<HistorySyncBridge> bridge_; }; -TEST_F(HistorySyncBridgeTest, MergeDoesNotUploadData) { +TEST_F(HistorySyncBridgeTest, DoesNotUploadPreexistingData) { AddVisitToBackendAndAdvanceClock(GURL("https://www.url.com"), ui::PAGE_TRANSITION_LINK); - MergeSyncData({}); + ApplyInitialSyncChanges({}); // The data should *not* have been uploaded to Sync. EXPECT_TRUE(processor()->GetEntities().empty()); @@ -406,7 +410,7 @@ EXPECT_EQ(backend()->GetVisits().size(), 1u); } -TEST_F(HistorySyncBridgeTest, MergeAppliesRemoteChanges) { +TEST_F(HistorySyncBridgeTest, AppliesRemoteChanges) { const std::string remote_cache_guid("remote_cache_guid"); const GURL local_url("https://local.com"); const GURL remote_url("https://remote.com"); @@ -416,7 +420,7 @@ sync_pb::HistorySpecifics remote_entity = CreateSpecifics( base::Time::Now() - base::Minutes(1), remote_cache_guid, remote_url); - MergeSyncData({remote_entity}); + ApplyInitialSyncChanges({remote_entity}); // The local and remote data should both exist in the DB now. // Note: The ordering of the two entries in the backend doesn't really matter. @@ -429,14 +433,14 @@ EXPECT_EQ(backend()->GetVisits()[1].originator_cache_guid, remote_cache_guid); } -TEST_F(HistorySyncBridgeTest, MergeMergesRemoteChanges) { +TEST_F(HistorySyncBridgeTest, MergesRemoteChanges) { const GURL remote_url("https://remote.com"); sync_pb::HistorySpecifics remote_entity = CreateSpecifics( base::Time::Now() - base::Minutes(1), "remote_cache_guid", remote_url); // Start Sync the first time, so the remote data gets written to the local DB. - MergeSyncData({remote_entity}); + ApplyInitialSyncChanges({remote_entity}); ASSERT_EQ(backend()->GetURLs().size(), 1u); ASSERT_EQ(backend()->GetVisits().size(), 1u); ASSERT_EQ(backend()->GetVisits()[0].visit_duration, base::TimeDelta()); @@ -445,7 +449,7 @@ ApplyStopSyncChanges(); // ...but the data has been updated in the meantime. remote_entity.set_visit_duration_micros(1000); - MergeSyncData({remote_entity}); + ApplyInitialSyncChanges({remote_entity}); // The entries in the local DB should have been updated (*not* duplicated). ASSERT_EQ(backend()->GetURLs().size(), 1u); @@ -453,7 +457,7 @@ EXPECT_EQ(backend()->GetVisits()[0].visit_duration, base::Microseconds(1000)); } -TEST_F(HistorySyncBridgeTest, MergeIgnoresInvalidVisits) { +TEST_F(HistorySyncBridgeTest, IgnoresInvalidVisits) { const std::string remote_cache_guid("remote_cache_guid"); const GURL remote_url("https://remote.com"); @@ -481,8 +485,8 @@ sync_pb::HistorySpecifics valid = CreateSpecifics( base::Time::Now() - base::Minutes(10), remote_cache_guid, remote_url); - MergeSyncData({missing_cache_guid, missing_visit_time, no_redirects, too_old, - too_new, valid}); + ApplyInitialSyncChanges({missing_cache_guid, missing_visit_time, no_redirects, + too_old, too_new, valid}); // None of the invalid entities should've made it into the DB. ASSERT_EQ(backend()->GetURLs().size(), 1u); @@ -493,7 +497,7 @@ TEST_F(HistorySyncBridgeTest, UploadsNewLocalVisit) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Visit a URL. auto [url_row, visit_row] = AddVisitToBackendAndAdvanceClock( @@ -531,7 +535,7 @@ TEST_F(HistorySyncBridgeTest, UploadsUpdatedLocalVisit) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Visit a URL. auto [url_row, visit_row] = AddVisitToBackendAndAdvanceClock( @@ -564,7 +568,7 @@ TEST_F(HistorySyncBridgeTest, UploadsLocalVisitWithRedirects) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Create a redirect chain with 3 entries. URLRow url_row1(GURL("https://url1.com")); @@ -635,7 +639,7 @@ TEST_F(HistorySyncBridgeTest, UntracksEntitiesAfterCommit) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Visit some URLs. auto [url_row1, visit_row1] = AddVisitToBackendAndAdvanceClock( @@ -669,7 +673,7 @@ TEST_F(HistorySyncBridgeTest, UntracksRemoteEntities) { // Start Sync with an initial remote entity. - MergeSyncData( + ApplyInitialSyncChanges( {CreateSpecifics(base::Time::Now() - base::Seconds(10), "remote_cache_guid", GURL("https://remote.com"))}); ASSERT_EQ(backend()->GetURLs().size(), 1u); @@ -690,7 +694,7 @@ TEST_F(HistorySyncBridgeTest, DoesNotUntrackEntityPendingCommit) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Visit a URL locally. auto [url_row1, visit_row1] = AddVisitToBackendAndAdvanceClock( @@ -723,7 +727,7 @@ TEST_F(HistorySyncBridgeTest, UntracksEntityOnIndividualDeletion) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Visit some URLs. auto [url_row1, visit_row1] = AddVisitToBackendAndAdvanceClock( @@ -757,7 +761,7 @@ TEST_F(HistorySyncBridgeTest, UntracksAllEntitiesOnAllHistoryDeletion) { // Start syncing (with no data yet). - MergeSyncData({}); + ApplyInitialSyncChanges({}); // Add some visits to the DB. auto [url_row1, visit_row1] = AddVisitToBackendAndAdvanceClock( @@ -825,7 +829,7 @@ // Start syncing with these three entities - this should trigger the remapping // of originator IDs into local IDs. - MergeSyncData({entity_first, entity_chain, entity_last}); + ApplyInitialSyncChanges({entity_first, entity_chain, entity_last}); VisitRow first_row; ASSERT_TRUE(backend()->GetLastVisitByTime(first_visit_time, &first_row)); @@ -864,7 +868,7 @@ visit_time, remote_cache_guid, urls, originator_visit_ids); // Start syncing - this should trigger the creation of local referrer IDs. - MergeSyncData({entity}); + ApplyInitialSyncChanges({entity}); VisitRow chain_end_row; ASSERT_TRUE(backend()->GetLastVisitByTime(visit_time, &chain_end_row));
diff --git a/components/language/ios/browser/ios_language_detection_tab_helper.h b/components/language/ios/browser/ios_language_detection_tab_helper.h index 8a49642..d5f0ae6 100644 --- a/components/language/ios/browser/ios_language_detection_tab_helper.h +++ b/components/language/ios/browser/ios_language_detection_tab_helper.h
@@ -44,22 +44,16 @@ void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); - // Attach a new helper to the given WebState. We cannot use the implementation - // from WebStateUserData as we are injecting the histogram and translate - // callback differently on iOS and iOS WebView. - static void CreateForWebState(web::WebState* web_state, - UrlLanguageHistogram* url_language_histogram); - // Called on page language detection. void OnLanguageDetermined(const translate::LanguageDetectionDetails& details); private: - base::ObserverList<Observer, true>::Unchecked observer_list_; - - IOSLanguageDetectionTabHelper( - UrlLanguageHistogram* const url_language_histogram); friend class web::WebStateUserData<IOSLanguageDetectionTabHelper>; + IOSLanguageDetectionTabHelper(web::WebState* web_state, + UrlLanguageHistogram* url_language_histogram); + + base::ObserverList<Observer, true>::Unchecked observer_list_; UrlLanguageHistogram* const url_language_histogram_; WEB_STATE_USER_DATA_KEY_DECL();
diff --git a/components/language/ios/browser/ios_language_detection_tab_helper.mm b/components/language/ios/browser/ios_language_detection_tab_helper.mm index 467f155..cf02068 100644 --- a/components/language/ios/browser/ios_language_detection_tab_helper.mm +++ b/components/language/ios/browser/ios_language_detection_tab_helper.mm
@@ -11,7 +11,8 @@ namespace language { IOSLanguageDetectionTabHelper::IOSLanguageDetectionTabHelper( - UrlLanguageHistogram* const url_language_histogram) + web::WebState* web_state, + UrlLanguageHistogram* url_language_histogram) : url_language_histogram_(url_language_histogram) {} IOSLanguageDetectionTabHelper::~IOSLanguageDetectionTabHelper() { @@ -20,18 +21,6 @@ } } -// static -void IOSLanguageDetectionTabHelper::CreateForWebState( - web::WebState* web_state, - UrlLanguageHistogram* const url_language_histogram) { - DCHECK(web_state); - if (!FromWebState(web_state)) { - web_state->SetUserData(UserDataKey(), - base::WrapUnique(new IOSLanguageDetectionTabHelper( - url_language_histogram))); - } -} - void IOSLanguageDetectionTabHelper::AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb index 47948fe..ceb76a2d 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> +<translation id="101606685846791463">изчистване на кеша на браузъра, изчистване на историята, изтриване на „бисквитките“, изтриване на историята на сърфиране, изтриване на кеша</translation> +<translation id="132297926492792130">контролиране на профила ми в google, коригиране на настройките на профила в google, управление на профила в google, управление на профила ми в google, настройки на профила в google</translation> +<translation id="1455865776268085776">влизане в режим „инкогнито“, нов прозорец в режим „инкогнито“, отваряне на раздел в режим „инкогнито“, нов раздел „инкогнито“</translation> <translation id="1545931455576308147">споделяне на тази страница, споделяне на този раздел, споделяне на страница, споделяне на раздел</translation> <translation id="1912698329644085067">промяна на настройките на chrome, управление на настройките, настройки на chrome</translation> +<translation id="1938436187879863297">създаване на бележка в google keep, създаване на бележка в google, създаване на нова бележка в google keep, нова бележка в google, започване на бележка в google, бележка в google, бележка в keep</translation> <translation id="2003251155164817216">персонализиране на облика на chrome, управление на темите на chrome, тема на chrome, промяна на темата в chrome</translation> +<translation id="2757458512261408467">създаване на покана в google календар, създаване на събитие в google календар, създаване на нова покана в календара, ново събитие в календара, нова покана в google календар</translation> +<translation id="2903767089701932453">настройки за „бисквитки“ в chrome, използване на „бисквитки“, забраняване на всички „бисквитки“ на трети страни, управление на настройките за „бисквитки“, управление на „бисквитките“</translation> +<translation id="2941773220794601465">превод на тази страница, превод на уеб страницата, превод на уебсайта, превод на сайта</translation> +<translation id="2973110773361184993">коригиране на разрешенията за сайтове, промяна на разрешенията, контролиране на настройките за сайтове, управление на настройките на сайтовете, настройки за сайтове в chrome, разрешения за сайтове</translation> +<translation id="3371457011763794419">актуализиране на chrome, надстройване на браузъра, актуализация на chrome, актуализиране на браузъра</translation> <translation id="3489247412199563299">персонализиране на достъпността на chrome, управление на настройките за достъпност, достъпност на chrome</translation> +<translation id="3936847108123063274">създаване на сайт в google, създаване на уебсайт в google, нов сайт в google, отваряне на нов сайт в google</translation> +<translation id="4165988127016746956">създаване на формуляр в google формуляри, създаване на нов формуляр в google, нов формуляр в google, стартиране на анкета в google</translation> <translation id="4367205929005172598">намиране на загубен телефон, намиране на устройството ми, намиране на телефона ми</translation> <translation id="4692900934258103694">в, във, на, от, за, и, моя, моят, моето, моята, с, със, как</translation> +<translation id="4834023075966161189">създаване на документ в google документи, създаване на нов документ в google, отваряне на документ в google, създаване на документ в google</translation> <translation id="4922709528022057939">динозавърът в chrome, игра с динозавър, пускане на играта с динозавъра, динозавър в chrome</translation> <translation id="5061612070235737664">промяна на шрифта на браузъра, шрифтове за chrome, шрифтове в chrome, размер на шрифта в chrome</translation> +<translation id="6413237123574479071">управление на начините на плащане, актуализиране на кредитната карта, настройки за плащане, промяна на информацията за плащане, промяна на данните за плащане</translation> <translation id="6654270263159958770">добавяне на персонализирано търсене, управление на търсещите машини, търсещи машини, търсачки, управление на търсачките</translation> +<translation id="7081494400361697539">създаване на таблица в google таблици, създаване на електронна таблица в workspace, нова таблица в google, започване на нова таблица в google</translation> +<translation id="7153639895359139570">добавяне на адрес, промяна на адреса за доставка, редактиране на адреси, управление на адресите</translation> +<translation id="7242693601647412075">управление на настройките за сигурност, контролиране на настройките за сигурност, задаване на настройки за сигурност, управление на сигурността, настройки за сигурност</translation> +<translation id="7441773108452086364">промяна на паролата за gmail, промяна на паролата ми за gmail, промяна на паролата за google, нова парола за профила в gmail, задаване на нова парола за gmail</translation> <translation id="7660956169713698963">персонализиране на достъпността на chromeos, управление на настройките за достъпност, достъпност на chromeos</translation> <translation id="7700496593710078083">преглед на историята в chrome, преглед на историята на сърфиране, преглед на историята на браузъра, история в chrome, история на браузъра, история на сърфиране</translation> <translation id="7739523284295786564">управление на изтеглянията в chrome, преглед на изтеглянията, изтеглени файлове в chrome</translation> +<translation id="7873993277886791795">създаване на презентация в google презентации, създаване на нова презентация, нова презентация в google, започване на презентация в google</translation> <translation id="7992725801741093524">промяна на настройките за поверителност в google, управление на поверителността в google, настройки за поверителност</translation> <translation id="8020024640114692614">връзките винаги да се отварят в chrome, винаги да се използва chrome, chrome по подразбиране, браузър по подразбиране, изтриване на safari, как да направя chrome стандартен браузър, основен браузър, използване на chrome по подразбиране, chrome да стане основен браузър, chrome да стане основният ми браузър, отваряне на връзките в chrome, избиране на chrome като стандартен браузър, основен браузър, премахване на safari, търсене в chrome, задаване на chrome по подразбиране, задаване на chrome като браузър по подразбиране, стандартен браузър</translation> +<translation id="8189600756055704659">промяна на настройките за синхронизиране в браузъра chrome, промяна на синхронизирането в chrome, редактиране на синхронизирането, редактиране на настройките за синхронизиране, управление на синхронизирането, контролиране на синхронизирането</translation> +<translation id="8307473667919507216">стартиране на проверка на безопасността в chrome, стартиране на проверка на безопасността, проверка на безопасността</translation> <translation id="8319253638505741466">затваряне на прозорец в режим „инкогнито“, изход от режим „инкогнито“</translation> +<translation id="8350110529112037703">управление на паролите в chrome, преглед на паролите в chrome, управление на паролите, настройки за паролите</translation> +<translation id="9015559449837241926">функции на chrome, информация за функциите на google chrome, нови функции на google chrome, съвети за chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb index 67728de..4a35c8d 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="da"> +<translation id="101606685846791463">ryd browserens cache, ryd browsercache, ryd historik, slet cookies, ryd browserhistorik, ryd browser historik</translation> +<translation id="132297926492792130">styr min google-konto, styr min google konto, fiks google-konto, fiks google konto, ret google-konto, ret google konto, administrer google-konto, administrer google konto, administrer min google-konto, administrer min google konto</translation> +<translation id="1455865776268085776">åbn inkognitotilstand, nyt inkognitovindue, åbn inkognitofane</translation> <translation id="1545931455576308147">del denne side, del denne fane, del side, del fane, del siden, del fanen</translation> <translation id="1912698329644085067">skift Chrome-indstillinger, administrer indstillinger, juster indstillinger, juster Chrome-indstillinger, styr indstillinger, styr Chrome-indstillinger, skift indstillinger for Chrome, administrer indstillinger for Chrome, juster indstillingerne for Chrome</translation> +<translation id="1938436187879863297">opret google keep-note, opret google keep note, opret google-note, opret google note, opret ny google-note, opret ny google note, ny google-note, ny google note, start google-note, start google note</translation> <translation id="2003251155164817216">tilpas Chromes udseende, administrer Chrome-temaer, administrer temaer i Chrome, tilpas udseendet i Chrome, juster Chromes udseende, juster udseendet i Chrome, juster Chrome-temaer, juster temaer i Chrome</translation> +<translation id="2757458512261408467">opret google kalenderinvitation, opret google kalender invitation, opret google kalender-begivenhed, opret google kalender begivenhed, opret ny kalenderinvitation, opret ny kalender invitation, ny kalenderinvitation, ny kalender invitation, ny google-kalenderinvitation, ny google kalender invitation</translation> +<translation id="2903767089701932453">chrome cookieindstillinger, chrome cookie indstillinger, brug af cookies, fjern alle cookies fra tredjeparter, fjern alle cookietilladelser fra tredjeparter, tillad ikke tredjepartscookies, tillad ikke cookies fra tredjeparter, administrer cookieindstillinger, administrer indstillinger cookies, administrer cookies</translation> +<translation id="2941773220794601465">oversæt denne side, oversæt webside</translation> +<translation id="2973110773361184993">juster websitetilladelser, juster website indstillinger, skift tilladelser, administrer websiteindstillinger, administrer website indstillinger, styr websiteindstillinger, styr website indstillinger, indstillinger, websiteindstillinger chrome, website indstillinger chrome</translation> +<translation id="3371457011763794419">opdater chrome, opgrader browser</translation> <translation id="3489247412199563299">tilpas Chrome-hjælpefunktioner, administrer hjælpefunktioner, juster hjælpefunktioner, tilpas hjælpefunktioner, tilpas hjælpefunktioner i Chrome, administrer hjælpefunktioner i Chrome, juster hjælpefunktioner i Chrome, styr hjælpefunktioner</translation> +<translation id="3936847108123063274">opret google-website, opret google website, lav google-website, lav google website, nyt google-website, nyt google website, åbn nyt google-website, åbn nyt google website</translation> +<translation id="4165988127016746956">opret google-formular, opret google formular, opret ny google-formular, opret ny google-formular, ny google-formular, ny google formular, start google-undersøgelse, start google undersøgelse</translation> <translation id="4367205929005172598">find mistet telefon, find min enhed, find min mistede telefon, find min mistede enhed, find mistet enhed, findd en mistet telefon, find en mistet enhed</translation> <translation id="4692900934258103694">i, for, hvordan, den, det, en, et, min, mit, på, til, jeg, ind, gøre</translation> +<translation id="4834023075966161189">opret google-dokument, opret google dokument, opret nyt google-dokument, opret nyt google dokument, åbn google-dokument, åbn google dokument</translation> <translation id="4922709528022057939">Chrome Dino, dinospil, dinosaurspil, spil Dino-løbespillet, spil dinosaurspillet, spil Dino, spil dinosaurløbespillet</translation> <translation id="5061612070235737664">skift browserens skrifttype, skrifttyper i Chrome, Chrome-skrifttyper, skift skrifttype i browseren, juster browserens skrifttype, juster skrifttyper i Chrome, juster Chromes skrifttype, skift Chromes skrifttype</translation> +<translation id="6413237123574479071">administrer betalingsmetoder, opdater betalingskort</translation> <translation id="6654270263159958770">tilføj tilpasset søgning, administrer søgemaskiner, søgemaskiner, juster søgning, skift søgemaskine, tilpas søgning, juster søgemaskine</translation> +<translation id="7081494400361697539">opret google-regneark, opret google regneark, opret workspace-regneark, opret workspace regneark, nyt google-regneark, nyt google regneark, start nyt google-regneark, start nyt google regneark</translation> +<translation id="7153639895359139570">tilføj adresse, skift leveringsadresse, rediger adresser, administrer adresser</translation> +<translation id="7242693601647412075">administrer sikkerhedsindstillinger</translation> +<translation id="7441773108452086364">skift gmail adgangskode, skift gmail-adgangskode, skift min gmail adgangskode, skift min gmail-adgangskode, skift google adgangskode, skift google-adgangskode, nulstil adgangskode til gmail konto, nulstil adgangskode til gmail-konto</translation> <translation id="7660956169713698963">tilpas Chrome OS-hjælpefunktioner, administrer hjælpefunktioner, juster hjælpefunktioner, tilpas hjælpefunktioner, tilpas hjælpefunktioner i Chrome OS, administrer hjælpefunktioner i Chrome OS, juster hjælpefunktioner i Chrome OS, styr hjælpefunktioner</translation> <translation id="7700496593710078083">se Chrome-historik, se browserhistorik, se Chrome-historikken, se browserhistorikken, se historikken for Chrome, se historikken for browsing, tjek Chrome-historikken, tjek browserhistorikken</translation> <translation id="7739523284295786564">administrer Chrome-downloads, se downloads, styr downloads, styr Chrome-downloads, administrer downloads i Chrome, se downloads i Chrome, se Chrome-downloads, styr downloads i Chrome</translation> +<translation id="7873993277886791795">opret google-dias, opret google dias, opret google slides-præsentation, opret google slides præsentation, opret google slides dias, opret nyt dias, ny google-præsentation, opret ny google præsentation, start google-præsentation, start google præsentation</translation> <translation id="7992725801741093524">skift indstillinger for privatliv på Google, administrer privatliv på Google, skift indstillinger for beskyttelse af personlige oplysninger på Google, administrer beskyttelsen af personlige oplysninger på Google</translation> <translation id="8020024640114692614">åbn altid links i chrome, brug altid chrome, chrome som standard, standardbrowser, slet safari, hvordan gør jeg chrome til standardbrowser, hvordan gør man chrome til standardbrowser, standard browser, gør chrome til standard, gør chrome til standardbrowseren, gør chrome til min standardbrowser, åbn links i chrome, vælg chrome som standardbrowser, primær browser, fjern safari, søg i chrome, anvend chrome som standard, brug chrome som standardbrowser, standard til browsing</translation> +<translation id="8189600756055704659">skift indstillinger for synkronisering chrome-browser, rediger synkronisering chrome, skift synkronisering chrome, rediger synkronisering, rediger indstillinger synkronisering, administrer synkronisering</translation> +<translation id="8307473667919507216">kør chrome-sikkerhedstjek, kør chrome sikkerhedstjek, kør sikkerhedstjek</translation> <translation id="8319253638505741466">luk inkognitovindue, afslut inkognito, forlad inkognito, luk inkognitovinduet, afslut inkognitotilstand, luk inkognito ned, forlad inkognitotilstand</translation> +<translation id="8350110529112037703">administrer chrome-adgangskoder, opdater chrome adgangskoder, se adgangskoder i chrome</translation> +<translation id="9015559449837241926">chrome funktioner, chrome-funktioner, lær google chrome funktioner, lær google chrome-funktioner, nye google chrome funktioner, nye google chrome-funktioner, se chrome tips, se chrome-tips</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_el.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_el.xtb index 21b83cb..7961ab25fe 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_el.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_el.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="el"> +<translation id="101606685846791463">διαγραφή κρυφής μνήμης προγράμματος περιήγησης, εκκαθάριση κρυφής μνήμης, διαγραφή ιστορικού, εκκαθάριση ιστορικού, διαγραφή cookie, διαγραφή ιστορικού περιήγησης, εκκαθάριση ιστορικού περιήγησης</translation> +<translation id="132297926492792130">έλεγχος του λογαριασμού μου google, διόρθωση λογαριασμού google, διαχείριση λογαριασμού google, διαχείριση του λογαριασμού μου google</translation> +<translation id="1455865776268085776">χρήση κατάστασης ανώνυμης περιήγησης, νέο παράθυρο ανώνυμης περιήγησης, άνοιγμα καρτέλας ανώνυμης περιήγησης, είσοδος σε κατάσταση ανώνυμης περιήγησης</translation> <translation id="1545931455576308147">κοινοποίηση αυτής της σελίδας, κοινοποίηση αυτής της καρτέλας</translation> <translation id="1912698329644085067">αλλαγή ρυθμίσεων chrome, διαχείριση ρυθμίσεων</translation> +<translation id="1938436187879863297">δημιουργία σημείωσης google keep, δημιουργία σημείωσης google, δημιουργία νέας σημείωσης google keep, νέα σημείωση google, σημείωση google</translation> <translation id="2003251155164817216">προσαρμογή εμφάνισης chrome, διαχείριση θεμάτων chrome</translation> +<translation id="2757458512261408467">δημιουργία πρόσκλησης ημερολογίου google, δημιουργία συμβάντος ημερολογίου google, δημιουργία νέας πρόσκλησης ημερολογίου, νέο συμβάν ημερολογίου, νέα πρόσκληση ημερολογίου google</translation> +<translation id="2903767089701932453">ρυθμίσεις cookie chrome, χρήση cookie, απαγόρευση όλων των cookie τρίτου μέρους, διαχείριση ρυθμίσεων cookie, διαχείριση cookie, διαχείριση cookies, ρυθμίσεις cookies chrome, απαγόρευση cookies τρίτων</translation> +<translation id="2941773220794601465">μετάφραση της σελίδας, μετάφραση αυτής της σελίδας, μετάφραση ιστοσελίδας, μετάφραση τρέχουσας σελίδας</translation> +<translation id="2973110773361184993">προσαρμογή αδειών ιστοτόπου, αλλαγή αδειών, έλεγχος ρυθμίσεων ιστοτόπου, διαχείριση ρυθμίσεων ιστοτόπου, ρυθμίσεις ιστοτόπου chrome, διαχείριση αδειών ιστοτόπου</translation> +<translation id="3371457011763794419">ενημέρωση chrome, αναβάθμιση προγράμματος περιήγησης</translation> <translation id="3489247412199563299">προσαρμογή προσβασιμότητας chrome, διαχείριση ρυθμίσεων προσβασιμότητας</translation> +<translation id="3936847108123063274">δημιουργία ιστοτόπου google, νέος ιστότοπος google, άνοιγμα νέου ιστοτόπου google, δημιουργία νέου ιστοτόπου google</translation> +<translation id="4165988127016746956">δημιουργία φόρμας google, δημιουργία νέας φόρμας google, νέα φόρμα google, έναρξη έρευνας google</translation> <translation id="4367205929005172598">εύρεση χαμένου τηλεφώνου, εύρεση συσκευής</translation> <translation id="4692900934258103694">μέσα, εντός, για, πώς, το, ένα, κάνω, στο, μου, σε, για, μια, εγώ</translation> +<translation id="4834023075966161189">δημιουργία εγγράφου google, δημιουργία νέου εγγράφου google, άνοιγμα εγγράφου google, νέο έγγραφο google</translation> <translation id="4922709528022057939">chrome dino, παιχνίδι dino, παιχνίδι dino run</translation> <translation id="5061612070235737664">αλλαγή γραμματοσειράς προγράμματος περιήγησης, γραμματοσειρές chrome</translation> +<translation id="6413237123574479071">διαχείριση τρόπων πληρωμής, ενημέρωση πιστωτικής κάρτας, ενημέρωση τρόπων πληρωμής, διαχείριση τρόπου πληρωμής, ενημέρωση τρόπου πληρωμής</translation> <translation id="6654270263159958770">προσθήκη προσαρμοσμένης αναζήτησης, διαχείριση μηχανών αναζήτησης, μηχανές αναζήτησης</translation> +<translation id="7081494400361697539">δημιουργία φύλλου google, δημιουργία υπολογιστικού φύλλου workspace, νέο φύλλο google, δημιουργία νέου φύλλου google</translation> +<translation id="7153639895359139570">προσθήκη διεύθυνσης, αλλαγή διεύθυνσης αποστολής, επεξεργασία διευθύνσεων, διαχείριση διευθύνσεων</translation> +<translation id="7242693601647412075">διαχείριση ρυθμίσεων ασφαλείας, ρυθμίσεις ασφαλείας στο chrome, διαχείριση ρυθμίσεων ασφαλείας chrome</translation> +<translation id="7441773108452086364">αλλαγή κωδικού πρόσβασης gmail, αλλαγή του κωδικού πρόσβασης στο gmail, αλλαγή κωδικού πρόσβασης google, επαναφορά κωδικού πρόσβασης λογαριασμού gmail</translation> <translation id="7660956169713698963">προσαρμογή προσβασιμότητας chromeos, προσαρμογή προσβασιμότητας λειτουργικού συστήματος chrome, διαχείριση ρυθμίσεων προσβασιμότητας</translation> <translation id="7700496593710078083">εμφάνιση ιστορικού chrome, προβολή ιστορικού περιήγησης</translation> <translation id="7739523284295786564">διαχείριση λήψεων chrome, προβολή λήψεων</translation> +<translation id="7873993277886791795">δημιουργία διαφάνειας google, δημιουργία νέας παρουσίασης, νέα παρουσίαση google, έναρξη παρουσίασης google, νέα διαφάνεια παρουσίασης google</translation> <translation id="7992725801741093524">αλλαγή ρυθμίσεων απορρήτου google, διαχείριση απορρήτου google</translation> <translation id="8020024640114692614">πάντα άνοιγμα συνδέσμων στο chrome, πάντα χρήση του chrome, chrome ως προεπιλογή, προεπιλεγμένο πρόγραμμα περιήγησης, διαγραφή safari, πώς ορίζω το chrome ως το προεπιλεγμένο πρόγραμμα περιήγησης, κύριο πρόγραμμα περιήγησης, ορισμός του chrome ως προεπιλογής, ορισμός του chrome ως το προεπιλεγμένο πρόγραμμα περιήγησης, ορισμός του chrome ως προεπιλεγμένου προγράμματος περιήγησης, άνοιγμα συνδέσμων στο chrome, επιλογή chrome ως προεπιλεγμένου προγράμματος περιήγησης, πρωτεύον πρόγραμμα περιήγησης, κατάργηση safari, αναζήτηση στο chrome, ορισμός chrome ως προεπιλογής, ορισμός chrome ως προεπιλεγμένου προγράμματος περιήγησης, βασικό πρόγραμμα περιήγησης</translation> +<translation id="8189600756055704659">αλλαγή ρυθμίσεων συγχρονισμού προγράμματος περιήγησης chrome, αλλαγή συγχρονισμού chrome, επεξεργασία συγχρονισμού, επεξεργασία ρυθμίσεων συγχρονισμού, διαχείριση συγχρονισμού, διαχείριση ρυθμίσεων συγχρονισμού chrome</translation> +<translation id="8307473667919507216">εκτέλεση ελέγχου ασφαλείας chrome, εκτέλεση ελέγχου ασφαλείας, έλεγχος ασφαλείας chrome</translation> <translation id="8319253638505741466">κλείσιμο παραθύρου για ανώνυμη περιήγηση, τερματισμός ανώνυμης περιήγησης</translation> +<translation id="8350110529112037703">διαχείριση κωδικών πρόσβασης chrome, προβολή κωδικού πρόσβασης στο chrome, ρυθμίσεις κωδικού πρόσβασης chrome</translation> +<translation id="9015559449837241926">λειτουργίες chrome, περισσότερες λειτουργίες google chrome, νέες λειτουργίες google chrome, συμβουλές για το chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb index 5ef0321..3ea2409 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="et"> +<translation id="101606685846791463">brauseri vahemälu tühjendamine, ajaloo kustutamine, küpsisefailide kustutamine, brauseri ajaloo kustutamine, kustuta küpsised</translation> +<translation id="132297926492792130">minu google'i konto haldamine, google'i konto parandamine, halda minu google'i kontot</translation> +<translation id="1455865776268085776">inkognito režiimi sisenemine, uus inkognito aken, inkognito vahelehe avamine, ava inkognito vaheleht, sisene inkognito režiimi</translation> <translation id="1545931455576308147">lehe jagamine, vahelehe jagamine, jaga lehte, jaga vahelehte</translation> <translation id="1912698329644085067">chrome'i seadete muutmine, chrome seadete muutmine, chrome'i sätete muutmine, chrome sätete muutmine, seadete haldamine, sätete haldamine</translation> +<translation id="1938436187879863297">google keepi märkme loomine, google'i märkme loomine, loo uus google keepi märge, uus google'i märge, alusta google'i märget</translation> <translation id="2003251155164817216">chrome'i välimuse kohandamine, chrome välimuse kohandamine, chrome'i välimuse muutmine, chrome välimuse muutmine, chrome'i teemade haldamine, chrome teemade haldamine</translation> +<translation id="2757458512261408467">google'i kalendri kutse loomine, google'i kalendri sündmuse loomine, uue kalendri kutse loomine, uus kalendrisündmus, uus google'i kalendri kutse</translation> +<translation id="2903767089701932453">chrome'i küpsisefailide seaded, küpsiste kasutamine, kõigi kolmanda osapoole küpsisefailide keelamine, küpsisefailide seadete haldamine, küpsiste haldamine, küpsiste keelamine</translation> +<translation id="2941773220794601465">tõlgi see leht, lehe tõlkimine, veebilehe tõlkimine, tõlgi veebileht</translation> +<translation id="2973110773361184993">saidi lubade kohandamine, lubade muutmine, saidi seadete juhtimine, saidi seadete haldamine, saidi seaded chrome, saidi load</translation> +<translation id="3371457011763794419">chrome'i värskendamine, brauseri versiooniuuendus, brauseri värskendamine</translation> <translation id="3489247412199563299">chrome'i juurdepääsetavuse kohandamine, chrome juurdepääsetavuse kohandamine, juurdepääsetavuse seadete haldamine, juurdepääsetavuse haldamine, juurdepääsetavuse kohandamine, juurdepääsetavuse seadistamine, juurdepääsetavuse seaded, juurdepääsu seaded, juurdepääsetavuse sätted, juurdepääsu sätted</translation> +<translation id="3936847108123063274">google'i saidi loomine, google'i veebisaidi loomine, uus google'i sait, uue google'i saidi avamine</translation> +<translation id="4165988127016746956">google'i vormi loomine, uue google'i vormi loomine, uus google'i vorm, alusta google'i küsitlust, google'i küsitluse loomine, loo google'i vorm</translation> <translation id="4367205929005172598">kadunud telefoni leidmine, kadunud seadme leidmine, telefoni leidmine, seadme leidmine, leia mu seade</translation> <translation id="4692900934258103694">kuidas, teha, minu, jaoks</translation> +<translation id="4834023075966161189">google'i dokumendi loomine, loo uus google'i dokument, ava google'i dokument, dokumendi avamine</translation> <translation id="4922709528022057939">chrome'i dinosaurusemäng, chrome dinosaurusemäng, chrome'i dinosauruse mäng, chrome dinosauruse mäng, dinosaurusemäng, dinosauruse mäng, dino run</translation> <translation id="5061612070235737664">brauseri fondi muutmine, chrome'i fondid, chrome fondid, chrome'i fondi muutmine, chrome fondi muutmine</translation> +<translation id="6413237123574479071">makseviiside haldamine, krediitkaardi värskendamine, värskenda krediitkaarti</translation> <translation id="6654270263159958770">kohandatud otsingu lisamine, otsingumootorite haldamine, otsingumootorite seadistamine, otsingumootorid</translation> +<translation id="7081494400361697539">google'i arvutustabeli loomine, workspace'i arvutustabeli loomine, uus google'i arvutustabel, uue google'i arvutustabeli alustamine, loo google'i arvutustabel</translation> +<translation id="7153639895359139570">lisa aadress, tarneaadressi muutmine, aadresside muutmine, aadresside haldamine, muuda aadressi</translation> +<translation id="7242693601647412075">turvaseadete haldamine, halda turvaseadeid</translation> +<translation id="7441773108452086364">gmaili parooli muutmine, muuda minu gmaili parooli, google'i parooli muutmine, lähtesta gmaili konto parool, gmaili parooli lähtestamine</translation> <translation id="7660956169713698963">chrome osi juurdepääsetavuse kohandamine, chrome os juurdepääsetavuse kohandamine, chrome osi juurdepääsetavus, chrome os juurdepääsetavus, juurdepääsetavuse seadete haldamine, juurdepääsetavuse sätete haldamine, juurdepääsetavuse haldamine, juurdepääsetavuse kohandamine, juurdepääsetavuse seadistamine, juurdepääsetavuse seaded, juurdepääsu seaded, juurdepääsetavuse sätted, juurdepääsu sätted</translation> <translation id="7700496593710078083">chrome'i ajaloo vaatamine, chrome ajaloo vaatamine, sirvimisajaloo vaatamine, chrome'i ajalugu, chrome ajalugu</translation> <translation id="7739523284295786564">chrome'i allalaadimiste haldamine, chrome allalaadimiste haldamine, allalaadimiste vaatamine, chrome'i allalaadimised, chrome allalaadimised, allalaadimised, alla laaditud failid</translation> +<translation id="7873993277886791795">google'i esitluse loomine, uue esitluse loomine, uus google'i esitlus, google'i esitluse alustamine, loo google'i esitlus</translation> <translation id="7992725801741093524">google'i privaatsusseadete muutmine, google privaatsusseadete muutmine, google'i privaatsussätete muutmine, google privaatsussätete muutmine, google'i privaatsuse haldamine, google privaatsuse haldamine, google'i privaatsuse seadete muutmine, google privaatsuse seadete muutmine</translation> <translation id="8020024640114692614">linkide alati chrome'is avamine, linkide alati chromeis avamine, ava lingid alati chrome'is, ava lingid alati chromeis, alati chrome'i kasutamine, alati chrome kasutamine, chrome vaikebrauserina, chrome vaikebrauser, chrome vaikevalik, vaikebrauser, safari kustutamine, kuidas chrome vaikebrauseriks muuta, põhibrauser, peamine brauser, chrome'i vaikebrauseriks muutmine, chrome vaikebrauseriks muutmine, chrome vaikeseade, linkide avamine chrome'is, linkide avamine chrome'iga, linkide avamine chrome, lingid chrome'is, lingid chrome, chrome'i lingid, chrome lingid, chrome'i vaikebrauseriks valimine, chrome vaikebrauseriks valimine, safari eemaldamine, chrome'is otsimine, chromeis otsimine, chrome'i vaikebrauseriks seadmine, chrome vaikebrauseriks seadmine, chrome vaikebrauseriks, standardbrauser</translation> +<translation id="8189600756055704659">chrome'i brauseri sünkroonimisseadete muutmine, chrome'i sünkroonimise muutmine, muuda sünkroonimist, muuda sünkroonimisseadeid, halda sünkroonimist, halda sünkroonimisseadeid</translation> +<translation id="8307473667919507216">chrome'i ohutuskontrolli käitamine, käita ohutuskontroll, chrome'i ohutuskontroll</translation> <translation id="8319253638505741466">inkognito akna sulgemine, inkognito sulgemine, inkognito lõpetamine, inkognitost väljumine</translation> +<translation id="8350110529112037703">chrome'i paroolide haldamine, paroolide vaatamine chrome'is, paroolihaldus</translation> +<translation id="9015559449837241926">chrome'i funktsioonid, teave google chrome'i funktsioonide kohta, uued google chrome'i funktsioonid, vaadake chrome'i nõuandeid, kuva chrome'i nõuanded</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb index 4937548..7b4e6cc5 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fa"> +<translation id="101606685846791463">پاک کردن حافظه نهان مرورگر، پاک کردن سابقه، حذف کوکی، پاک کردن سابقه مرور</translation> +<translation id="132297926492792130">کنترل حساب google، رفع اشکال حساب google، مدیریت حساب google، مدیریت کردن حساب google</translation> +<translation id="1455865776268085776">ورود به حالت ناشناس، پنجره ناشناس جدید، باز کردن برگه ناشناس</translation> <translation id="1545931455576308147">همرسانی این صفحه، همرسانی این برگه</translation> <translation id="1912698329644085067">تغییر تنظیمات Chrome، مدیریت تنظیمات</translation> +<translation id="1938436187879863297">ایجاد یادداشت google keep، ایجاد یادداشت google، ساختن یادداشت جدید google keep، یادداشت جدید google، ساختن یادداشت google</translation> <translation id="2003251155164817216">سفارشی کردن ظاهر Chrome، مدیریت طرحهای زمینه Chrome</translation> +<translation id="2757458512261408467">ایجاد دعوت تقویم google، ایجاد رویداد تقویم google، ایجاد دعوت تقویم جدید، رویداد تقویم جدید، دعوت تقویم google جدید</translation> +<translation id="2903767089701932453">تنظیمات کوکی chrome، کاربرد کوکی، غیرمجاز کردن همه کوکیهای شخص ثالث، مدیریت تنظیمات کوکی، مدیریت کوکیها</translation> +<translation id="2941773220794601465">ترجمه این صفحه، ترجمه صفحه وب</translation> +<translation id="2973110773361184993">تنظیم اجازههای سایت، تغییر اجازهها، کنترل تنظیمات سایت، مدیریت تنظیمات سایت، تنظیمات سایت chrome</translation> +<translation id="3371457011763794419">بهروزرسانی chrome، ارتقای مرورگر</translation> <translation id="3489247412199563299">سفارشی کردن دسترسپذیری Chrome، مدیریت تنظیمات دسترسپذیری</translation> +<translation id="3936847108123063274">ایجاد سایت با google site، ساختن وبسایت google، سایت google جدید، باز کردن سایت google جدید</translation> +<translation id="4165988127016746956">ایجاد فرم google، ساختن فرم جدید google، فرم جدید google، ساختن نظرسنجی google</translation> <translation id="4367205929005172598">پیدا کردن تلفن گمشده، یافتن دستگاهم</translation> <translation id="4692900934258103694">داخل، درون، برای، نحوه، انجام، در، روی، به، من</translation> +<translation id="4834023075966161189">ایجاد سند google، ساختن سند google جدید، باز کردن سند google</translation> <translation id="4922709528022057939">دایناسور Chrome، بازی دایناسور، بازی دویدن دایناسور</translation> <translation id="5061612070235737664">تغییر قلم مرورگر، قلمهای Chrome</translation> +<translation id="6413237123574479071">مدیریت روشهای پرداخت، بهروزرسانی کارت اعتباری</translation> <translation id="6654270263159958770">افزودن جستجوی سفارشی، مدیریت موتورهای جستجو، موتورهای جستجو</translation> +<translation id="7081494400361697539">ایجاد کاربرگ google، ایجاد صفحهگسترده workspace، کاربرگ جدید google، ساختن کاربرگ جدید google</translation> +<translation id="7153639895359139570">افزودن نشانی، تغییر نشانی ارسال کالا، ویرایش نشانی، مدیریت نشانیها</translation> +<translation id="7242693601647412075">مدیریت تنظیمات امنیتی</translation> +<translation id="7441773108452086364">تغییر گذرواژه gmail، عوض کردن گذرواژه gmail، تغییر گذرواژه google، بازنشانی گذرواژه حساب gmail</translation> <translation id="7660956169713698963">سفارشی کردن دسترسپذیری chromeos، مدیریت تنظیمات دسترسپذیری</translation> <translation id="7700496593710078083">دیدن سابقه Chrome، مشاهده سابقه مرور</translation> <translation id="7739523284295786564">مدیریت بارگیریهای Chrome، مشاهده بارگیریها</translation> +<translation id="7873993277886791795">ایجاد اسلاید google، ساختن مجموعه اسلاید جدید، ارائه جدید google، ساختن ارائه google</translation> <translation id="7992725801741093524">تغییر تنظیمات حریم خصوصی Google، مدیریت حریم خصوصی Google</translation> <translation id="8020024640114692614">پیوندها همیشه در chrome باز شود، همیشه از chrome استفاده شود، chrome پیشفرض شود، مرورگر پیشفرض، حذف safari، چگونه chrome را مرورگر پیشفرض کنم، مرورگر اصلی، پیشفرض کردن chrome، قرار دادن chrome بهعنوان مرورگر پیشفرض، چطور chrome مرورگر پیشفرضم باشد، باز کردن پیوندها در chrome، انتخاب chrome بهعنوان مرورگر پیشفرض، مرورگر اول، پاک کردن safari، جستجو در chrome، تنظیم chrome بهعنوان پیشفرض، تنظیم chrome بهعنوان مرورگر پیشفرض، مرورگر استاندارد، باز شدن پیوندها در chrome، پیشفرض شدن chrome، میخواهم chrome مرورگر پیشفرض باشد، chrome پیشفرض</translation> +<translation id="8189600756055704659">تغییر تنظیمات همگامسازی مرورگر chrome، تغییر همگامسازی chrome، ویرایش همگامسازی، ویرایش تنظیمات همگامسازی، مدیریت همگامسازی</translation> +<translation id="8307473667919507216">اجرای بررسی ایمنی chrome، اجرای بررسی ایمنی</translation> <translation id="8319253638505741466">بستن پنجره ناشناس، خروج از حالت ناشناس</translation> +<translation id="8350110529112037703">مدیریت گذرواژههای chrome، مشاهده گذرواژه در chrome</translation> +<translation id="9015559449837241926">ویژگیهای chrome، آشنایی با ویژگیهای google chrome، ویژگیهای جدید google chrome، دیدن نکتههای chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb index 1f7dd8c..ebe43a86d 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fi"> +<translation id="101606685846791463">tyhjennä selaimen välimuisti, tyhjennä historia, poista evästeet, poista selaushistoria</translation> +<translation id="132297926492792130">hallitse google tiliäni, korjaa google tili, ylläpidä google tiliä, ylläpidä google tiliäni</translation> +<translation id="1455865776268085776">siirry incognito tilaan, uusi incognito ikkuna, avaa incognito välilehti</translation> <translation id="1545931455576308147">jaa tämä sivu, jaa tämä välilehti</translation> <translation id="1912698329644085067">muuta chromen asetuksia, muuta asetuksia</translation> +<translation id="1938436187879863297">tee google keep muistiinpano, tee google muistiinpano, tee uusi google muistiinpano, uusi google-muistiinpano, aloita google muistiinpano</translation> <translation id="2003251155164817216">muokkaa chromen ulkoasua, tarkista chromen teemat</translation> +<translation id="2757458512261408467">luo google kalenterikutsu, luo google kalenteritapahtuma, luo uusi kalenteritapahtuma, uusi kalenteritapahtuma, uusi google kalenterikutsu</translation> +<translation id="2903767089701932453">chromen evästeasetukset, evästeiden käyttö, estä kaikki kolmannen osapuolen evästeet, ylläpidä evästeasetuksia, ylläpidä evästeitä</translation> +<translation id="2941773220794601465">käännä tämä sivu, käännä verkkosivu</translation> +<translation id="2973110773361184993">muokkaa sivustolupia, muuta lupia, hallitse sivustoasetuksia, ylläpidä sivustoasetuksia, sivustoasetukset chrome</translation> +<translation id="3371457011763794419">päivitä chrome, päivitä selain</translation> <translation id="3489247412199563299">muokkaa chromen esteettömyyttä, muuta esteettömyysasetuksia</translation> +<translation id="3936847108123063274">luo google sivusto, luo google verkkosivusto, uusi google sivusto, avaa uusi google sivusto</translation> +<translation id="4165988127016746956">luo google lomake, luo uusi google lomake, uusi google lomake, aloita google kysely</translation> <translation id="4367205929005172598">etsi kadonnut puhelin, etsi laitteeni</translation> <translation id="4692900934258103694">sisällä, varten, miten, tee, oma</translation> +<translation id="4834023075966161189">luo google dokumentti, luo uusi google dokumentti, avaa google dokumentti</translation> <translation id="4922709528022057939">chrome dino, dino-peli, pelaa dino run ‑peliä</translation> <translation id="5061612070235737664">muuta selaimen fonttia, chromen fontit</translation> +<translation id="6413237123574479071">ylläpidä maksutapoja, päivitä credit kortti</translation> <translation id="6654270263159958770">lisää Custom Search, ylläpidä hakukoneita, hakukoneet</translation> +<translation id="7081494400361697539">luo google taulukko, luo työtilataulukko, uusi google taulukko, aloita uusi google taulukko</translation> +<translation id="7153639895359139570">lisää osoite, muuta toimitusosoitetta, muokkaa osoitteita, ylläpidä osoitteita</translation> +<translation id="7242693601647412075">muuta tietoturva asetuksia</translation> +<translation id="7441773108452086364">vaihda gmail salasana, vaihda gmail salasanani, google salasanan vaihto, nollaa gmail tilin salasana</translation> <translation id="7660956169713698963">muokkaa chrome-käyttöjärjestelmän esteettömyyttä, muuta esteettömyysasetuksia</translation> <translation id="7700496593710078083">katso chrome-historia, katso selaushistoria</translation> <translation id="7739523284295786564">tarkista chromen lataukset, katso lataukset</translation> +<translation id="7873993277886791795">luo google dia, luo uusi esitys, uusi google esitys, aloita google esitys</translation> <translation id="7992725801741093524">muuta googlen yksityisyysasetuksia, huolehdi yksityisyydestä googlessa</translation> <translation id="8020024640114692614">avaa linkit aina chromessa, käytä aina chromea, chrome oletuksena, oletusselain, poista safari, miten chromesta tehdään oletusselain, pääselain, tee chromesta oletus, tee chromesta oletusselain, tee chromesta oletusselaimeni, avaa linkit chromessa, valitse chrome oletusselaimeksi, ensisijainen selain, hae chromessa, aseta chrome oletukseksi, aseta chrome oletusselaimeksi, vakioselain</translation> +<translation id="8189600756055704659">muuta chrome selaimen synkronointiasetuksia, muuta chromen synkronointia, muokkaa synkronointia, muokkaa synkronointiasetuksia, ylläpidä synkronointia</translation> +<translation id="8307473667919507216">tee chrome turvatarkistus, tee turvatarkistus</translation> <translation id="8319253638505741466">sulje incognito-ikkuna, lopeta incognito</translation> +<translation id="8350110529112037703">tarkista chromen salasanat, katso salasana chromessa</translation> +<translation id="9015559449837241926">chrome ominaisuudet, opettele google chromen ominaisuuksia, google chromen uudet ominaisuudet, katso chrome vinkkejä</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_gu.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_gu.xtb index 38ff23f..4b5c3dc 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_gu.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_gu.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="gu"> +<translation id="101606685846791463">બ્રાઉઝિંગ ઇતિહાસ સાફ કરવાની રીત, ઇતિહાસ કાઢી નાખો, કુકી કેવી રીતે ડિલીટ કરવા, કૅશ મેમરી સાફ કરવાની રીત, બ્રાઉઝર કેવી રીતે સાફ કરવું, બ્રાઉઝરનો ઇતિહાસ, બ્રાઉઝરની કૅશ મેમરી સાફ કરો</translation> +<translation id="132297926492792130">google એકાઉન્ટ ઠીક કરવાની રીત, હું મારુ google એકાઉન્ટ કેવી રીતે મેનેજ કરું, મારુ google એકાઉન્ટ મેનેજ કરો, google એકાઉન્ટ મેનેજ કરવું છે, મારુ google એકાઉન્ટ કંટ્રોલ કરવું છે, google એકાઉન્ટ સરખું કરવું છે</translation> +<translation id="1455865776268085776">છૂપો મોડ, નવી છૂપા મોડની વિન્ડો, છૂપો મોડ શરૂ કરો, છૂપો મોડ શરૂ કરવાની રીત, હું છૂપા મોડની વિન્ડો કેવી રીતે ખોલું, છૂપો ટૅબ, છૂપો ટેબ ખોલવાની રીત, નવી છૂપા મોડની વિંડો</translation> <translation id="1545931455576308147">આ પેજ શેર કરો, આ ટૅબ શેર કરો</translation> <translation id="1912698329644085067">chromeના સેટિંગમાં ફેરફાર કરો, સેટિંગ મેનેજ કરો</translation> +<translation id="1938436187879863297">google keepમાં નવી નોંધ બનાવો, google નોટ શરૂ કરવાની રીત, google નોંધ કેવી રીતે બનાવવી, google keep નોંધ બનાવો</translation> <translation id="2003251155164817216">chromeના દેખાવને કસ્ટમાઇઝ કરો, chromeની થીમને મેનેજ કરો</translation> +<translation id="2757458512261408467">નવી google કૅલેન્ડર ઇવેન્ટ, google કૅલેન્ડર ઇવેન્ટ માટે આમંત્રણ, કૅલેન્ડર ઇવેન્ટ માટે આમંત્રણ, google calendar ઈવેન્ટ બનાવો, નવી google Calendar ઈવેન્ટ બનાવવાની રીત, calendar ઈવેન્ટ માટે આમંત્રણ, નવી google કૅલેન્ડર ઇવેન્ટ, calendar ઈવેન્ટ માટે આમંત્રણ</translation> +<translation id="2903767089701932453">chrome કુકીનાં સેટિંગ, કુકી સેટિંગ મેનેજ કેવી રીતે કરવા, હું કુકી કેવી રીતે મેનેજ કરું, કુકીનો ઉપયોગ કેવી રીતે કરવો, ત્રીજા પક્ષની કુકીની મંજૂરી રદ્દ કરો, chromeમાં થર્ડ પાર્ટી કુકી સેટિંગ</translation> +<translation id="2941773220794601465">પેજનો અનુવાદ, વેેબપેજનું ભાષાંતર, આ વેેબપેજનો અનુવાદ કેવી રીતે કરવો, આ પેજનું ભાષાંતર કેવી રીતે કરવું, પેજનો અનુવાદ કરો</translation> +<translation id="2973110773361184993">સાઇટ સેટિંગ, chrome સાઇટ સેટિંગ, સાઇટ માટેની પરમિશન, પરવાનગીઓ ગોઠવો, સાઇટ સેટિંગનું નિયંત્રણ કરો, પરવાનગીઓ બદલો, સાઇટ સેટિંગ મેનેજ કરવાની રીત, હું chrome સેટિંગમાં પરવાનગીઓ કેવી રીતે મેનેજ કરું</translation> +<translation id="3371457011763794419">chromeને અપડેટ કરવાની રીત, બ્રાઉઝર કેવી રીતે અપડેટ કરવું, chrome અપડેટ, chrome બ્રાઉઝર અપડેટ, હું બ્રાઉઝર કેવી રીતે અપડેટ કરું, બ્રાઉઝર અપડેટ</translation> <translation id="3489247412199563299">chromeની ઍક્સેસિબિલિટીને કસ્ટમાઇઝ કરો, ઍક્સેસિબિલિટી સેટિંગ મેનેજ કરો</translation> +<translation id="3936847108123063274">google વેબસાઇટ, google વેબસાઇટ બનાવવાની રીત, નવી google વેબસાઇટ કેવી રીતે બનાવું, નવી google સાઇટ બનાવો, google સાઇટ, google સાઇટ બનાવવાની રીત, નવી google વેબસાઇટ ખોલો, હું નવી google સાઇટ કેવી રીતે ખોલું, નવી google સાઇટ, નવી google વેબસાઇટ બનાવો</translation> +<translation id="4165988127016746956">નવું google ફોર્મ, google સર્વેક્ષણ શરૂ કરવાની રીત, google ફોર્મ કેવી રીતે બનાવવું, હું google સર્વે કેવી રીતે શરૂ કરું, google ફોર્મ બનાવો</translation> <translation id="4367205929005172598">ખોવાયેલો ફોન શોધો, find my device</translation> <translation id="4692900934258103694">અંદર, ની અંદર, માટે, કેવી રીતે, તે, એક, કરો, માં, મારું, પર, માટે, એક, મને</translation> +<translation id="4834023075966161189">google દસ્તાવેજ, google doc, google docsમાં બનાવેલો દસ્તાવેજ ખોલો, નવો google દસ્તાવેજ બનાવો, google દસ્તાવેજ બનાવવાની રીત, હું google doc કેવી રીતે બનાવું, google docsમાં નવો દસ્તાવેજ બનાવો</translation> <translation id="4922709528022057939">chrome dino, dino ગેમ, dino run રમો</translation> <translation id="5061612070235737664">બ્રાઉઝરના ફૉન્ટમાં ફેરફાર કરો, chromeના ફૉન્ટ</translation> +<translation id="6413237123574479071">ચુકવણી પદ્ધતિ, ચુકવણી પદ્ધતિઓ કેવી રીતે મેનેજ કરવી, ક્રેડિટ કાર્ડ અપડેટ કરવાની રીત, ચુકવણી પદ્ધતિ મેનેજ કરો, ક્રેડિટ કાર્ડ કેવી રીતે અપડેટ કરવું</translation> <translation id="6654270263159958770">કસ્ટમ શોધ ઉમેરો, શોધ એન્જિન મેનેજ કરો, શોધ એન્જિન</translation> +<translation id="7081494400361697539">સ્પ્રેડશીટ બનાવો, google sheet બનાવવાની રીત, નવી google શીટ કેવી રીતે બનાવું, નવી google શીટ શરૂ કરવાની રીત, કાર્યસ્થળ માટે સ્પ્રેડશીટ કેવી રીતે બનાવવી</translation> +<translation id="7153639895359139570">સરનામું બદલો, સરનામામાં ફેરફાર કરો, વિતરણ માટેનું સરનામું બદલો, શિપિંગ માટેનું એડ્રેસ મેનેજ કરો, સરનામું મનેજ કરવાની રીત, સરનામું કેવી રીતે ઉમેરવું</translation> +<translation id="7242693601647412075">સુરક્ષા સેટિંગ મેનેજ કરો, સુરક્ષા સેટિંગ મેનેજ કરવાની રીત, સુરક્ષા સેટિંગ કેવી રીતે મેનજ કરવા, સુરક્ષા સેટિંગ, સિક્યુરિટી સેટિંગ</translation> +<translation id="7441773108452086364">gmail પાસવર્ડ બદલવાની રીત, મારો gmail પાસવર્ડ બદલો, google પાસવર્ડ કેવી રીતે બદલવો, gmail એકાઉન્ટનો પાસવર્ડ રીસેટ, હું મારો google એકાઉન્ટ પાસવર્ડ કેવી રીતે બદલું</translation> <translation id="7660956169713698963">chromeosની ઍક્સેસિબિલિટીને કસ્ટમાઇઝ કરો, ઍક્સેસિબિલિટી સેટિંગ મેનેજ કરો</translation> <translation id="7700496593710078083">chrome ઇતિહાસ જુઓ, બ્રાઉઝિંગ ઇતિહાસ જુઓ</translation> <translation id="7739523284295786564">chrome ડાઉનલોડ મેનેજ કરો, ડાઉનલોડ જુઓ</translation> +<translation id="7873993277886791795">સ્લાઇડ, google સ્લાઇડ બનાવવાની રીત, google સ્લાઇડ, નવું ડેક, નવું ડેક બનાવવાની રીત, હું નવું ડેક કેવી રીતે બનાવું? google પ્રેઝન્ટેશન કેવી રીતે શરૂ કરવું, નવું પ્રેઝન્ટેશન, google પ્રેઝન્ટેશન, google preso કેવી રીતે શરૂ કરું, google preso શરૂ કરવાની રીત, google preso, google પ્રેસો</translation> <translation id="7992725801741093524">google પ્રાઇવસી સેટિંગમાં ફેરફાર કરો, google પ્રાઇવસી મેનેજ કરો</translation> <translation id="8020024640114692614">લિંકને હંમેશાં chromeમાં ખોલો, હંમેશાં લિંક chromeમાં ખોલો, લિંકને કાયમ chromeમાં ખોલો, હંમેશાં chromeનો ઉપયોગ કરો, કાયમ chromeનો ઉપયોગ કરો, હંમેશાં chrome વાપરો, chrome ડિફૉલ્ટ તરીકે, ડિફૉલ્ટ તરીકે chrome, chrome ડિફૉલ્ટના રૂપમાં, ડિફૉલ્ટ બ્રાઉઝર, ડિફૉલ્ટ તરીકે વપરાતું બ્રાઉઝર, ડિફૉલ્ટ તરીકે ઉપયોગમાં લેવાતું બ્રાઉઝર, safari ડિલીટ કરો, safariને ડિલીટ કરો, ડિલીટ કરો safariને, chromeને ડિફૉલ્ટ બ્રાઉઝર કેવી રીતે બનાવવું, chromeને ડિફૉલ્ટ બ્રાઉઝર બનાવવાની રીત, chromeને ડિફૉલ્ટ બ્રાઉઝર કઈ રીતે બનાવવું, મુખ્ય બ્રાઉઝર, ખાસ બ્રાઉઝર, મુખ્ય મનાતું બ્રાઉઝર, chromeને ડિફૉલ્ટ બનાવો, ડિફૉલ્ટ chromeને બનાવો, chromeને ડિફૉલ્ટ તરીકે પસંદ કરો, chromeને ડિફૉલ્ટ બ્રાઉઝર બનાવો, ડિફૉલ્ટ બ્રાઉઝર chromeને બનાવો, chromeને ડિફૉલ્ટ બ્રાઉઝર તરીકે પસંદ કરો, chromeને મારું ડિફૉલ્ટ બ્રાઉઝર બનાવો, મારું ડિફૉલ્ટ બ્રાઉઝર chromeને બનાવો, chromeને મારા ડિફૉલ્ટ બ્રાઉઝર તરીકે પસંદ કરો, chromeમાં લિંક ખોલો, લિંકને chromeમાં ખોલો, લિંક chromeમાં ખોલો, chromeને ડિફૉલ્ટ બ્રાઉઝર તરીકે પસંદ કરો, ડિફૉલ્ટ બ્રાઉઝર તરીકે chromeને પસંદ કરો, ડિફૉલ્ટ બ્રાઉઝર તરીકે chromeની પસંદગી કરો, પ્રાથમિક બ્રાઉઝર, પ્રાથમિકતા ધરાવતું બ્રાઉઝર, મૂળ બ્રાઉઝર, safari કાઢી નાખો, safariને કાઢી નાખો, safariને કાઢો, chromeમાં શોધો, chromeની અંદર શોધો, chromeમાં શોધી જુઓ, chromeને ડિફૉલ્ટ તરીકે સેટ કરો, ડિફૉલ્ટ તરીકે chromeને સેટ કરો, chromeને ડિફૉલ્ટ તરીકે સેટ કરી જુઓ, chromeને ડિફૉલ્ટ બ્રાઉઝર તરીકે સેટ કરો, ડિફૉલ્ટ બ્રાઉઝર તરીકે chromeને સેટ કરો, chromeને ડિફૉલ્ટ બ્રાઉઝર તરીકે સેટ કરી જુઓ, માનક બ્રાઉઝર, માનક ગણાતું બ્રાઉઝર, માનક મનાતું બ્રાઉઝર</translation> +<translation id="8189600756055704659">chrome સિંક મેનેજ કરો, chrome સિંકનું સેટિંગ બદલો, chrome બ્રાઉઝરમાં સિંક કેવી રીતે બદલવું, સિંકમાં ફેરફાર કરો, સિંક સેટિંગમાં ફેરફાર કરવાની રીત, હું સિંક કેવી રીતે મેનેજ કરું</translation> +<translation id="8307473667919507216">chromeની સલામતી માટે તપાસ, મારે chromeની સલામતી માટે તપાસ કરવી છે, chromeની સલામતી માટે તપાસ કરવાની રીત, chromeની સલામતી ચેક કરો, chrome સેફટી ચેક, chrome સલામતી ચેક કેવી રીતે કરવી</translation> <translation id="8319253638505741466">છૂપી વિન્ડો બંધ કરો, છૂપો મોડ બંધ કરો</translation> +<translation id="8350110529112037703">chrome પાસવર્ડ, chrome પાસવર્ડ કેવી રીતે મેનેજ કરવો, chrome પાસવર્ડ મેનેજ કરવાની રીત, હું chromeમાં પાસવર્ડ કેવી રીતે મેનેજ કરું</translation> +<translation id="9015559449837241926">google chrome સુવિધાઓ, chromeની ટિપ, chrome સુવિધા, google chromeના નવા ફિચર્સ, google chromeની સુવિધાઓ વિશે કેવી રીતે જાણવું, chrome ટીપ્સ, chromeની સુવિધાઓ વિશે જાણવાની રીત</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_he.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_he.xtb index d7108121..db6fd176 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_he.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_he.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="he"> +<translation id="101606685846791463">ניקוי מטמון של הדפדפן, ניקוי ההיסטוריה, מחיקת קובצי cookie, מחיקת היסטוריית הגלישה, איך למחוק עוגיות, מחיקה קוקיז, מחיקת קש, איך למחוק היסטוריה</translation> +<translation id="132297926492792130">ניהול חשבון Google שלי, תיקון חשבון Google, ניהול חשבון גוגל, ניהול חשבון גוגל שלי, שליטה בחשבון גוגל, תיקון בחשבון גוגל, ניהול של חשבון google, איך לנהל את חשבון גוגל, איך מנהלים חשבון גוגל</translation> +<translation id="1455865776268085776">כניסה למצב פרטי, חלון פרטי חדש, פתיחת כרטיסייה פרטית, חלון אינקוגניטו, מצב אינקוגניטו, מעבר למצב פרטי, גלישה פרטית, גלישה אנונימית, חלון אנונימי חדש</translation> <translation id="1545931455576308147">שיתוף הדף הזה, שיתוף הכרטיסייה הזו</translation> <translation id="1912698329644085067">שינוי הגדרות chrome, ניהול ההגדרות</translation> +<translation id="1938436187879863297">יצירה הערה ב-Google Keep, יצירת הערה ב-Google, יצירת הערה חדשה ב-Google Keep, יצירת הערה חדשה ב-Google, התחלת הערה Google, הערת google keep חדשה, גוגל קיפ חדש, איך יוצרים הערה חדשה גוגל, איך לפתוח גוגל נוט, גוגל נוט חדש</translation> <translation id="2003251155164817216">התאמה אישית למראה של chrome, התאמה אישית לתצוגת כרום, ניהול עיצובי chrome, ניהול עיצובים בכרום</translation> +<translation id="2757458512261408467">יצירה של הזמנה ביומן Google, יצירת אירוע ביומן Google, יצירת הזמנה חדשה ביומן, אירוע יומן חדש, הזמנה חדשה יומן Google, יצירת הזמנה ביומן גוגל, אירוע חדש ביומן, גוגל יומן יצירת הזמנה, הזמנה חדשה גוגל קלנדר, פתיחת אירוע ביומן google, איך יוצרים הזמנה ביומן</translation> +<translation id="2903767089701932453">הגדרות קובצי cookie של Chrome, קובצי cookie, איסור על כל קובצי cookie של צד שלישי, ניהול ההגדרות של קובצי cookie, ניהול קובצי cookie, ניהול לקוקיז, שימוש בקובץ קוקי כרום, איך לבטל cookies של צד שלישי, איך לנהל cookies, הגדרות קוקי chrome</translation> +<translation id="2941773220794601465">תרגום הדף הזה, תרגום דף אינטרנט, תרגום דף, איך לתרגם את הדף, תרגום דף נוכחי, איך מתרגמים את הדף</translation> +<translation id="2973110773361184993">שינוי הרשאות לאתרים, שינוי הרשאות, שליטה בהגדרות האתר, ניהול הגדרות אתר, הגדרות אתרים chrome, איך לשנות הרשאות אתר, ניהול הגדרת אתר, הגדרות אתר בכרום, כרום להגדיר אתר, איך מגדירים אתרים, להגדיר אתר Chrome</translation> +<translation id="3371457011763794419">עדכון Chrome, שדרוג דפדפן, עדכון כרום, עדכון גרסה לכרום, שדרוג chrome, שדרוג גרסה דפדפן, איך לעדכן את הדפדפן, איך משדרגים את כרום</translation> <translation id="3489247412199563299">התאמה אישית לנגישות של chrome, ניהול הגדרות הנגישות, ניהול ההגדרות בנושא נגישות</translation> +<translation id="3936847108123063274">יצירה של אתר google, יצירת אתר google, אתר google חדש, פתיחת אתר google חדש, יצירת אתר ב-Google Sites, אתר גוגל חדש, יצירת אתר בגוגל, פתיחה אתר חדש בגוגל</translation> +<translation id="4165988127016746956">יצירה של טופס ב-google, יצירת טופס חדש ב-Google Forms, טופס חדש google, התחלת סקר Google Surveys, טופס גוגל חדש, גוגל פורם חדש, איך לפתוח גוגל סקר, איך יוצרים טופס גוגל</translation> <translation id="4367205929005172598">חיפוש טלפון אבוד, חיפוש טלפון שאבד, איפה המכשיר שלי</translation> <translation id="4692900934258103694">בתוך, במסגרת, עבור, איך, ה-, לעשות, ב-, שלי, על, ל-, אני</translation> +<translation id="4834023075966161189">יצירה של מסמך Google Docs, יצירת מסמך Google חדש, פתיחת מסמך Google, יצירת מסמך גוגל, מסמך חדש של גוגל, איך לפתוח מסמך חדש בגוגל, יצירה גוגל דוק</translation> <translation id="4922709528022057939">chrome dino, משחק dino, משחק dino run</translation> <translation id="5061612070235737664">שינוי הגופן בדפדפן, גופנים של chrome</translation> +<translation id="6413237123574479071">ניהול אמצעי תשלום, עדכון כרטיס האשראי, איך לעדכן כרטיס, לנהל שיטת תשלום, איך מעדכנים כרטיס אשראי, עדכון כרטיס תשלום</translation> <translation id="6654270263159958770">הוספת חיפוש בהתאמה אישית, ניהול מנועי חיפוש, מנועי חיפוש</translation> +<translation id="7081494400361697539">יצירה של גיליון Google, יצירת גיליון אלקטרוני ב-Workspace, גיליון אלקטרוני חדש ב-Google Sheets, התחלת גיליון חדש ב-Google Sheets, גיליון גוגל חדש, גליון חדש בגוגל, google sheet חדש, גוגל שיטס גליון חדש, איך ליצור גיליון חדש גוגל</translation> +<translation id="7153639895359139570">הוספת כתובת, שינוי כתובת למשלוח, עריכת כתובות, ניהול כתובות, שינוי כתובת, איך מוסיפים כתובת, להוסיף כתובת, כתובת חדשה</translation> +<translation id="7242693601647412075">ניהול של הגדרות האבטחה, ניהול הגדרות בטיחות, איך לנהל את הגדרות האבטחה, לנהל הגדרות אבטחה, הגדרות אבטחה בכרום</translation> +<translation id="7441773108452086364">שינוי הסיסמה ל-Gmail, שינוי הסיסמה שלי ל-Gmail, שינוי הסיסמה ל-google, איפוס סיסמה חשבון Gmail, שינוי סיסמה ג'ימייל, גוגל לשנות סיסמה, איך משנים סיסמאות גוגל, איפוס סיסמה gmail</translation> <translation id="7660956169713698963">התאמה אישית לנגישות של chrome os, ניהול הגדרות הנגישות, ניהול ההגדרות בנושא נגישות</translation> <translation id="7700496593710078083">הצגת ההיסטוריה של chrome, הצגת היסטוריית הגלישה, צפייה בהיסטוריית הגלישה</translation> <translation id="7739523284295786564">ניהול הורדות chrome, ניהול ההורדות בכרום, הצגת ההורדות, צפייה בהורדות</translation> +<translation id="7873993277886791795">יצירה של מצגת ב-Google, יצירת מצגת גוגל, יצירת מצגת חדשה, מצגת חדשה ב-Google, התחלת מצגת Google, פתיחת מצגת חדשה, מצגת גוגל חדשה</translation> <translation id="7992725801741093524">שינוי הגדרות הפרטיות של google, ניהול הפרטיות של google</translation> <translation id="8020024640114692614">תמיד לפתוח לינקים בכרום, תמיד לפתוח לינקים בchrome, תמיד לפתוח לינקים ב-chrome, תמיד לפתוח קישורים בכרום, תמיד לפתוח קישורים בchrome, תמיד לפתוח קישורים ב-chrome, תמיד להשתמש בכרום, תמיד להשתמש בchrome, תמיד להשתמש ב-chrome, להשתמש תמיד בכרום, להשתמש תמיד בchrome, להשתמש תמיד ב-chrome, כרום ברירת מחדל, chrome ברירת מחדל, דפדפן ברירת מחדל, למחוק את ספארי, למחוק את safari, איך להפוך את כרום לדפדפן ברירת מחדל, איך להפוך את chrome לדפדפן ברירת מחדל, דפדפן ראשי, להפוך את כרום לברירת מחדל, להפוך את chrome לברירת מחדל, להפוך את כרום לדפדפן ברירת מחדל, להפוך את chrome לדפדפן ברירת מחדל, לפתוח לינקים בכרום, לפתוח לינקים בchrome, לפתוח לינקים ב-chrome, לפתוח קישורים בכרום, לפתוח קישורים בchrome, לפתוח קישורים ב-chrome, להסיר את ספארי, להסיר את safari, להגדיר את כרום כברירת מחדל, להגדיר את chrome כברירת מחדל, להגדיר את כרום כדפדפן ברירת מחדל, להגדיר את chrome כדפדפן ברירת מחדל, דפדפן עיקרי</translation> +<translation id="8189600756055704659">שינוי הגדרות הסנכרון של דפדפן chrome, שינוי הסנכרון של Chrome, עריכת הסנכרון, עריכת הגדרות סנכרון, ניהול סנכרון, שינוי סנכרון, הגדרות סנכרון כרום, איך להגדיר סנכרון בכרום, סנכרון chrome, איך לסנכרן כרום</translation> +<translation id="8307473667919507216">הרצת בדיקת אבטחה ב-Chrome, בדיקת בטיחות chrome, הרצת בדיקת אבטחה, הפעלה של בדיקת אבטחה, הפעלת בדיקת אבטחה בכרום, בדיקת האבטחה כרום, פתיחת בדיקת אבטחה בכרום, איך להריץ בדיקת אבטחה</translation> <translation id="8319253638505741466">סגירת חלון פרטי, סיום גלישה פרטית</translation> +<translation id="8350110529112037703">ניהול סיסמאות ב-Chrome, הצגת הסיסמה ב-Chrome, ניהול סיסמה בכרום, ניהול סיסמאות כרום, איך מנהלים סיסמאות כרום, לראות סיסמה chrome, כרום סיסמאות, איך לראות סיסמאות כרום</translation> +<translation id="9015559449837241926">תכונות של Chrome, מידע על התכונות של Google Chrome, תכונות חדשות google chrome, טיפים ל-Chrome, פיצ'רים בכרום, טיפים גוגל כרום, תכונות כרום, תכונות חדשות כרום גוגל, איך לקבל טיפים כרום</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb index 5cdc2f49..b59c946 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> +<translation id="101606685846791463">브라우저 캐시 지우기, 방문 기록 삭제, 쿠키 삭제, 방문 기록 삭제</translation> +<translation id="132297926492792130">Google 계정 관리, Google 계정 문제 해결, Google 계정 관리, 내 Google 계정 관리</translation> +<translation id="1455865776268085776">시크릿 모드 입력, 새 시크릿 창, 시크릿 탭 열기</translation> <translation id="1545931455576308147">이 페이지 공유, 이 탭 공유</translation> <translation id="1912698329644085067">chrome 설정 변경, 크롬 설정 변경, 설정 관리, 설정 변경</translation> +<translation id="1938436187879863297">Google Keep 메모 만들기, Google 메모 만들기, 새 Google Keep 메모 만들기, 새 Google 메모, Google 메모 시작</translation> <translation id="2003251155164817216">chrome 모양 맞춤설정, chrome 모양 설정, 크롬 모양 맞춤설정, 크롬 모양 설정, chrome 테마 관리, 크롬 테마 관리, 크롬 배경, chrome 배경, chrome 배경화면, 크롬 배경화면, chrome 배경 설정, 크롬 배경 설정, chrome 배경 관리, 크롬 배경 관리</translation> +<translation id="2757458512261408467">Google Calendar 초대 만들기, Google Calendar 일정 만들기, 새 캘린더 초대 만들기, 새 캘린더 일정, 새 Google Calendar 초대</translation> +<translation id="2903767089701932453">Chrome 쿠키 설정, 쿠키 사용, 서드 파티 쿠키 모두 차단, 쿠키 설정 관리, 쿠키 관리</translation> +<translation id="2941773220794601465">이 페이지 번역, 웹페이지 번역</translation> +<translation id="2973110773361184993">사이트 권한 조정, 권한 변경, 사이트 설정 제어, 사이트 설정 관리, 사이트 설정 Chrome</translation> +<translation id="3371457011763794419">Chrome 업데이트, 브라우저 업그레이드</translation> <translation id="3489247412199563299">chrome 접근성 맞춤설정, chrome 접근성 설정, 크롬 접근성 맞춤설정, 크롬 접근성 설정, 접근성 설정 관리</translation> +<translation id="3936847108123063274">Google 사이트 만들기, Google 웹사이트 만들기, 새 Google 사이트, 새 Google 사이트 열기</translation> +<translation id="4165988127016746956">Google 양식 만들기, 새 Google 양식 만들기, 새 Google 양식, Google 설문조사 시작</translation> <translation id="4367205929005172598">분실 휴대전화 찾기, 내 기기 찾기, 잃어버린 폰 찾기, 잃어버린 휴대전화 찾기, 잃어버린 휴대폰 찾기, 내 핸드폰 찾기, 내 폰 찾기, 분실 폰 찾기, 폰 찾기, 내 폰 찾기, 분실한 폰 찾기</translation> <translation id="4692900934258103694">안쪽, 안, 의, 어떻게, 그, 하다, 에, 내, 위, 로</translation> +<translation id="4834023075966161189">Google 문서 만들기, 새 Google 문서 만들기, Google 문서 열기</translation> <translation id="4922709528022057939">chrome 공룡 게임, 공룡 게임, 공룡 게임 플레이, 크롬 공룡 게임, chrome 다이노 게임, 다이노 게임, 다이노 게임 플레이, 크롬 다이노 게임</translation> <translation id="5061612070235737664">브라우저 글꼴 변경, chrome 글꼴, 크롬 글꼴, 크롬 글꼴 바꾸기, chrome 글꼴 바꾸기, 폰트 바꾸기, 크롬 폰트 바꾸기, chrome 폰트 바꾸기, 브라우저 폰트 바꾸기, 브라우저 글꼴 바꾸기, 폰트 변경, 브라우저 폰트 변경, 크롬 폰트, 크롬 폰트 변경, chrome 폰트 변경</translation> +<translation id="6413237123574479071">결제 수단 관리, 신용카드 업데이트</translation> <translation id="6654270263159958770">맞춤검색 추가, 검색엔진 관리, 검색엔진</translation> +<translation id="7081494400361697539">Google 시트 만들기, 작업공간 스프레드시트 만들기, 새 Google 시트, 새 Google 시트 시작</translation> +<translation id="7153639895359139570">주소 추가, 배송지 주소 변경, 주소 수정, 주소 관리</translation> +<translation id="7242693601647412075">보안 설정 관리</translation> +<translation id="7441773108452086364">Gmail 비밀번호 변경, 내 Gmail 비밀번호 변경, Google 비밀번호 변경, Gmail 계정 비밀번호 재설정</translation> <translation id="7660956169713698963">Chromeos 접근성 맞춤설정, Chromeos 접근성 설정, 크롬os 접근성 맞춤설정, 크롬os 접근성 설정, 접근성 설정 관리, 접근성 설정, 크롬 접근성 설정</translation> <translation id="7700496593710078083">chrome 방문 기록 보기, 크롬 방문 기록 보기, 방문 기록 보기, 웹 방문 기록, 크롬 방문 기록</translation> <translation id="7739523284295786564">chrome 다운로드 관리, 크롬 다운로드 관리, 다운로드 보기</translation> +<translation id="7873993277886791795">Google 슬라이드 만들기, 새 자료 만들기, 새 Google 프레젠테이션, Google 프레젠테이션 시작</translation> <translation id="7992725801741093524">google 개인 정보 보호 설정 변경, google 개인 정보 보호 관리, 구글 개인 정보 보호 설정 변경, 구글 개인 정보 보호 관리, 구글 프라이버시 설정 변경, 구글 프라이버시 관리, 내 개인정보 보호 설정, 내 개인 정보 보호 설정, 개인 정보 보호 설정, 개인정보 보호 설정</translation> <translation id="8020024640114692614">항상 chrome에서 링크 열기, 항상 chrome 사용, chrome을 기본으로, 기본 브라우저, safari 삭제, chrome을 기본 브라우저로 지정하는 방법, 메인 브라우저, chrome을 기본으로, chrome을 기본 브라우저로 지정, chrome을 내 기본 브라우저로 지정, chrome에서 링크 열기, chrome을 기본 브라우저로 선택, 주 브라우저, safari 제거, chrome에서 검색, chrome을 기본으로 설정, chrome을 기본 브라우저로 설정, 표준 브라우저, chrome을 기본값으로 설정, 항상 chrome으로 링크 열기, 항상 크롬에서 링크 열기, 항상 크롬 사용, 크롬을 기본으로, 크롬을 기본 브라우저로 지정하는 방법, 크롬을 기본으로, 크롬을 기본 브라우저로 지정, 크롬을 내 기본 브라우저로 지정, 크롬에서 링크 열기, 크롬을 기본 브라우저로 선택, 크롬에서 검색, 크롬을 기본으로 설정, 크롬을 기본 브라우저로 설정, 크롬을 기본값으로 설정, 항상 크롬으로 링크 열기</translation> +<translation id="8189600756055704659">Chrome 브라우저 동기화 설정 변경, Chrome 동기화 변경, 동기화 수정, 동기화 설정 수정, 동기화 관리</translation> +<translation id="8307473667919507216">Chrome 안전 확인 실행, 안전 확인 실행</translation> <translation id="8319253638505741466">시크릿 창 닫기, 시크릿 모드 종료, 시크릿 모드 닫기</translation> +<translation id="8350110529112037703">Chrome 비밀번호 관리, Chrome에서 비밀번호 보기</translation> +<translation id="9015559449837241926">Chrome 기능, Chrome 기능 알아보기, 새 Chrome 기능, Chrome 도움말 보기</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb index 52fd2b1..4011a33 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="101606685846791463">išvalyti naršyklės talpyklą, naršyklės talpyklos valymas, išvalyti istoriją, istorijos valymas, ištrinti slapukus, slapukų trynimas, ištrinti naršymo istoriją, naršymo istorijos trynimas</translation> +<translation id="132297926492792130">valdyti „Google“ paskyrą, „Google“ paskyros valdymas, tvarkyti „Google“ paskyrą, „Google“ paskyros tvarkymas</translation> +<translation id="1455865776268085776">atidaryti inkognito režimą, naujas inkognito langas, atidaryti inkognito skirtuką</translation> <translation id="1545931455576308147">bendrinti šį puslapį, bendrinti šį skirtuką, puslapio bendrinimas, skirtuko bendrinimas, bendrinti puslapį, bendrinti skirtuką</translation> <translation id="1912698329644085067">keisti chrome nustatymus, tvarkyti nustatymus, valdyti nustatymus</translation> +<translation id="1938436187879863297">kurti „Google Keep“ užrašą, „Google Keep“ užrašo kūrimas, kurti „Google“ užrašą, „Google“ užrašo kūrimas, kurti naują „Google Keep“ užrašą, naujo „Google Keep“ užrašo kūrimas, naujas „Google“ užrašas, pradėti „Google“ užrašą</translation> <translation id="2003251155164817216">tinkinti chrome išvaizdą, valdyti chrome temas, keisti chrome išvaizdą, keisti chrome temas, keisti chrome temą</translation> +<translation id="2757458512261408467">kurti „Google“ kalendoriaus kvietimą, „Google“ kalendoriaus kvietimo kūrimas, kurti „Google“ kalendoriaus įvykį, „Google“ kalendoriaus įvykio kūrimas, kurti naują Kalendoriaus kvietimą, naujo Kalendoriaus kvietimo kūrimas, naujas Kalendoriaus įvykis, naujas „Google“ kalendoriaus kvietimas</translation> +<translation id="2903767089701932453">„Chrome“ slapukų nustatymai, naudoti slapukus, slapukų naudojimas, neleisti visų trečiųjų šalių slapukų, tvarkyti slapukų nustatymus, slapukų nustatymų tvarkymas, tvarkyti slapukus, slapukų tvarkymas</translation> +<translation id="2941773220794601465">versti šį puslapį, šio puslapio vertimas, versti tinklalapį, tinklalapio vertimas</translation> +<translation id="2973110773361184993">koreguoti svetainės leidimus, koreguoti svetainių leidimus, svetainės leidimų koregavimas, keisti leidimus, leidimų keitimas, svetainės nustatymų valdymas, valdyti svetainės nustatymus, tvarkyti svetainės nustatymus, svetainės nustatymų tvarkymas, svetainės nustatymai naršyklėje „Chrome“, „Chrome“ svetainės nustatymai</translation> +<translation id="3371457011763794419">atnaujinti „Chrome“, „Chrome“ atnaujinimas, atnaujinti naršyklę, naršyklės atnaujinimas</translation> <translation id="3489247412199563299">tvarkyti chrome pritaikomumą, valdyti chrome pritaikomumą, tvarkyti pritaikomumo nustatymus, valdyti pritaikomumo nustatymus, keisti pritaikomumo nustatymus</translation> +<translation id="3936847108123063274">kurti „Google“ svetainę, „Google“ svetainės kūrimas, nauja „Google“ svetainė, atidaryti naują „Google“ svetainę</translation> +<translation id="4165988127016746956">kurti „Google“ formą, „Google“ formos kūrimas, kurti naują „Google“ formą, naujos „Google“ formos kūrimas, nauja „Google“ forma, pradėti „Google“ apklausą, „Google“ apklausos pradžia</translation> <translation id="4367205929005172598">rasti pamestą telefoną, rasti įrenginį, rasti telefoną, ieškoti pamesto telefono, ieškoti įrenginio</translation> <translation id="4692900934258103694">viduje, per, už, kaip, atlikti, mano, ant, į</translation> +<translation id="4834023075966161189">kurti „Google“ dokumentą, „Google“ dokumento kūrimas, kurti naują „Google“ dokumentą, naujo „Google“ dokumento kūrimas, atidaryti „Google“ dokumentą, „Google“ dokumento atidarymas</translation> <translation id="4922709528022057939">chrome dinozauras, dinozauro žaidimas, žaisti dino run, žaisti dinozaurą</translation> <translation id="5061612070235737664">keisti naršyklės šriftą, chrome šriftai, pakeisti naršyklės šriftą</translation> +<translation id="6413237123574479071">tvarkyti mokėjimo metodus, mokėjimo metodų tvarkymas, atnaujinti kredito kortelę, kredito kortelės atnaujinimas</translation> <translation id="6654270263159958770">pridėti tinkintą paiešką, tvarkyti paieškos variklius, valdyti paieškos variklius, paieškos varikliai, tvarkyti paiešką, valdyti paiešką</translation> +<translation id="7081494400361697539">kurti „Google“ skaičiuoklę, „Google“ skaičiuoklės kūrimas, kurti „Workspace“ skaičiuoklę, „Workspace“ skaičiuoklės kūrimas, nauja „Google“ skaičiuoklė, pradėti naują „Google“ skaičiuoklę</translation> +<translation id="7153639895359139570">pridėti adresą, adreso pridėjimas, keisti pristatymo adresą, pristatymo adreso keitimas, redaguoti adresus, redaguoti adresą, tvarkyti adresus, tvarkyti adresą, adresų tvarkymas</translation> +<translation id="7242693601647412075">tvarkyti saugos nustatymus, saugos nustatymų tvarkymas</translation> +<translation id="7441773108452086364">keisti „Gmail“ slaptažodį, „Gmail“ slaptažodžio keitimas, pakeisti mano „Gmail“ slaptažodį, „Google“ slaptažodžio keitimas, keisti „Google“ slaptažodį, nustatyti „Gmail“ paskyros slaptažodį iš naujo, iš naujo nustatyti „Gmail“ paskyros slaptažodį, „Gmail“ paskyros slaptažodžio nustatymas iš naujo</translation> <translation id="7660956169713698963">tinkinti chromeos pritaikomumą, tvarkyti pritaikomumo nustatymus, valdyti pritaikomumo nustatymus, keisti pritaikomumo nustatymus, tvarkyti chrome os pritaikomumo nustatymus, valdyti chrome os pritaikomumo nustatymus, keisti chrome os pritaikomumo nustatymus</translation> <translation id="7700496593710078083">peržiūrėti chrome istoriją, peržiūrėti naršymo istoriją, rasti chrome istoriją, rasti naršymo istoriją</translation> <translation id="7739523284295786564">tvarkyti chrome atsisiuntimus, tvarkyti atsisiuntimus, valdyti atsisiuntimus, peržiūrėti atsisiuntimus</translation> +<translation id="7873993277886791795">kurti „Google“ skaidrę, „Google“ skaidrių kūrimas, kurti naują skaidrių demonstraciją, naujos skaidrių demonstracijos kūrimas, naujas „Google“ pristatymas, pradėti „Google“ prezentaciją</translation> <translation id="7992725801741093524">keisti google privatumo nustatymus, tvarkyti google privatumą, valdyti google privatumą</translation> <translation id="8020024640114692614">visada atidaryti nuorodas chrome, visada naudoti chrome, chrome kaip numatytoji, numatytoji naršyklė, ištrinti safari, kaip nustatyti chrome numatytaja naršykle, pagrindinė naršyklė, nustatyti chrome kaip numatytąją, nustatyti chrome kaip numatytąją naršyklę, atidaryti nuorodas chrome, pasirinkti chrome kaip numatytąją naršyklę, pašalinti safari, ieškoti chrome, įprasta naršyklė</translation> +<translation id="8189600756055704659">keisti „Chrome“ naršyklės sinchronizavimo nustatymus, „Chrome“ naršyklės sinchronizavimo nustatymų keitimas, keisti „Chrome“ sinchronizavimą, „Chrome“ sinchronizavimo keitimas, redaguoti sinchronizavimą, sinchronizavimo redagavimas, redaguoti sinchronizavimo nustatymus, sinchronizavimo nustatymų redagavimas, tvarkyti sinchronizavimą, sinchronizavimo tvarkymas</translation> +<translation id="8307473667919507216">paleisti „Chrome“ saugos patikrą, „Chrome“ saugos patikros paleidimas, paleisti Saugos patikrą, Saugos patikros paleidimas</translation> <translation id="8319253638505741466">uždaryti inkognito langą, užbaigti inkognito, išeiti iš inkognito režimo, išeiti iš inkognito</translation> +<translation id="8350110529112037703">tvarkyti „Chrome“ slaptažodžius, „Chrome“ slaptažodžių tvarkymas, peržiūrėti slaptažodį „Chrome“, slaptažodžio peržiūra „Chrome“</translation> +<translation id="9015559449837241926">„Chrome“ funkcijos, „Chrome“ funkcija, sužinoti „Google Chrome“ funkcijas, informacija apie „Google Chrome“ funkcijas, naujos „Google Chrome“ funkcijos, nauja „Google Chrome“ funkcija, žiūrėti „Chrome“ patarimus, „Chrome“ patarimų peržiūra</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_pl.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_pl.xtb index ce24b769..8adde54 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_pl.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_pl.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> +<translation id="101606685846791463">wyczyść pamięć podręczną przeglądarki, wyczyść historię, usuń pliki cookie, usuń historię przeglądania</translation> +<translation id="132297926492792130">kontroluj moje konto Google, rozwiąż problemy z kontem Google, zarządzaj kontem Google, zarządzaj moim kontem Google</translation> +<translation id="1455865776268085776">wejdź w tryb incognito, nowe okno incognito, otwórz kartę incognito</translation> <translation id="1545931455576308147">udostępnij tę stronę, udostępnić tę stronę, udostępnij tę kartę, udostępnić tę kartę</translation> <translation id="1912698329644085067">zmień ustawienia chrome, zmienić ustawienia chrome, zmiana ustawień chrome, zmienianie ustawień chrome, zarządzaj ustawieniami, zarządzać ustawieniami, zarządzanie ustawieniami</translation> +<translation id="1938436187879863297">utwórz notatkę w Google Keep, utwórz notatkę Google, utwórz nową notatkę w Google Keep, nowa notatka Google, otwórz notatkę Google</translation> <translation id="2003251155164817216">dostosuj wygląd chrome, dostosować wygląd chrome, dostosowanie wyglądu chrome, dostosowywanie wyglądu chrome, zarządzaj motywami chrome, zarządzać motywami chrome, zarządzanie motywami chrome</translation> +<translation id="2757458512261408467">utwórz zaproszenie w Kalendarzu Google, utwórz wydarzenie w Kalendarzu Google, utwórz nowe zaproszenie w kalendarzu, nowe wydarzenie w kalendarzu, nowe zaproszenie w Kalendarzu Google</translation> +<translation id="2903767089701932453">ustawienia plików cookie w Chrome, używanie plików cookie, nie zezwalaj na wszystkie pliki cookie innych firm, zarządzaj ustawieniami plików cookie, zarządzaj plikami cookie</translation> +<translation id="2941773220794601465">przetłumacz tę stronę, przetłumacz stronę</translation> +<translation id="2973110773361184993">dostosuj uprawnienia witryny, zmień uprawnienia, kontroluj ustawienia witryny, zarządzaj ustawieniami witryny, ustawienia witryny w Chrome</translation> +<translation id="3371457011763794419">zaktualizuj Chrome, uaktualnij przeglądarkę</translation> <translation id="3489247412199563299">dostosuj ustawienia ułatwień dostępu w chrome, dostosowanie ustawień ułatwień dostępu w chrome, dostosować ustawienia ułatwień dostępu w chrome, zarządzać ustawieniami ułatwień dostępu w chrome, zarządzanie ustawieniami ułatwień dostępu w chrome, zarządzaj ustawieniami ułatwień dostępu w chrome</translation> +<translation id="3936847108123063274">utwórz stronę w Witrynach Google, utwórz stronę w Google, nowa strona w Witrynach Google, otwórz nową stronę w Witrynach Google</translation> +<translation id="4165988127016746956">utwórz formularz Google, utwórz nowy formularz Google, nowy formularz Google, otwórz Ankietę Google</translation> <translation id="4367205929005172598">znaleźć zgubiony telefon, znajdź zgubiony telefon, znaleźć moje urządzenie, znajdź moje urządzenie</translation> <translation id="4692900934258103694">w środku, wewnątrz, w, dla, jak, do, moje, na, do, ja</translation> +<translation id="4834023075966161189">utwórz dokument Google, utwórz nowy dokument Google, otwórz dokument Google</translation> <translation id="4922709528022057939">dinozaur w chrome, gra dino, gra dinozaur, gra w dinozaura, gra z dinozaurem, zagrać w dinozaura, grać w dinozaura, zagraj w grę z dinozaurem</translation> <translation id="5061612070235737664">zmień czcionkę przeglądarki, zmienić czcionkę przeglądarki, zmiana czcionki przeglądarki, zmienianie czcionki przeglądarki, czcionki chrome</translation> +<translation id="6413237123574479071">zarządzaj formami płatności, zaktualizuj kartę kredytową</translation> <translation id="6654270263159958770">dodaj niestandardową wyszukiwarkę, dodaj wyszukiwarkę niestandardową, dodać niestandardową wyszukiwarkę, dodać wyszukiwarkę niestandardową, zarządzanie wyszukiwarkami, zarządzaj wyszukiwarkami, wyszukiwarki</translation> +<translation id="7081494400361697539">utwórz arkusz Google, utwórz arkusz kalkulacyjny obszaru roboczego, nowy arkusz Google, otwórz nowy arkusz Google</translation> +<translation id="7153639895359139570">dodaj adres, zmień adres dostawy, edytuj adresy, zarządzaj adresami</translation> +<translation id="7242693601647412075">zarządzaj ustawieniami zabezpieczeń</translation> +<translation id="7441773108452086364">zmień hasło do Gmaila, zmień moje hasło do Gmaila, zmiana hasła do Google, zresetuj hasło do konta Gmail</translation> <translation id="7660956169713698963">dostosuj ułatwienia dostępu chrome os, dostosowanie ułatwień dostępu chrome os, dostosowywanie ułatwień dostępu chrome os, dostosuj ułatwienia dostępu systemu operacyjnego chrome, dostosowanie ułatwień dostępu systemu operacyjnego chrome, dostosowywanie ułatwień dostępu systemu operacyjnego chrome, zarządzanie ustawieniami ułatwień dostępu, zarządzaj ustawieniami ułatwień dostępu, zarządzać ustawieniami ułatwień dostępu</translation> <translation id="7700496593710078083">pokaż historię chrome, wyświetl historię chrome, wyświetlanie historii chrome, pokaż historię przeglądania, wyświetl historię przeglądania, wyświetlanie historii przeglądania</translation> <translation id="7739523284295786564">zarządzanie pobranymi plikami w chrome, zarządzanie pobieraniem w chrome, zarządzaj pobranymi plikami w chrome, zarządzaj pobieraniem w chrome, zarządzać pobieraniem w chrome, zarządzać pobranymi plikami w chrome, pokaż pobrane pliki, wyświetl pobrane pliki, zobacz pobrane pliki, zobaczyć pobrane pliki, pokazać pobrane pliki, wyświetlić pobrane pliki</translation> +<translation id="7873993277886791795">utwórz prezentację Google, utwórz nową prezentację, nowa prezentacja Google, otwórz prezentację Google</translation> <translation id="7992725801741093524">zmień ustawienia prywatności google, zmienić ustawienia prywatności google, zmiana ustawień prywatności google, zmienianie ustawień prywatności google, zmień ustawienia prywatności w google, zmienić ustawienia google dotyczące prywatności, zmiana ustawień google dotyczących prywatności, zmienianie ustawień google dotyczących prywatności, zarządzanie ustawieniami Google dotyczącymi prywatności</translation> <translation id="8020024640114692614">zawsze otwieraj linki w chrome, zawsze używaj chrome, używanie samego chrome, chcę zawsze używać chrome, chrome jako przeglądarka domyślna, przeglądarka domyślna, przegladarka domyslna, usuń safari, jak ustawić chrome jako przeglądarkę domyślną, główna przeglądarka, ustaw chrome jako domyślną przeglądarkę, ustaw chrome jako przeglądarkę domyślną, chrome przeglądarką domyślną, niech chrome będzie moją przeglądarką, otwieranie linków w chrome, otwieraj linki w chrome, wybierz chrome jako przeglądarkę domyślną, podstawowa przeglądarka, wykasuj safari, wyszukuj w chrome, skonfiguruj chrome jako przeglądarkę domyślną, skonfiguruj chrome jako domyślną przeglądarkę, standardowa przeglądarka, moja główna przeglądarka</translation> +<translation id="8189600756055704659">zmień ustawienia synchronizacji przeglądarki Chrome, zmień Synchronizację Chrome, edytuj synchronizację, edytuj ustawienia synchronizacji, zarządzaj synchronizacją</translation> +<translation id="8307473667919507216">uruchom kontrolę zabezpieczeń Chrome, uruchom kontrolę zabezpieczeń</translation> <translation id="8319253638505741466">zamknij okno incognito, zamknąć okno incognito, zakończ tryb incognito, zakończyć tryb incognito, wyjdź z trybu incognito, wyjść z trybu incognito</translation> +<translation id="8350110529112037703">zarządzaj hasłami w Chrome, wyświetl hasło w Chrome</translation> +<translation id="9015559449837241926">funkcje Chrome, poznaj funkcje Google Chrome, nowe funkcje Google Chrome, zobacz wskazówki dotyczące Chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb index 8ba10fd..99dda958 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sl"> +<translation id="101606685846791463">brisanje predpomnilnika brskalnika, čiščenje zgodovine, brisanje piškotkov, brisanje zgodovine brskanja</translation> +<translation id="132297926492792130">nadziranje mojega računa google, popravljanje računa google, upravljanje računa google, upravljanje mojega računa google</translation> +<translation id="1455865776268085776">odpri anonimni način, novo anonimno okno, odpiranje anonimnega zavihka</translation> <translation id="1545931455576308147">deljenje te strani, deljenje tega zavihka</translation> <translation id="1912698329644085067">spreminjanje chromovih nastavitev, upravljanje nastavitev</translation> +<translation id="1938436187879863297">ustvarjanje zapiska v googlu keep, ustvarjanje zapiska v googlu, ustvarjanje novega zapiska v googlu keep, nov zapisek v googlu, začetek zapiska v googlu</translation> <translation id="2003251155164817216">prilagajanje videza chroma, upravljanje tem za chrome</translation> +<translation id="2757458512261408467">ustvari povabilo za google koledar, ustvari dogodek v google koledarju, ustvari novo povabilo za koledar, nov dogodek v koledarju, novo povabilo za google koledar</translation> +<translation id="2903767089701932453">nastavitve piškotkov za chrome, uporaba piškotkov, onemogočanje vseh piškotkov drugih mest, upravljanje nastavitev piškotkov, upravljanje piškotkov</translation> +<translation id="2941773220794601465">prevajanje te strani, prevajanje spletne strani</translation> +<translation id="2973110773361184993">prilagajanje dovoljenj za spletno mesto, spreminjanje dovoljenj, nadziranje nastavitev spletnega mesta, upravljanje nastavitev spletnega mesta, nastavitve spletnih mest v chromu</translation> +<translation id="3371457011763794419">posodobitev chroma, nadgradnja brskalnika</translation> <translation id="3489247412199563299">prilagajanje funkcij za ljudi s posebnimi potrebami v chromu, upravljanje nastavitev funkcij za ljudi s posebnimi potrebami</translation> +<translation id="3936847108123063274">ustvarjanje googlovega spletnega mesta, ustvari googlovo spletno mesto, novo googlovo spletno mesto, odpiranje novega googlovega spletnega mesta</translation> +<translation id="4165988127016746956">ustvari google obrazec, ustvari nov google obrazec, nov google obrazec, zaženi google surveys</translation> <translation id="4367205929005172598">iskanje izgubljenega telefona, iskanje moje naprave</translation> <translation id="4692900934258103694">v, znotraj, za, kako, storiti, v, moj, na, do</translation> +<translation id="4834023075966161189">ustvarjanje google dokumenta, ustvarjanje novega dokumenta google, odpiranje google dokumenta</translation> <translation id="4922709528022057939">dino za chrome, igra dino, igraj dino run</translation> <translation id="5061612070235737664">spreminjanje pisave brskalnika, pisave v chromu</translation> +<translation id="6413237123574479071">upravljanje plačilnih sredstev, posodobitev kreditne kartice</translation> <translation id="6654270263159958770">dodajanje iskanja po meri, upravljanje iskalnikov, iskalniki</translation> +<translation id="7081494400361697539">ustvarjanje google preglednice, ustvarjanje preglednice v delovnem prostoru, nova google preglednica, začni novo google preglednico</translation> +<translation id="7153639895359139570">dodajanje naslova, spreminjanje naslova za dostavo, urejanje naslovov, upravljanje naslovov</translation> +<translation id="7242693601647412075">upravljanje varnostnih nastavitev</translation> +<translation id="7441773108452086364">spremeni geslo za gmail, spremeni geslo za moj gmail, sprememba gesla za google, ponastavi geslo za račun za gmail</translation> <translation id="7660956169713698963">prilagajanje funkcij za ljudi s posebnimi potrebami v sistemu chrome os, upravljanje nastavitev funkcij za ljudi s posebnimi potrebami</translation> <translation id="7700496593710078083">ogled zgodovine uporabe chroma, prikaz zgodovine brskanja</translation> <translation id="7739523284295786564">upravljanje prenosov v chromu, ogled prenosov</translation> +<translation id="7873993277886791795">ustvari google predstavitev, ustvarjanje nove predstavitve, nova google predstavitev, začni google predstavitev</translation> <translation id="7992725801741093524">spreminjanje nastavitev zasebnosti v googlu, upravljanje zasebnosti v googlu</translation> <translation id="8020024640114692614">vedno odpri povezave v chromu, vedno uporabi chrome, izbriši safari, kako nastaviti chrome kot privzeti iskalnik, glavni brskalnik, določi chrome kot privzeti iskalnik, odpiraj povezave v chromu, iskanje v chromu, nastavi chrome kot privzeti iskalnik, standardni brskalnik</translation> +<translation id="8189600756055704659">spreminjanje nastavitev sinhronizacije v chromu, spreminjanje sinhronizacije v chromu, urejanje sinhronizacije, urejanje nastavitev sinhronizacije, upravljanje sinhronizacije</translation> +<translation id="8307473667919507216">zagon varnostnega preverjanja v chromu, zagon varnostnega preverjanja</translation> <translation id="8319253638505741466">zapiranje anonimnega okna, zapri anonimni način</translation> +<translation id="8350110529112037703">upravljanje gesel v chromu, ogled gesla v chrome</translation> +<translation id="9015559449837241926">funkcije chroma, učenje funkcij google chroma, nove funkcije google chroma, ogled nasvetov za chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_te.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_te.xtb index 2c7c61b..c93eac8 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_te.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_te.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="te"> +<translation id="101606685846791463">బ్రౌజర్ కాష్ను క్లియర్ చేయండి, హిస్టరీని క్లియర్ చేయండి, కుక్కీలను తొలగించండి, బ్రౌజింగ్ హిస్టరీని తీసివేయండి</translation> +<translation id="132297926492792130">నా Google ఖాతాను కంట్రోల్ చేయి, Google ఖాతాలోని సమస్యలను పరిష్కరించు, Google ఖాతాను మేనేజ్ చేయి, నా Google ఖాతాను మేనేజ్ చేయి</translation> +<translation id="1455865776268085776">అజ్ఞాత మోడ్ను తెరవండి, కొత్త అజ్ఞాత విండో, అజ్ఞాత ట్యాబ్ను తెరవండి</translation> <translation id="1545931455576308147">ఈ పేజీని షేర్ చేయండి, ఈ ట్యాబ్ను షేర్ చేయండి</translation> <translation id="1912698329644085067">chrome సెట్టింగ్లను మార్చండి, సెట్టింగ్లను మేనేజ్ చేయండి</translation> +<translation id="1938436187879863297">google keep నోట్ను క్రియేట్ చేయండి, google నోట్ను క్రియేట్ చేయండి, కొత్త google keep నోట్ను రూపొందించండి, కొత్త google నోట్, google నోట్ను ప్రారంభించండి</translation> <translation id="2003251155164817216">Chrome రూపాన్ని అనుకూలంగా మార్చండి, Chrome రూపాలను మేనేజ్ చేయండి</translation> +<translation id="2757458512261408467">google cal ఆహ్వానాన్ని క్రియేట్ చేయండి, google calendar ఈవెంట్ను క్రియేట్ చేయండి, కొత్త cal ఆహ్వానాన్ని క్రియేట్ చేయండి, కొత్త cal ఈవెంట్, కొత్త cal ఈవెంట్, కొత్త google calendar ఆహ్వానం</translation> +<translation id="2903767089701932453">chrome కుక్కీ సెట్టింగ్లు, కుక్కీల వినియోగం, థర్డ్-పార్టీ కుక్కీలు అన్నింటిని అనుమతించవద్దు, కుక్కీ సెట్టింగ్లను మేనేజ్ చేయండి, కుక్కీలను మేనేజ్ చేయండి</translation> +<translation id="2941773220794601465">ఈ పేజీని అనువదించండి, వెబ్పేజీని అనువదించండి</translation> +<translation id="2973110773361184993">సైట్ అనుమతులను సర్దుబాటు చేయండి, అనుమతులను మార్చండి, సైట్ సెట్టింగ్లను కంట్రోల్ చేయండి, సైట్ సెట్టింగ్లను మేనేజ్ చేయండి, chrome సైట్ సెట్టింగ్లు</translation> +<translation id="3371457011763794419">chromeను అప్డేట్ చేయండి, బ్రౌజర్ను అప్గ్రేడ్ చేయండి</translation> <translation id="3489247412199563299">Chrome యాక్సెసిబిలిటీని అనుకూలంగా మార్చండి, యాక్సెసిబిలిటీ సెట్టింగ్లను మేనేజ్ చేయండి</translation> +<translation id="3936847108123063274">google సైట్ను క్రియేట్ చేయండి, google వెబ్సైట్ను రూపొందించండి, కొత్త google సైట్, కొత్త google సైట్ను తెరవండి</translation> +<translation id="4165988127016746956">google ఫారమ్ను క్రియేట్ చేయండి, కొత్త google ఫారమ్ను రూపొందించండి, కొత్త google ఫారమ్, google సర్వేను ప్రారంభించండి</translation> <translation id="4367205929005172598">పోగొట్టుకున్న ఫోన్ను కనుగొనండి, నా పరికరాన్ని కనుగొనండి</translation> <translation id="4692900934258103694">లోపల, లోపు, కోసం, ఎలా, ఆ, ఒక, చేయడం, లో, నా, పై, కు, ఒక, నేను</translation> +<translation id="4834023075966161189">google డాక్ను క్రియేట్ చేయండి, కొత్త google డాక్ను రూపొందించండి, google డాక్యుమెంట్ను తెరవండి</translation> <translation id="4922709528022057939">chrome dino, dino గేమ్, dino runను ఆడండి</translation> <translation id="5061612070235737664">బ్రౌజర్ ఫాంట్ను మార్చండి, Chrome ఫాంట్లు</translation> +<translation id="6413237123574479071">పేమెంట్ ఆప్షన్లను మేనేజ్ చేయండి, క్రెడిట్ కార్డ్ను అప్డేట్ చేయండి</translation> <translation id="6654270263159958770">అనుకూల సెర్చ్ను జోడించండి, సెర్చ్ ఇంజిన్లను మేనేజ్ చేయండి, సెర్చ్ ఇంజిన్లు</translation> +<translation id="7081494400361697539">google షీట్ను క్రియేట్ చేయండి, వర్క్ స్పేస్ స్ప్రెడ్షీట్ను క్రియేట్ చేయండి, కొత్త google షీట్, కొత్త google షీట్ను ప్రారంభించండి</translation> +<translation id="7153639895359139570">అడ్రస్ను జోడించండి, షిప్పింగ్ అడ్రస్ను మార్చండి, అడ్రస్లను ఎడిట్ చేయండి, అడ్రస్లను మేనేజ్ చేయండి</translation> +<translation id="7242693601647412075">భద్రతా సెట్టింగ్లను మేనేజ్ చేయండి</translation> +<translation id="7441773108452086364">gmail పాస్వర్డ్ను మార్చండి, నా gmail పాస్వర్డ్ను మార్చు, google పాస్వర్డ్ మార్పు, gmail ఖాతా పాస్వర్డ్ను రీసెట్ చేయండి</translation> <translation id="7660956169713698963">chromeos యాక్సెసిబిలిటీని అనుకూలంగా మార్చండి, యాక్సెసిబిలిటీ సెట్టింగ్లను మేనేజ్ చేయండి</translation> <translation id="7700496593710078083">Chrome హిస్టరీని చూడండి, బ్రౌజింగ్ హిస్టరీని చూడండి</translation> <translation id="7739523284295786564">Chrome డౌన్లోడ్లను మేనేజ్ చేయండి, డౌన్లోడ్లను చూడండి</translation> +<translation id="7873993277886791795">google slideను క్రియేట్ చేయండి, కొత్త డెక్ను రూపొందించండి, కొత్త Google ప్రెజెంటేషన్, Google ప్రెజెంటేషన్ను ప్రారంభించండి</translation> <translation id="7992725801741093524">Google గోప్యతా సెట్టింగ్లను మార్చండి, Google గోప్యతను మేనేజ్ చేయండి</translation> <translation id="8020024640114692614">ఎల్లప్పుడూ లింక్లను chromeలో తెరవండి, ఎల్లప్పుడూ chromeను ఉపయోగించండి, chromeను ఆటోమేటిక్గా సెట్ చేయండి, ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, safariని తొలగించండి, chromeను ఆటోమేటిక్ బ్రౌజర్గా ఎలా సెట్ చేయాలి, ప్రధాన బ్రౌజర్గా సెట్ చేయండి, chromeను ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, chromeను ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, chromeను నా ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, లింక్లను chromeలో తెరవండి, pick chromeను ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, ప్రధాన బ్రౌజర్గా సెట్ చేయండి, safariని తీసివేయండి, chromeలో సెర్చ్ చేయండి, chromeను ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, chromeను ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయండి, స్టాండర్డ్ బ్రౌజర్గా సెట్ చేయండి</translation> +<translation id="8189600756055704659">chrome బ్రౌజర్ సింక్ సెట్టింగ్లను మార్చండి, chrome సింక్ను మార్చండి, సింక్ను ఎడిట్ చేయండి, సింక్ సెట్టింగ్లను ఎడిట్ చేయండి, సింక్ను మేనేజ్ చేయండి</translation> +<translation id="8307473667919507216">Chrome భద్రతా తనిఖీని రన్ చేయి, భద్రతా తనిఖీని రన్ చేయి</translation> <translation id="8319253638505741466">అజ్ఞాత విండోను మూసివేయండి, అజ్ఞాతాన్ని మోడ్ నుండి నిష్క్రమించండి</translation> +<translation id="8350110529112037703">chrome పాస్వర్డ్లను మేనేజ్ చేయండి, chromeలో పాస్వర్డ్ను చూడండి</translation> +<translation id="9015559449837241926">chrome ఫీచర్లు, google chrome ఫీచర్ల గురించి తెలుసుకోండి, google chrome కొత్త ఫీచర్లు, chrome చిట్కాలు చూడండి</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb index bbc5fe6..f31b7e4 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="tr"> +<translation id="101606685846791463">tarayıcı önbelleğini temizle, geçmişi temizle, çerezleri sil, tarama geçmişini sil, önbelleği sil, geçmişi sil, tarama geçmişini temizle</translation> +<translation id="132297926492792130">google hesabımı kontrol et, google hesabını düzelt, google hesabını yönet, google hesabımı yönet, google hesap kontrolü, google hesap yönetimi</translation> +<translation id="1455865776268085776">gizli moda gir, yeni gizli pencere, gizli sekme aç, gizli sekme, gizli mod başlat, gizli pencere aç</translation> <translation id="1545931455576308147">bu sayfayı paylaş, bu sekmeyi paylaş</translation> <translation id="1912698329644085067">chrome ayarlarını değiştir, ayarları yönet</translation> +<translation id="1938436187879863297">google keep notu oluştur, google notu oluştur, yeni google keep notu oluştur, yeni google not, google notu yarat, google keep notu</translation> <translation id="2003251155164817216">chrome görünümünü özelleştir, chrome temalarını yönet</translation> +<translation id="2757458512261408467">google takvim daveti oluştur, google takvim etkinliği oluştur, yeni takvim daveti oluştur, yeni takvim etkinliği, yeni google takvim daveti, yeni takvim daveti, takvim davetiyesi, google takvim daveti yap</translation> +<translation id="2903767089701932453">chrome çerez ayarları, çerez kullanımı, üçüncü taraf çerezlerin iznini kaldır, çerez ayarlarını yönet, çerezleri yönet, çerez yönetimi</translation> +<translation id="2941773220794601465">bu sayfayı çevir, web sayfasını çevir, sayfa çevirisi</translation> +<translation id="2973110773361184993">site izinlerini ayarla, izinleri değiştir, site ayarlarını kontrol et, site ayarlarını yönet, site ayarları chrome</translation> +<translation id="3371457011763794419">chrome'u güncelle, tarayıcıyı yeni sürüme geçir, chrome güncelleme, tarayıcı güncelleme</translation> <translation id="3489247412199563299">chrome erişilebilirliğini özelleştir, erişilebilirlik ayarlarını yönet</translation> +<translation id="3936847108123063274">google sitesi oluştur, google web sitesi oluştur, yeni google sitesi, yeni google sitesi aç, google sitesi yap, google sitesi, google web sitesi</translation> +<translation id="4165988127016746956">google formu oluştur, yeni google formu oluştur, yeni google formu, google anketi oluştur, google formu yarat, yeni google formu yap</translation> <translation id="4367205929005172598">kayıp telefonu bul, cihazımı bul</translation> <translation id="4692900934258103694">içinde, içerisinde, için, nasıl, bu, bir, yap, benim, üstünde, ben</translation> +<translation id="4834023075966161189">google dokümanı oluştur, yeni google dokümanı oluştur, google dokümanını aç, yeni google dokümanı, google dokümanı yarat</translation> <translation id="4922709528022057939">chrome dinozor, dinozor oyunu, dinozor oyununu oyna</translation> <translation id="5061612070235737664">tarayıcının yazı tipini değiştir, chrome yazı tipleri</translation> +<translation id="6413237123574479071">ödeme yöntemlerini yönet, kredi kartını güncelle, ödeme yöntemlerini ayarla, ödeme yöntemlerini güncelle</translation> <translation id="6654270263159958770">özel arama ekle, arama motorlarını yönet, arama motorları</translation> +<translation id="7081494400361697539">google e-tablo oluştur, çalışma alanı e-tablosu oluştur, yeni google e-tablosu, yeni google e-tablosu oluştur, e-tablo başlat</translation> +<translation id="7153639895359139570">adres ekle, gönderim adresini değiştir, adresleri düzenle, adresleri yönet, adres yönetimi, adres değiştir</translation> +<translation id="7242693601647412075">güvenlik ayarlarını yönet</translation> +<translation id="7441773108452086364">gmail şifresini değiştir, gmail şifremi değiştir, google şifre değişikliği, gmail hesap şifresini sıfırla, google şifresini değiştir</translation> <translation id="7660956169713698963">chromeos erişilebilirliğini özelleştir, erişilebilirlik ayarlarını yönet</translation> <translation id="7700496593710078083">chrome geçmişini gör, tarama geçmişini görüntüle</translation> <translation id="7739523284295786564">chrome indirmelerini yönet, indirmeleri görüntüle</translation> +<translation id="7873993277886791795">google slayt oluştur, yeni sunu oluştur, yeni google sunusu, google sunusu başlat, google slaytı yap, google slayt</translation> <translation id="7992725801741093524">google gizlilik ayarlarını değiştir, google gizliliğini yönet</translation> <translation id="8020024640114692614">bağlantıları her zaman chrome'da aç, her zaman chrome kullan, chrome'u varsayılan yap, varsayılan tarayıcı, safari'yi sil, chrome'u varsayılan tarayıcı yapma, asıl tarayıcı, chrome'u varsayılan olarak ayarla, chrome'u varsayılan tarayıcı yap, chrome'u varsayılan tarayıcım yap, bağlantıları chrome'da aç, chrome'u varsayılan tarayıcı olarak seç, ana tarayıcı, safari'yi kaldır, chrome'da ara, chrome'u varsayılan tarayıcı olarak ayarla, varsayılan tarayıcı chrome, standart tarayıcı</translation> +<translation id="8189600756055704659">chrome tarayıcı senkronizasyon ayarlarını değiştir, chrome senkronizasyonunu değiştir, senkronizasyonu düzenle, senkronizasyon ayarlarını düzenle, senkronizasyonu yönet, senkronizasyonu değiştir</translation> +<translation id="8307473667919507216">chrome güvenlik kontrolü gerçekleştir, güvenlik kontrolü gerçekleştir, güvenlik kontrolü başlat, chrome güvenlik kontrolü</translation> <translation id="8319253638505741466">gizli pencereyi kapat, gizli modu sonlandır</translation> +<translation id="8350110529112037703">chrome şifrelerini yönet, şifreyi chrome'da görüntüle, chrome şifre yönetimi</translation> +<translation id="9015559449837241926">chrome özellikleri, google chrome özelliklerini öğren, yeni google chrome özellikleri, chrome ipuçlarını gör</translation> </translationbundle> \ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb index a84c130e4..8ce8784 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb
@@ -1,19 +1,41 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uk"> +<translation id="101606685846791463">очистити кеш веб-переглядача, очистити історію, видалити файли cookie, видалити історію веб-перегляду</translation> +<translation id="132297926492792130">керувати моїм обліковим записом google, змінити налаштування облікового запису google, керувати обліковим записом google, керувати моїм обліковим записом google</translation> +<translation id="1455865776268085776">перейти в режим анонімного перегляду, нове вікно в режимі анонімного перегляду, відкрити анонімну вкладку</translation> <translation id="1545931455576308147">поділитися цією сторінкою, поділитися цією вкладкою, поділитися з іншим користувачем, надіслати посилання на сторінку, надіслати посилання на вкладку</translation> <translation id="1912698329644085067">змінити налаштування chrome, керувати налаштуваннями, відкрити налаштування, налаштування chrome, змінити налаштування</translation> +<translation id="1938436187879863297">створити нотатку в google keep, створити нотатку google, створити нову нотатку в google keep, нова нотатка google, створити нову нотатку google</translation> <translation id="2003251155164817216">налаштувати вигляд chrome, керувати темами в chrome, змінити тему в chrome, теми в chrome, змінити вигляд chrome</translation> +<translation id="2757458512261408467">створити запрошення в google календарі, створити подію в google календарі, створити нове запрошення в календарі, нова подія в календарі, нове запрошення в google календарі</translation> +<translation id="2903767089701932453">налаштування файлів cookie chrome, використання файлів cookie, заблокувати всі сторонні файли cookie, керувати налаштуваннями файлів cookie, керувати файлами cookie</translation> +<translation id="2941773220794601465">перекласти цю сторінку, перекласти веб-сторінку</translation> +<translation id="2973110773361184993">змінити дозволи сайтів, змінити дозволи, керувати налаштуваннями сайтів, змінити налаштування сайтів, налаштування сайтів у chrome</translation> +<translation id="3371457011763794419">оновити chrome, оновити веб-переглядач</translation> <translation id="3489247412199563299">налаштувати спеціальні можливості в chrome, керувати налаштуваннями спеціальних можливостей, доступність chrome, спеціальні можливості chrome, налаштування спеціальних можливостей</translation> +<translation id="3936847108123063274">створити сайт google, створити веб-сайт google, новий сайт google, відкрити новий сайт google</translation> +<translation id="4165988127016746956">створити форму google, створити нову форму google, нова форма google, створити опитування google</translation> <translation id="4367205929005172598">знайти загублений телефон, знайти пристрій, пошук пристрою</translation> <translation id="4692900934258103694">усередині, у межах, упродовж, як, у, мій, на, до</translation> +<translation id="4834023075966161189">створити документ google, створити новий документ google, відкрити документ google</translation> <translation id="4922709528022057939">chrome dino, гра dino, грати в dino run, dino run у chrome, відкрити dino</translation> <translation id="5061612070235737664">змінити шрифт веб-переглядача, шрифти в chrome, налаштування шрифтів, налаштувати розміри шрифтів, змінити типи шрифтів</translation> +<translation id="6413237123574479071">керувати способами оплати, оновити кредитну картку</translation> <translation id="6654270263159958770">додати налаштування пошуку, керувати пошуковими системами, пошукові системи, налаштування пошукових систем, налаштування пошуку</translation> +<translation id="7081494400361697539">створити таблицю google, створити електронну таблицю workspace, нова таблиця google, створити нову таблицю google</translation> +<translation id="7153639895359139570">додати адресу, змінити адресу доставки, редагувати адреси, керувати адресами</translation> +<translation id="7242693601647412075">керувати налаштуваннями безпеки</translation> +<translation id="7441773108452086364">змінити пароль gmail, змінити мій пароль gmail, зміна паролю google, скинути пароль облікового запису gmail</translation> <translation id="7660956169713698963">налаштувати спеціальні можливості в ос chrome, керувати налаштуваннями спеціальних можливостей, спеціальні можливості, налаштування спеціальних можливостей, змінити налаштування спеціальних можливостей</translation> <translation id="7700496593710078083">переглянути історію chrome, переглянути історію веб-перегляду, відкрити історію веб-перегляду, історія веб-перегляду, відкрити історію chrome</translation> <translation id="7739523284295786564">керувати завантаженнями chrome, переглянути завантаження, відкрити завантаження, завантажені файли, завантаження chrome</translation> +<translation id="7873993277886791795">створити слайд google, створити нову презентацію, нова презентація google, створити презентацію google</translation> <translation id="7992725801741093524">керувати налаштуваннями конфіденційності в google, керувати конфіденційністю в google, налаштування конфіденційності, конфіденційність google</translation> <translation id="8020024640114692614">завжди відкривати посилання в chrome, завжди використовувати chrome, chrome за умовчанням, веб-переглядач за умовчанням, видалити safari, як зробити chrome веб-переглядачем за умовчанням, основний веб-переглядач, зробити chrome за умовчанням, зробити chrome веб-переглядачем за умовчанням, зробити chrome моїм веб-переглядачем за умовчанням, відкривати посилання в chrome, вибрати chrome веб-переглядачем за умовчанням, основний браузер, вилучити safari, пошук у chrome, використовувати chrome за умовчанням, використовувати chrome як веб-переглядач за умовчанням, стандартний веб-переглядач</translation> +<translation id="8189600756055704659">змінити налаштування синхронізації веб-переглядача chrome, змінити параметри синхронізації chrome, змінити параметри синхронізації, змінити налаштування синхронізації, керувати синхронізацією</translation> +<translation id="8307473667919507216">виконати перевірку безпеки chrome, виконати перевірку безпеки</translation> <translation id="8319253638505741466">закрити вікно в режимі анонімного перегляду, вимкнути анонімний режим, вікно в режимі анонімного перегляду, анонімний режим, вийти з анонімного режиму</translation> +<translation id="8350110529112037703">керувати паролями в chrome, переглянути пароль у chrome</translation> +<translation id="9015559449837241926">функції chrome, дізнатися про функції google chrome, нові функції google chrome, переглянути поради щодо chrome</translation> </translationbundle> \ No newline at end of file
diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc index e7e0020f..1a86033 100644 --- a/components/performance_manager/features.cc +++ b/components/performance_manager/features.cc
@@ -40,6 +40,12 @@ "tab_count_threshold", 10, }; + +const base::FeatureParam<int> kHighEfficiencyModePromoMemoryPercentThreshold{ + &kHighEfficiencyModeAvailable, + "memory_percent_threshold", + 70, +}; #endif const base::Feature kBFCachePerformanceManagerPolicy{
diff --git a/components/performance_manager/public/features.h b/components/performance_manager/public/features.h index dd6337d..c127fac 100644 --- a/components/performance_manager/public/features.h +++ b/components/performance_manager/public/features.h
@@ -47,6 +47,12 @@ // The number of tabs at which the user may be prompted to enable high // efficiency mode. extern const base::FeatureParam<int> kHighEfficiencyModePromoTabCountThreshold; + +// The percentage of used memory at which the user may be prompted to enable +// high efficiency mode. For instance, if this parameter is set to 70, the promo +// would be triggered when memory use exceeds 70% of available memory. +extern const base::FeatureParam<int> + kHighEfficiencyModePromoMemoryPercentThreshold; #endif // Policy that evicts the BFCache of pages that become non visible or the
diff --git a/components/permissions/permission_context_base.h b/components/permissions/permission_context_base.h index 703b62e..1548d5cf 100644 --- a/components/permissions/permission_context_base.h +++ b/components/permissions/permission_context_base.h
@@ -16,7 +16,6 @@ #include "components/content_settings/core/browser/content_settings_observer.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" -#include "components/keyed_service/core/keyed_service.h" #include "components/permissions/permission_request.h" #include "components/permissions/permission_result.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-forward.h" @@ -67,8 +66,7 @@ // See midi_permission_context.h/cc or push_permission_context.cc/h for some // examples. -class PermissionContextBase : public KeyedService, - public content_settings::Observer { +class PermissionContextBase : public content_settings::Observer { public: PermissionContextBase( content::BrowserContext* browser_context,
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc index 8dbed51..d9be2d9 100644 --- a/components/permissions/permission_manager.cc +++ b/components/permissions/permission_manager.cc
@@ -187,6 +187,7 @@ } subscription_type_counts_.clear(); } + permission_contexts_.clear(); } PermissionContextBase* PermissionManager::GetPermissionContextForTesting(
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index b49063a..cb2d45d 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -13851,7 +13851,7 @@ 'id': 1017, 'caption': '''Enable capability to send files to the Trash (on supported filesystems) in the <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> Files app''', 'tags': [], - 'desc': '''Setting the policy to enabled allows users of <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> Files app to see a Trash bin and files under My files and Downloads (including their user created descendants) will be sent their on a delete. + 'desc': '''Setting the policy to True allows users of <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> Files app to see a Trash bin and files under My files and Downloads (including their user created descendants) will be sent there on deletion. If the policy is set to False the files that previously resided in trash will still be available by showing hidden files and finding the .Trash directory under My files or Downloads.''', },
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index b1fa951..f4a0a8d 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -5986,6 +5986,15 @@ <translation id="7200364929485466022">Zeitpunkt, an dem die Updateprüfung durchgeführt wird, angegeben in der lokalen Zeit des Geräts.</translation> <translation id="7202925763179776247">Download-Einschränkungen zulassen</translation> <translation id="7207095846245296855">Google SafeSearch erzwingen</translation> +<translation id="7208483746373960784">Mit dieser Einstellung wird festgelegt, wie viele Nutzerdaten nach der Deaktivierung von <ph name="LACROS_NAME" /> gespeichert werden. + + Wenn die Richtlinie auf <ph name="LACROS_BACKWARD_MIGRATION_NONE" /> gesetzt ist, wird keine umgekehrte Datenmigration ausgeführt. + + Wenn die Richtlinie auf <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" /> gesetzt ist, werden alle Nutzerdaten entfernt. Das ist die sicherste Option. + + Wenn die Richtlinie auf <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" /> gesetzt ist, werden die meisten Nutzerdaten entfernt. Es werden dann nur browserunabhängige Dateien gespeichert, z. B. Downloads. + + Wenn die Richtlinie auf <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" /> gesetzt ist, bleiben alle Nutzerdaten erhalten. Diese Option ist sehr fehleranfällig. Zur Wiederherstellung ist dann ein Zurücksetzen auf die Werkseinstellungen per Powerwash erforderlich.</translation> <translation id="7211368186050418507">Zeitzone nie automatisch erkennen</translation> <translation id="7216442368414164495">Ermöglicht Nutzern die Aktivierung erweiterter Berichterstellung bei Verwendung von Safe Browsing</translation> <translation id="721970071627370558">Melden des Energiestatus auf Geräten deaktivieren</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index d727266a..bfc78183 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -6050,6 +6050,15 @@ <translation id="7200364929485466022">업데이트 확인이 이루어져야 하는 시간으로, 기기의 현지 시간대로 변환됩니다.</translation> <translation id="7202925763179776247">다운로드 제한 허용</translation> <translation id="7207095846245296855">Google 세이프서치 강제 실행</translation> +<translation id="7208483746373960784">이 설정은 <ph name="LACROS_NAME" />가 사용 중지된 후 사용자 데이터를 얼마나 유지할지 결정합니다. + + 정책을 <ph name="LACROS_BACKWARD_MIGRATION_NONE" />로 설정하면 과거 데이터 이전이 수행되지 않습니다. + + 정책을 <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" />으로 설정하면 모든 사용자 데이터가 삭제됩니다. 가장 안전한 옵션입니다. + + 정책을 <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />로 설정하면 대부분의 사용자 데이터가 삭제됩니다. 브라우저의 독립적인 파일(예: 다운로드)만 유지됩니다. + + 정책을 <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />로 설정하면 모든 사용자 데이터가 유지됩니다. 이 옵션은 실패 가능성이 높고 복구하려면 파워워시가 필요합니다.</translation> <translation id="7211368186050418507">시간대 자동 감지 기능을 사용하지 않습니다.</translation> <translation id="7216442368414164495">사용자가 세이프 브라우징 확장 보고를 선택하도록 허용</translation> <translation id="721970071627370558">기기 전원 상태 보고 사용 중지</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 22b73c7..2ce3d03d 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -5954,6 +5954,15 @@ <translation id="7200364929485466022">Tijd wanneer de updatecheck moet plaatsvinden, geïnterpreteerd in de lokale tijdzone van het apparaat.</translation> <translation id="7202925763179776247">Downloadbeperkingen toestaan</translation> <translation id="7207095846245296855">Google SafeSearch afdwingen</translation> +<translation id="7208483746373960784">Deze instelling bepaalt hoeveel gebruikersgegevens worden bewaard nadat <ph name="LACROS_NAME" /> is uitgezet. + + Als je het beleid instelt op <ph name="LACROS_BACKWARD_MIGRATION_NONE" />, wordt er geen achterwaartse gegevensmigratie uitgevoerd. + + Als je het beleid instelt op <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" />, worden alle gebruikersgegevens verwijderd. Dit is de veiligste optie. + + Als je het beleid instelt op <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />, worden de meeste gebruikersgegevens verwijderd. Alleen bestanden die niet afhankelijk zijn van de browser worden bewaard (zoals downloads). + + Als je het beleid instelt op <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />, worden alle gebruikersgegevens bewaard. Deze optie heeft een hoog risico op fouten en vereist een Powerwash om te herstellen.</translation> <translation id="7211368186050418507">Tijdzone nooit automatisch detecteren</translation> <translation id="7216442368414164495">Hiermee kunnen gebruikers zich aanmelden voor uitgebreide rapportage van Safe Browsing</translation> <translation id="721970071627370558">Rapportage van aan/uit-status van apparaat uitzetten</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index d9cd630..5d3cd2dc 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -6043,6 +6043,15 @@ <translation id="7200364929485466022">Время, когда должна произойти проверка обновлений, в соответствии с часовым поясом, заданным на устройстве.</translation> <translation id="7202925763179776247">Включить ограничения скачивания</translation> <translation id="7207095846245296855">Позволяет принудительно включить Безопасный поиск Google</translation> +<translation id="7208483746373960784">Этот параметр определяет, какой объем пользовательских данных сохраняется после отключения <ph name="LACROS_NAME" />. + + Если выбрано значение <ph name="LACROS_BACKWARD_MIGRATION_NONE" />, перенос имеющихся данных не осуществляется. + + При установленном значении <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" /> все пользовательские данные удаляются. Это наиболее безопасный вариант. + + Если выбрано значение <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />, большинство пользовательских данных удаляется. Сохраняются только независимые от браузера файлы (например, те, что были скачаны на устройство). + + Если задано значение <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />, все пользовательские данные сохраняются. При выборе этого варианта высок риск возникновения ошибки. Может потребоваться восстановление заводских настроек.</translation> <translation id="7211368186050418507">Не определять часовой пояс автоматически</translation> <translation id="7216442368414164495">Позволить пользователям включить расширенную отчетность безопасного просмотра</translation> <translation id="721970071627370558">Отключить отправку данных о состоянии питания устройства</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 9ce6776..d56d779 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -1804,6 +1804,7 @@ <translation id="2799297758492717491">อนุญาตการเล่นสื่ออัตโนมัติในรายการรูปแบบ URL ที่อนุญาตพิเศษ</translation> <translation id="2801065672151277034">การตั้งค่าการจัดการใบรับรอง</translation> <translation id="2801155097555584385">ตั้งค่าการเริ่มชาร์จแบตเตอรี่ที่กำหนดเองเป็นเปอร์เซ็นต์</translation> +<translation id="2801378553855965587">ปิดใช้การผสานรวม "<ph name="GOOGLE_CALENDAR_NAME" />"</translation> <translation id="2805707493867224476">อนุญาตให้ไซต์ทั้งหมดแสดงป๊อปอัป</translation> <translation id="2818074121667686266">เมื่อตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่า ผู้ใช้จะได้รับข้อความแจ้งหากมีการเข้าถึงการจับเสียง ยกเว้นใน URL ที่ตั้งค่าไว้ในรายการ AudioCaptureAllowedUrls @@ -2401,6 +2402,7 @@ ข้อความเตือนจะแสดงต่อเมื่อการทำงานสำหรับการไม่มีความเคลื่อนไหวคือการออกจากระบบหรือการปิดเครื่อง</translation> <translation id="3360490004791301756">อนุญาตให้ผู้ใช้แลกรับข้อเสนอผ่านการลงทะเบียน <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3363360928811201045">เพิ่มข้อจำกัดในบัญชีที่จัดการ</translation> +<translation id="3364400740222114778">การกู้คืนบัญชี</translation> <translation id="3373381043600809954">เปิดใช้ <ph name="PRODUCT_NAME" /></translation> <translation id="3374587000313305002">กำหนดค่าไดเรกทอรีที่ <ph name="PRODUCT_NAME" /> จะใช้สำหรับจัดเก็บข้อมูลผู้ใช้ @@ -2422,6 +2424,7 @@ หากไม่ได้ตั้งค่านโยบาย <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> ไว้ นโยบายนี้จะไม่มีผล</translation> <translation id="3397883909301547525">ไม่ต้องแสดงการแนะนำแอปใน Launcher ของ "<ph name="PRODUCT_OS_NAME" />"</translation> <translation id="3399859571630358395">บังคับให้ปิดใช้การจับคู่ด่วน (การจับคู่บลูทูธด่วน)</translation> +<translation id="3404681701763345449">เปิดใช้การผสานรวม "<ph name="GOOGLE_CALENDAR_NAME" />"</translation> <translation id="3408078762098350617">ควบคุมประสบการณ์ของผู้ใช้สำหรับฟีเจอร์ที่ปิดใช้ที่ระบุไว้ใน <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> หากตั้งค่านโยบายนี้เป็น "บล็อก" ฟีเจอร์ที่ปิดใช้จะไม่สามารถใช้ได้ แต่ผู้ใช้จะยังคงมองเห็น @@ -3319,6 +3322,7 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation> <translation id="4389073105055031853">อนุญาตให้ผู้ใช้จัดการใบรับรองทั้งหมด</translation> <translation id="4389091865841123886">กำหนดค่าการยืนยันระยะไกลกับกลไก TPM</translation> +<translation id="4397045637922200204">ปิดใช้งานการกู้คืนบัญชี</translation> <translation id="4397464099112037398">การตั้งค่าเริ่มต้นของสิทธิ์สำหรับตำแหน่งหน้าต่าง</translation> <translation id="4401496838830169080">ให้คุณควบคุมว่าจะเปิดหรือปิดใช้ฟีเจอร์ Google Safe Browsing ของ <ph name="PRODUCT_NAME" /> และกำหนดโหมดการทำงานของฟีเจอร์นี้ @@ -3734,6 +3738,7 @@ <translation id="4913065710388638917">เปิดใช้โฟลว์เอกสารรับรองสำหรับรายการ URL</translation> <translation id="4917385247580444890">แรง</translation> <translation id="4918261735182294270">อนุญาตให้ผู้ใช้เลือกว่าจะเปิดใช้ <ph name="CHROME_SYNC_NAME" /> หรือไม่</translation> +<translation id="491889618361437456">เปิดใช้การผสานรวม "<ph name="GOOGLE_CALENDAR_NAME" />"</translation> <translation id="4919122295221518724">เปิดใช้การดูแลที่เข้มงวดขึ้นสำหรับเนื้อหาผสม</translation> <translation id="4920367374739265095">การตั้งค่านโยบายนี้จะกำหนดนโยบายการเข้าถึงที่ใช้กับการกำหนดค่าเครื่องพิมพ์จำนวนมาก โดยควบคุมว่าเครื่องพิมพ์เครื่องใดใน <ph name="DEVICE_PRINTERS_POLICY_NAME" /> ที่พร้อมใช้งานสำหรับผู้ใช้ @@ -3890,6 +3895,13 @@ หากไม่ได้ตั้งค่านโยบายนี้หรือปิดใช้ไว้ webkitRequestFileSystem ที่มีประเภทเป็นถาวรจะทำงานด้วยโควต้าชั่วคราว </translation> +<translation id="5099372083252975644">เปิดใช้การผสานรวม "<ph name="GOOGLE_CALENDAR_NAME" />" ซึ่งจะอนุญาตให้ผู้ใช้ "<ph name="PRODUCT_OS_NAME" />" ดึงข้อมูลกิจกรรมจาก "<ph name="GOOGLE_CALENDAR_NAME" />" เพื่อป้อนข้อมูลวิดเจ็ตปฏิทินของ "<ph name="PRODUCT_OS_NAME" />" ในแถบสถานะของระบบได้ + + หากเปิดใช้นโยบายนี้ อุปกรณ์ "<ph name="PRODUCT_OS_NAME" />" จะเรียกดูกิจกรรม "<ph name="GOOGLE_CALENDAR_NAME" />" เพื่อป้อนข้อมูลวิดเจ็ตปฏิทินของ "<ph name="PRODUCT_OS_NAME" />" ในแถบสถานะของระบบสำหรับผู้ใช้ที่เข้าสู่ระบบได้ + + หากปิดใช้นโยบายนี้ อุปกรณ์ "<ph name="PRODUCT_OS_NAME" />" จะไม่สามารถเรียกดูกิจกรรม "<ph name="GOOGLE_CALENDAR_NAME" />" เพื่อป้อนข้อมูลวิดเจ็ตปฏิทินของ "<ph name="PRODUCT_OS_NAME" />" ในแถบสถานะของระบบสำหรับผู้ใช้ที่เข้าสู่ระบบ + + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะปิดใช้ฟีเจอร์ "<ph name="GOOGLE_CALENDAR_NAME" />" โดยค่าเริ่มต้นสำหรับผู้ใช้ระดับองค์กร</translation> <translation id="5103112931744164177">นโยบายนี้ควบคุมกลุ่มซอฟต์แวร์ที่จะใช้เพื่อสื่อสารกับเซิร์ฟเวอร์ DNS ซึ่งได้แก่ ไคลเอ็นต์ DNS ของระบบปฏิบัติการ หรือไคลเอ็นต์ DNS ในตัวของ <ph name="PRODUCT_NAME" /> นโยบายนี้ไม่มีผลกับเซิร์ฟเวอร์ DNS ที่จะใช้ เช่น หากมีการกำหนดค่าให้ระบบปฏิบัติการใช้เซิร์ฟเวอร์ DNS ขององค์กร ไคลเอ็นต์ DNS ในตัวก็จะใช้เซิร์ฟเวอร์เดียวกันนี้ด้วย นอกจากนี้ นโยบายยังไม่ได้ควบคุมว่าจะใช้ DNS-over-HTTPS หรือไม่ <ph name="PRODUCT_NAME" /> จะใช้รีโซลเวอร์ในตัวเมื่อมีคำขอ DNS-over-HTTPS เสมอ โปรดดูข้อมูลเกี่ยวกับการควบคุม DNS-over-HTTPS ในนโยบาย <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" /> หากตั้งค่านโยบายนี้เป็น "เปิดใช้" ระบบจะใช้ไคลเอ็นต์ DNS ในตัว (หากมี) @@ -6211,6 +6223,15 @@ <translation id="7482768039644066614">เปิดใช้การดึงข้อมูลเมตาของการโหลดหน้าเว็บและโมเดลแมชชีนเลิร์นนิง เพื่อช่วยเพิ่มประสิทธิภาพประสบการณ์การท่องเว็บ</translation> <translation id="7485481791539008776">กฎการเลือกเครื่องพิมพ์เริ่มต้น</translation> <translation id="7486205887492534734">แสดงข้อความแจ้งเมื่อมีใบรับรองตรงกันหลายรายการบนหน้าจอการลงชื่อเข้าใช้</translation> +<translation id="7489661071474025727">ระบุว่าผู้ใช้บนอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ได้เปิดใช้งานบริการกู้คืนบัญชีอยู่หรือไม่ + + เมื่อเปิดใช้นโยบาย การกู้คืนข้อมูลผู้ใช้จะเปิดใช้งาน เมื่อปิดใช้นโยบายหรือไม่ได้ตั้งค่า ระบบจะไม่เปิดใช้งานการกู้คืนข้อมูลผู้ใช้ + การตั้งค่านโยบายเป็นระดับที่แนะนำจะทำให้ผู้ใช้เปลี่ยนการเปิดใช้งานการกู้คืนบัญชีได้ผ่านหน้าการตั้งค่า การตั้งค่านโยบายเป็นระดับบังคับหมายความว่าผู้ใช้จะเปลี่ยนการเปิดใช้งานการกู้คืนบัญชีไม่ได้ + + สำหรับการเปลี่ยนแปลงค่านโยบาย กระบวนการอัปเดตจะเสร็จสมบูรณ์เมื่อเข้าสู่ระบบอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ครั้งถัดไป หลังจากที่ดึงข้อมูลค่านโยบายใหม่แล้ว + + หมายเหตุ: การตั้งค่านี้จะมีผลกับบัญชีใหม่ที่เพิ่มในอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> เท่านั้น + </translation> <translation id="7491720878670299691">อัตราที่ใช้ในการโพลและตรวจสอบกิจกรรมของข้อมูลเครือข่าย ค่าขั้นต่ำที่อนุญาตคือ 1 นาที หากไม่ได้ตั้งค่า ระบบจะใช้อัตราเริ่มต้น 1 นาที</translation> @@ -7215,6 +7236,7 @@ <translation id="8543108307976719751">ป้องกันไม่ให้เข้าถึงการเชื่อมต่อกับเครื่องนี้จากระยะไกล</translation> <translation id="8544375438507658205">โปรแกรมแสดง HTML เริ่มต้นสำหรับ <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8544465954173828789">อนุญาตให้ซิงค์ข้อความ SMS จากโทรศัพท์ไปยัง Chromebook</translation> +<translation id="8549906780629620346">เปิดใช้งานการกู้คืนบัญชี</translation> <translation id="8553955290407912156">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่ไม่สามารถขอให้ผู้ใช้ให้สิทธิ์เข้าถึงอุปกรณ์ HID ได้ การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index c7d1defd..b1808a06 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -6019,6 +6019,15 @@ <translation id="7200364929485466022">Güncelleme denetiminin ne zaman yapılması gerektiği (cihazın yerel saat dilimine göre).</translation> <translation id="7202925763179776247">İndirme kısıtlamalarına izin ver</translation> <translation id="7207095846245296855">Google Güvenli Arama'yı zorla</translation> +<translation id="7208483746373960784">Bu ayar, <ph name="LACROS_NAME" /> devre dışı bırakıldıktan sonra kullanıcı verilerinin ne kadarının saklanacağını belirler. + + Politika <ph name="LACROS_BACKWARD_MIGRATION_NONE" /> değerine ayarlanırsa geriye dönük veri taşıma işlemi gerçekleştirilmez. + + Politika <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" /> değerine ayarlanırsa tüm kullanıcı verileri kaldırılır. Bu en güvenli seçenektir. + + Politika <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" /> değerine ayarlanırsa kullanıcı verilerinin çoğu kaldırılır. Yalnızca tarayıcıdan bağımsız dosyalar (örneğin, indirilenler) saklanır. + + Politika <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" /> değerine ayarlanırsa tüm kullanıcı verileri saklanır. Bu seçenek, yüksek hata riskine sahiptir ve kurtarma işlemi için powerwash yapılması gerekir.</translation> <translation id="7211368186050418507">Saat dilimini hiçbir zaman otomatik algılama</translation> <translation id="7216442368414164495">Kullanıcıların Güvenli Tarama genişletilmiş raporlamasını etkinleştirmesine izin ver</translation> <translation id="721970071627370558">Cihazın güç durumu raporlamasını devre dışı bırak</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index ad16b10..254cf79 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -6049,6 +6049,15 @@ <translation id="7200364929485466022">Час, коли має перевірятися наявність оновлень (за встановленим на пристрої місцевим часовим поясом).</translation> <translation id="7202925763179776247">Дозволити обмеження завантажень</translation> <translation id="7207095846245296855">Примусово активувати Безпечний пошук Google</translation> +<translation id="7208483746373960784">Це налаштування визначає, скільки даних користувачів зберігатиметься, якщо вимкнути <ph name="LACROS_NAME" />. + + Якщо для цього правила вибрати значення <ph name="LACROS_BACKWARD_MIGRATION_NONE" />, переміщення даних за попередні періоди не виконуватиметься. + + Якщо для цього правила вибрати значення <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" />, усі дані користувачів вилучатимуться. Це найбезпечніший варіант. + + Якщо вибрати значення <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />, вилучатиметься більшість даних користувачів. Зберігатимуться лише незалежні файли веб-переглядача (наприклад, завантаження). + + Якщо для правила вибрати значення <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />, усі дані користувачів зберігатимуться. Цей варіант несе високий рівень ризику й може призвести до помилки. У такому разі потрібно буде відновити заводські налаштування.</translation> <translation id="7211368186050418507">Ніколи не визначати часовий пояс автоматично</translation> <translation id="7216442368414164495">Дозволяти користувачам вмикати розширене звітування Безпечного перегляду</translation> <translation id="721970071627370558">Вимкнути звітування щодо статусу живлення пристрою</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 4eaec97..dab4945c 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -5923,6 +5923,15 @@ <translation id="7200364929485466022">應執行更新檢查的時間 (根據裝置當地時區)。</translation> <translation id="7202925763179776247">允許下載限制</translation> <translation id="7207095846245296855">強制啟用 Google 安全搜尋模式</translation> +<translation id="7208483746373960784">這項設定會決定系統在 <ph name="LACROS_NAME" /> 停用後保留的使用者資料量。 + + 如果這項政策設為 <ph name="LACROS_BACKWARD_MIGRATION_NONE" />,系統不會執行反向資料遷移作業。 + + 如果這項政策設為 <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" />,系統將會移除所有使用者資料。這是最安全的選項。 + + 如果這項政策設為 <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />,系統將會移除大部分的使用者資料,只保留與瀏覽器無關的檔案,例如下載的檔案。 + + 如果這項政策設為 <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />,系統會保留所有使用者資料。這個選項的失敗風險很高,必須恢復原廠設定才能復原。</translation> <translation id="7211368186050418507">一律不自動偵測時區</translation> <translation id="7216442368414164495">允許使用者採用安全瀏覽模式的進階回報功能</translation> <translation id="721970071627370558">停用裝置電源狀態回報功能</translation>
diff --git a/components/signin/core/browser/BUILD.gn b/components/signin/core/browser/BUILD.gn index 6c574fb..9746989c 100644 --- a/components/signin/core/browser/BUILD.gn +++ b/components/signin/core/browser/BUILD.gn
@@ -24,8 +24,6 @@ "account_reconcilor_throttler.h", "chrome_connected_header_helper.cc", "chrome_connected_header_helper.h", - "cookie_reminter.cc", - "cookie_reminter.h", "cookie_settings_util.cc", "cookie_settings_util.h", "dice_account_reconcilor_delegate.cc",
diff --git a/components/signin/core/browser/cookie_reminter.cc b/components/signin/core/browser/cookie_reminter.cc deleted file mode 100644 index f1624a16..0000000 --- a/components/signin/core/browser/cookie_reminter.cc +++ /dev/null
@@ -1,55 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/signin/core/browser/cookie_reminter.h" - -#include "base/callback_helpers.h" -#include "components/signin/public/identity_manager/accounts_cookie_mutator.h" - -namespace { - -bool DoesAccountRequireCookieReminting( - const std::vector<CoreAccountInfo>& accounts_requiring_cookie_remint, - const CoreAccountInfo& account_info) { - for (const CoreAccountInfo& account_requiring_remint : - accounts_requiring_cookie_remint) { - if (account_info.gaia == account_requiring_remint.gaia) { - return true; - } - } - - return false; -} - -} // namespace - -CookieReminter::CookieReminter(signin::IdentityManager* identity_manager) - : identity_manager_(identity_manager) { - identity_manager_->AddObserver(this); -} - -CookieReminter::~CookieReminter() { - identity_manager_->RemoveObserver(this); -} - -void CookieReminter::ForceCookieRemintingOnNextTokenUpdate( - const CoreAccountInfo& account_info) { - if (DoesAccountRequireCookieReminting(accounts_requiring_cookie_remint_, - account_info)) { - return; - } - - accounts_requiring_cookie_remint_.emplace_back(account_info); -} - -void CookieReminter::OnRefreshTokenUpdatedForAccount( - const CoreAccountInfo& account_info) { - if (DoesAccountRequireCookieReminting(accounts_requiring_cookie_remint_, - account_info)) { - // Cookies are going to be reminted for all accounts. - accounts_requiring_cookie_remint_.clear(); - identity_manager_->GetAccountsCookieMutator()->LogOutAllAccounts( - gaia::GaiaSource::kChromeOS, base::DoNothing()); - } -}
diff --git a/components/signin/core/browser/cookie_reminter.h b/components/signin/core/browser/cookie_reminter.h deleted file mode 100644 index 7ef497f2..0000000 --- a/components/signin/core/browser/cookie_reminter.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#ifndef COMPONENTS_SIGNIN_CORE_BROWSER_COOKIE_REMINTER_H_ -#define COMPONENTS_SIGNIN_CORE_BROWSER_COOKIE_REMINTER_H_ - -#include <vector> - -#include "base/memory/raw_ptr.h" -#include "components/keyed_service/core/keyed_service.h" -#include "components/signin/public/identity_manager/identity_manager.h" - -// Stores accounts with invalid cookies, which cannot be detected by -// /ListAccounts, so we can force cookie reminting when account is -// reauthenticated. -// -// Subscribed to |OnRefreshTokenUpdatedForAccount| of IdentityManager, calls -// |AccountsCookieMutator::LogOutAllAccounts| after refresh token update of -// any of the accounts that have been added to -// |ForceCookieRemintingOnNextTokenUpdate|. -class CookieReminter : public KeyedService, - public signin::IdentityManager::Observer { - public: - explicit CookieReminter(signin::IdentityManager* identity_manager); - ~CookieReminter() override; - - // Forces a cookie reminting if/when the refresh token for |account_info| is - // updated. - void ForceCookieRemintingOnNextTokenUpdate( - const CoreAccountInfo& account_info); - - private: - // Overridden from signin::IdentityManager::Observer. - void OnRefreshTokenUpdatedForAccount( - const CoreAccountInfo& account_info) override; - - raw_ptr<signin::IdentityManager> identity_manager_; - std::vector<CoreAccountInfo> accounts_requiring_cookie_remint_; -}; - -#endif // COMPONENTS_SIGNIN_CORE_BROWSER_COOKIE_REMINTER_H_
diff --git a/components/signin/internal/identity_manager/account_tracker_service.cc b/components/signin/internal/identity_manager/account_tracker_service.cc index 9f7dc4be..2bf543d 100644 --- a/components/signin/internal/identity_manager/account_tracker_service.cc +++ b/components/signin/internal/identity_manager/account_tracker_service.cc
@@ -556,9 +556,8 @@ return; base::Value::Dict* dict = nullptr; - ListPrefUpdate update(pref_service_, prefs::kAccountInfo); - base::Value::List& list = update->GetList(); - for (base::Value& value : list) { + ScopedListPrefUpdate update(pref_service_, prefs::kAccountInfo); + for (base::Value& value : *update) { base::Value::Dict* maybe_dict = value.GetIfDict(); if (maybe_dict) { const std::string* account_key = maybe_dict->FindString(kAccountKeyKey); @@ -617,8 +616,8 @@ ? signin::Tribool::kTrue : signin::Tribool::kFalse; // Migrate to kAccountChildAttributeKey. - ListPrefUpdate update(pref_service_, prefs::kAccountInfo); - base::Value::Dict& update_dict = update->GetList()[i].GetDict(); + ScopedListPrefUpdate update(pref_service_, prefs::kAccountInfo); + base::Value::Dict& update_dict = (*update)[i].GetDict(); update_dict.Set(kAccountChildAttributeKey, static_cast<int>(account_info.is_child_account)); update_dict.Remove(kDeprecatedChildStatusKey); @@ -638,8 +637,8 @@ dict->FindIntByDottedPath( kDeprecatedCanOfferExtendedChromeSyncPromosPrefPath)) { // Migrate to Capability names based pref paths. - ListPrefUpdate update(pref_service_, prefs::kAccountInfo); - base::Value::Dict& update_dict = update->GetList()[i].GetDict(); + ScopedListPrefUpdate update(pref_service_, prefs::kAccountInfo); + base::Value::Dict& update_dict = (*update)[i].GetDict(); SetAccountCapabilityState( update_dict, kCanOfferExtendedChromeSyncPromosCapabilityName, ParseTribool(can_offer_extended_chrome_sync_promos)); @@ -702,9 +701,8 @@ return; base::Value::Dict* dict = nullptr; - ListPrefUpdate update(pref_service_, prefs::kAccountInfo); - base::Value::List& list = update->GetList(); - for (base::Value& value : list) { + ScopedListPrefUpdate update(pref_service_, prefs::kAccountInfo); + for (base::Value& value : *update) { base::Value::Dict* maybe_dict = value.GetIfDict(); if (maybe_dict) { const std::string* account_key = maybe_dict->FindString(kAccountKeyKey); @@ -716,8 +714,8 @@ } if (!dict) { - list.Append(base::Value::Dict()); - dict = &list.back().GetDict(); + update->Append(base::Value::Dict()); + dict = &update->back().GetDict(); dict->Set(kAccountKeyKey, account_info.account_id.ToString()); } @@ -747,9 +745,9 @@ if (!pref_service_) return; - ListPrefUpdate update(pref_service_, prefs::kAccountInfo); + ScopedListPrefUpdate update(pref_service_, prefs::kAccountInfo); const std::string account_id = account_info.account_id.ToString(); - update->GetList().EraseIf([&account_id](const base::Value& value) { + update->EraseIf([&account_id](const base::Value& value) { if (!value.is_dict()) return false; const std::string* account_key = value.GetDict().FindString(kAccountKeyKey);
diff --git a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc index 58c03b5..a01c4f83 100644 --- a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc +++ b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
@@ -985,18 +985,18 @@ account_tracker() ->GetAccountInfo(AccountKeyToAccountId(kAccountKeyAlpha)) .is_child_account); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - ASSERT_FALSE(update->GetListDeprecated().empty()); - base::Value& dict = update->GetListDeprecated()[0]; - ASSERT_TRUE(dict.is_dict()); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); + ASSERT_FALSE(update->empty()); + base::Value::Dict* dict = (*update)[0].GetIfDict(); + ASSERT_TRUE(dict); const char kDeprecatedChildKey[] = "is_child_account"; const char kNewChildKey[] = "is_supervised_child"; // The deprecated key is not set. - EXPECT_FALSE(dict.FindBoolKey(kDeprecatedChildKey)); + EXPECT_FALSE(dict->FindBool(kDeprecatedChildKey)); // Set the child status using the deprecated key, and reload the account. - dict.SetBoolKey(kDeprecatedChildKey, true); - dict.RemoveKey(kNewChildKey); + dict->Set(kDeprecatedChildKey, true); + dict->Remove(kNewChildKey); ClearAccountTrackerEvents(); ResetAccountTrackerWithPersistence(scoped_user_data_dir.GetPath()); EXPECT_TRUE(CheckAccountTrackerEvents( @@ -1011,9 +1011,9 @@ // The deprecated key has been read. EXPECT_EQ(signin::Tribool::kTrue, infos[0].is_child_account); // The deprecated key has been removed. - EXPECT_FALSE(dict.FindBoolKey(kDeprecatedChildKey)); + EXPECT_FALSE(dict->FindBool(kDeprecatedChildKey)); // The new key has been written. - absl::optional<int> new_key = dict.FindIntKey(kNewChildKey); + absl::optional<int> new_key = dict->FindInt(kNewChildKey); ASSERT_TRUE(new_key.has_value()); EXPECT_EQ(static_cast<int>(signin::Tribool::kTrue), new_key.value()); } @@ -1205,20 +1205,19 @@ const std::string email_beta = AccountKeyToEmail(kAccountKeyBeta); const std::string gaia_beta = AccountKeyToGaiaId(kAccountKeyBeta); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); base::Value::Dict dict; dict.Set("account_id", email_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); dict = base::Value::Dict(); dict.Set("account_id", email_beta); dict.Set("email", email_beta); dict.Set("gaia", gaia_beta); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); base::HistogramTester tester; ResetAccountTracker(); @@ -1252,20 +1251,19 @@ const std::string gaia_alpha = AccountKeyToGaiaId(kAccountKeyAlpha); const std::string email_beta = AccountKeyToEmail(kAccountKeyBeta); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); base::Value::Dict dict; dict.Set("account_id", email_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); dict = base::Value::Dict(); dict.Set("account_id", email_beta); dict.Set("email", email_beta); dict.Set("gaia", ""); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); base::HistogramTester tester; ResetAccountTracker(); @@ -1300,27 +1298,26 @@ const std::string email_beta = AccountKeyToEmail(kAccountKeyBeta); const std::string gaia_beta = AccountKeyToGaiaId(kAccountKeyBeta); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); base::Value::Dict dict; dict.Set("account_id", email_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); dict = base::Value::Dict(); dict.Set("account_id", email_beta); dict.Set("email", email_beta); dict.Set("gaia", gaia_beta); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); // Succeed miggrated account. dict = base::Value::Dict(); dict.Set("account_id", gaia_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); base::HistogramTester tester; ResetAccountTracker(); @@ -1655,20 +1652,19 @@ const std::string email_beta = AccountKeyToEmail(kAccountKeyBeta); const std::string gaia_beta = AccountKeyToGaiaId(kAccountKeyBeta); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); base::Value::Dict dict; dict.Set("account_id", gaia_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); dict = base::Value::Dict(); dict.Set("account_id", gaia_beta); dict.Set("email", email_beta); dict.Set("gaia", gaia_beta); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); base::HistogramTester tester; ResetAccountTracker(); @@ -1685,20 +1681,19 @@ const std::string email_beta = AccountKeyToEmail(kAccountKeyBeta); const std::string gaia_beta = AccountKeyToGaiaId(kAccountKeyBeta); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); base::Value::Dict dict; dict.Set("account_id", email_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); dict = base::Value::Dict(); dict.Set("account_id", email_beta); dict.Set("email", email_beta); dict.Set("gaia", gaia_beta); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); base::HistogramTester tester; ResetAccountTracker(); @@ -1715,14 +1710,13 @@ const std::string email_foobar = AccountKeyToEmail(kAccountKeyFooDotBar); const std::string gaia_foobar = AccountKeyToGaiaId(kAccountKeyFooDotBar); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); base::Value::Dict dict; dict.Set("account_id", email_alpha); dict.Set("email", email_alpha); dict.Set("gaia", gaia_alpha); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); // This account is invalid because the account_id is a non-canonicalized // version of the email. @@ -1730,7 +1724,7 @@ dict.Set("account_id", email_foobar); dict.Set("email", email_foobar); dict.Set("gaia", gaia_foobar); - update_list.Append(std::move(dict)); + update->Append(std::move(dict)); base::HistogramTester tester; ResetAccountTracker(); @@ -1761,10 +1755,9 @@ account_tracker() ->GetAccountInfo(AccountKeyToAccountId(kAccountKeyAlpha)) .capabilities.can_offer_extended_chrome_sync_promos()); - ListPrefUpdate update(prefs(), prefs::kAccountInfo); - base::Value::List& update_list = update->GetList(); - ASSERT_FALSE(update_list.empty()); - base::Value::Dict* dict = update_list[0].GetIfDict(); + ScopedListPrefUpdate update(prefs(), prefs::kAccountInfo); + ASSERT_FALSE(update->empty()); + base::Value::Dict* dict = (*update)[0].GetIfDict(); ASSERT_TRUE(dict); const char kDeprecatedCapabilityKey[] = "accountcapabilities.can_offer_extended_chrome_sync_promos";
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc index 314f7a3..3dbd01d 100644 --- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc +++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
@@ -991,8 +991,8 @@ pref_service_.SetInteger(prefs::kAccountIdMigrationState, AccountTrackerService::MIGRATION_NOT_STARTED); - ListPrefUpdate update(&pref_service_, prefs::kAccountInfo); - update->ClearList(); + ScopedListPrefUpdate update(&pref_service_, prefs::kAccountInfo); + update->clear(); base::Value dict(base::Value::Type::DICTIONARY); dict.SetStringKey("account_id", email); dict.SetStringKey("email", email); @@ -1056,17 +1056,17 @@ pref_service_.SetInteger(prefs::kAccountIdMigrationState, AccountTrackerService::MIGRATION_NOT_STARTED); - ListPrefUpdate update(&pref_service_, prefs::kAccountInfo); - update->ClearList(); - base::Value account1(base::Value::Type::DICTIONARY); - account1.SetStringKey("account_id", email1); - account1.SetStringKey("email", email1); - account1.SetStringKey("gaia", gaia_id1); + ScopedListPrefUpdate update(&pref_service_, prefs::kAccountInfo); + update->clear(); + base::Value::Dict account1; + account1.Set("account_id", email1); + account1.Set("email", email1); + account1.Set("gaia", gaia_id1); update->Append(std::move(account1)); - base::Value account2(base::Value::Type::DICTIONARY); - account2.SetStringKey("account_id", email2); - account2.SetStringKey("email", email2); - account2.SetStringKey("gaia", gaia_id2); + base::Value::Dict account2; + account2.Set("account_id", email2); + account2.Set("email", email2); + account2.Set("gaia", gaia_id2); update->Append(std::move(account2)); account_tracker_service_.ResetForTesting();
diff --git a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc index c46414e8..7d6df351 100644 --- a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc +++ b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
@@ -306,12 +306,12 @@ PrefService* client_prefs = signin_client()->GetPrefs(); client_prefs->SetInteger(prefs::kAccountIdMigrationState, AccountTrackerService::MIGRATION_NOT_STARTED); - ListPrefUpdate update(client_prefs, prefs::kAccountInfo); - update->ClearList(); - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetStringKey("account_id", email); - dict.SetStringKey("email", email); - dict.SetStringKey("gaia", gaia_id); + ScopedListPrefUpdate update(client_prefs, prefs::kAccountInfo); + update->clear(); + base::Value::Dict dict; + dict.Set("account_id", email); + dict.Set("email", email); + dict.Set("gaia", gaia_id); update->Append(std::move(dict)); account_tracker()->ResetForTesting(); @@ -337,12 +337,12 @@ PrefService* client_prefs = signin_client()->GetPrefs(); client_prefs->SetInteger(prefs::kAccountIdMigrationState, AccountTrackerService::MIGRATION_NOT_STARTED); - ListPrefUpdate update(client_prefs, prefs::kAccountInfo); - update->ClearList(); - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetStringKey("account_id", email); - dict.SetStringKey("email", email); - dict.SetStringKey("gaia", gaia_id); + ScopedListPrefUpdate update(client_prefs, prefs::kAccountInfo); + update->clear(); + base::Value::Dict dict; + dict.Set("account_id", email); + dict.Set("email", email); + dict.Set("gaia", gaia_id); update->Append(std::move(dict)); account_tracker()->ResetForTesting();
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index b3e774c..526c981 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -389,7 +389,7 @@ <translation id="1919367280705858090">الحصول على مساعدة بخصوص رسالة خطأ محددة</translation> <translation id="192020519938775529">{COUNT,plural, =0{بدون}=1{موقع واحد}two{ موقعان (#)}few{# مواقع}many{# موقعًا}other{# موقع}}</translation> <translation id="1924727005275031552">جديد</translation> -<translation id="1927439593081478069">زر تشغيل ميزة "تأكيد السلامة" في Chrome، اضغط على مفتاح Enter لتشغيل هذه الميزة في إعدادات Chrome</translation> +<translation id="1927439593081478069">زر تفعيل ميزة "التحقّق من الأمان" في Chrome، اضغط على مفتاح Enter لتفعيل هذه الميزة في إعدادات Chrome</translation> <translation id="1939175642807587452">السماح للموقع الإلكتروني بطلب إرسال إشعارات</translation> <translation id="1943994668912612445">تصميم</translation> <translation id="1945968466830820669">قد تفقد إمكانية الوصول إلى حساب مؤسستك أو تتعرَّض لسرقة هويتك. لذا، يوصي Chromium بتغيير كلمة مرورك الآن.</translation> @@ -421,6 +421,7 @@ <translation id="2034971124472263449">الحفظ على أي حال</translation> <translation id="2035400064145347639">أدلّة السفر وقصص رحلات</translation> <translation id="2036983605131262583">اللفافة البديلة</translation> +<translation id="2040463897538655645">وحدة التخزين القابلة للإزالة</translation> <translation id="2040894699575719559">تم حظر الموقع الجغرافي</translation> <translation id="2042213636306070719">الدُرج 7</translation> <translation id="204357726431741734">يُرجى تسجيل الدخول لاستخدام كلمات المرور المحفوظة في حسابك على Google.</translation> @@ -683,7 +684,7 @@ <translation id="2715612312510870559"><ph name="UPDATE_CREDIT_CARD_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على مفتاح التبويب (Tab) ثم مفتاح Enter لإدارة الدفعات ومعلومات بطاقة الائتمان في إعدادات Chrome.</translation> <translation id="271663710482723385">اضغط على |<ph name="ACCELERATOR1" />| + |<ph name="ACCELERATOR2" />| للخروج من وضع ملء الشاشة.</translation> <translation id="2721148159707890343">تم إرسال الطلب بنجاح</translation> -<translation id="2723669454293168317">تشغيل ميزة "تأكيد السلامة" في إعدادات Chrome</translation> +<translation id="2723669454293168317">تفعيل ميزة "التحقّق من الأمان" في إعدادات Chrome</translation> <translation id="2726001110728089263">الدُرج الجانبي</translation> <translation id="2728127805433021124">شهادة الخادم موقّعة باستخدام خوارزمية توقيع ضعيفة.</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />تشغيل بيانات تشخيص الاتصال<ph name="END_LINK" /></translation> @@ -900,7 +901,7 @@ <translation id="3369459162151165748">إكسسوارات وقطع غيار مركبات</translation> <translation id="3371064404604898522">ضبط Chrome كمتصفِّح تلقائي</translation> <translation id="337363190475750230">تم إلغاء التوفير</translation> -<translation id="3375754925484257129">تشغيل ميزة "تأكيد السلامة" في Chrome</translation> +<translation id="3375754925484257129">تفعيل ميزة "التحقّق من الأمان" في Chrome</translation> <translation id="3377144306166885718">يستخدم الخادم إصدارًا قديمًا لطبقة النقل الآمنة (TLS).</translation> <translation id="3377188786107721145">خطأ في تحليل السياسة</translation> <translation id="3377736046129930310">استخدام قفل الشاشة للتأكد من البطاقات بشكلٍ أسرع</translation> @@ -990,7 +991,7 @@ <translation id="3611395257124510155">البطاقة الافتراضية لـ <ph name="CARD_IDENTIFIER" /></translation> <translation id="3614103345592970299">الحجم 2</translation> <translation id="361438452008624280">إدخال في القائمة "<ph name="LANGUAGE_ID" />": لغة غير معروفة أو غير متاحة.</translation> -<translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على مفتاح Tab ثم مفتاح Enter لتشغيل ميزة "تأكيد السلامة" في إعدادات Chrome</translation> +<translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على مفتاح Tab ثم مفتاح Enter لتفعيل ميزة "التحقّق من الأمان" في إعدادات Chrome</translation> <translation id="3615877443314183785">أدخِل تاريخ انتهاء صلاحية صحيحًا</translation> <translation id="36224234498066874">محو بيانات التصفّح...</translation> <translation id="362276910939193118">عرض السجلّ بكامله</translation> @@ -1422,7 +1423,7 @@ <translation id="4757993714154412917">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. لحماية حساباتك، يقترح متصفِّح Chromium التحقّق من كلمات المرور المحفوظة.</translation> <translation id="4758311279753947758">إضافة معلومات الاتصال</translation> <translation id="4761104368405085019">استخدام الميكروفون</translation> -<translation id="4761869838909035636">تشغيل ميزة "تأكيد السلامة" في Chrome</translation> +<translation id="4761869838909035636">تفعيل ميزة "التحقّق من الأمان" في Chrome</translation> <translation id="4764776831041365478">قد تكون صفحة الويب على العنوان <ph name="URL" /> غير متاحة مؤقتًا أو قد يكون تم نقلها نهائيًا إلى عنوان ويب جديد.</translation> <translation id="4766713847338118463">وضع دبوسَين بالأسفل</translation> <translation id="4771973620359291008">حدث خطأ غير محدّد.</translation> @@ -2386,7 +2387,7 @@ <translation id="7388594495505979117">{0,plural, =1{ستتم إعادة تشغيل جهازك بعد دقيقة واحدة}zero{ستتم إعادة تشغيل جهازك بعد # دقيقة}two{ستتم إعادة تشغيل جهازك بعد دقيقتين}few{ستتم إعادة تشغيل جهازك بعد # دقائق}many{ستتم إعادة تشغيل جهازك بعد # دقيقة}other{ستتم إعادة تشغيل جهازك بعد # دقيقة}}</translation> <translation id="7390545607259442187">التأكد من البطاقة</translation> <translation id="7392089738299859607">تعديل العنوان</translation> -<translation id="7399802613464275309">تأكيد السلامة</translation> +<translation id="7399802613464275309">التحقّق من الأمان</translation> <translation id="7400418766976504921">عنوان URL</translation> <translation id="7403392780200267761">يمكنك مشاركة علامة التبويب هذه عن طريق مشاركة الرابط وإنشاء رمز استجابة سريعة وبث المحتوى وغير ذلك</translation> <translation id="7403591733719184120">إدارة <ph name="DEVICE_NAME" /></translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 1ce05fa..3905e27 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">তথাপি ছেভ কৰক</translation> <translation id="2035400064145347639">ভ্ৰমণ সম্পৰ্কত সহায় কৰা লোক আৰু সমল</translation> <translation id="2036983605131262583">বিকল্প ৰোল</translation> +<translation id="2040463897538655645">আঁতৰাব পৰা ষ্ট’ৰেজ</translation> <translation id="2040894699575719559">অৱস্থান অৱৰোধ কৰা হৈছে</translation> <translation id="2042213636306070719">ট্ৰে’ ৭</translation> <translation id="204357726431741734">আপোনাৰ Google একাউণ্টত ষ্ট’ৰ হৈ থকা পাছৱৰ্ডসমূহ ব্যৱহাৰ কৰিবলৈ ছাইন ইন কৰক</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 3b56a143..c345332 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Запазване въпреки това</translation> <translation id="2035400064145347639">Туристически справочници и пътеводители</translation> <translation id="2036983605131262583">Алтернативна ролка</translation> +<translation id="2040463897538655645">Сменяемо хранилище</translation> <translation id="2040894699575719559">Местоположението е блокирано</translation> <translation id="2042213636306070719">Тава 7</translation> <translation id="204357726431741734">Влезте в профила си в Google, за да използвате запазените в него пароли</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 35be925..0a1e8b19 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Desa igualment</translation> <translation id="2035400064145347639">Guies i diaris de viatge</translation> <translation id="2036983605131262583">Corró alternatiu</translation> +<translation id="2040463897538655645">Emmagatzematge extraïble</translation> <translation id="2040894699575719559">S'ha bloquejat la ubicació</translation> <translation id="2042213636306070719">Safata 7</translation> <translation id="204357726431741734">Inicia la sessió per utilitzar les contrasenyes desades al teu Compte de Google</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index f7c2180..c772146 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Cadw beth bynnag</translation> <translation id="2035400064145347639">Arweinlyfrau teithio a theithluniau</translation> <translation id="2036983605131262583">Rôl Amgen</translation> +<translation id="2040463897538655645">Storfa y gellir ei thynnu</translation> <translation id="2040894699575719559">Rhwystrwyd lleoliad</translation> <translation id="2042213636306070719">Hambwrdd 7</translation> <translation id="204357726431741734">Mewngofnodwch i ddefnyddio cyfrineiriau a gedwir yn eich Cyfrif Google</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 6b37d3e7..ffb8412 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Gem alligevel</translation> <translation id="2035400064145347639">Rejsehåndbøger og -beskrivelser</translation> <translation id="2036983605131262583">Alternativ papirrulle</translation> +<translation id="2040463897538655645">Flytbart lager</translation> <translation id="2040894699575719559">Stedet er blokeret</translation> <translation id="2042213636306070719">Bakke 7</translation> <translation id="204357726431741734">Log ind for at bruge de adgangskoder, du har gemt på din Google-konto</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 0d25890..efe3316 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Trotzdem speichern</translation> <translation id="2035400064145347639">Reiseführer und -berichte</translation> <translation id="2036983605131262583">Wechselnde Rolle</translation> +<translation id="2040463897538655645">Wechselmedien</translation> <translation id="2040894699575719559">Standort blockiert</translation> <translation id="2042213636306070719">Fach 7</translation> <translation id="204357726431741734">Anmelden, um die in deinem Google-Konto gespeicherten Passwörter zu verwenden</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 57bd073a..36a10de 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -261,6 +261,7 @@ <translation id="156703335097561114">Networking information, such as addresses, interface configuration and connection quality</translation> <translation id="1567040042588613346">This policy is working as intended but the same value is set elsewhere and is superseded by this policy.</translation> <translation id="1569487616857761740">Enter expiry date</translation> +<translation id="1569694109004336106">Google Chrome is trying to turn on Windows Hello for filling in passwords.</translation> <translation id="1581080074034554886">CVC</translation> <translation id="1583429793053364125">Something went wrong while displaying this web page.</translation> <translation id="1586541204584340881">Which extensions you have installed</translation> @@ -399,6 +400,7 @@ <translation id="1958218078413065209">Your highest score is <ph name="SCORE" />.</translation> <translation id="1959001866257244765">Help improve security on the web for everyone by sending <ph name="BEGIN_WHITEPAPER_LINK" />URLs of some pages that you visit, limited system information, and some page content<ph name="END_WHITEPAPER_LINK" /> to Google. <ph name="BEGIN_PRIVACY_PAGE_LINK" />Privacy policy<ph name="END_PRIVACY_PAGE_LINK" /></translation> <translation id="1962204205936693436"><ph name="DOMAIN" /> Bookmarks</translation> +<translation id="1971033026002113380">Protect passwords with Touch ID</translation> <translation id="1973335181906896915">Serialisation error</translation> <translation id="1974060860693918893">Advanced</translation> <translation id="1975457531113383421">Input tray</translation> @@ -726,6 +728,7 @@ <translation id="2881276955470682203">Save card?</translation> <translation id="2882949212241984732">Double-gate fold</translation> <translation id="2893773853358652045">Fourth roll</translation> +<translation id="289834758818479772">If you share this device with others, you can turn on Touch ID to verify that it's you whenever you use a saved password</translation> <translation id="2900528713135656174">Create event</translation> <translation id="2903493209154104877">Addresses</translation> <translation id="290376772003165898">Page is not in <ph name="LANGUAGE" />?</translation> @@ -802,6 +805,8 @@ <translation id="3108943290502734357">Middle tray</translation> <translation id="3109728660330352905">You don't have authorisation to view this page.</translation> <translation id="3113284927548439113">Third shift</translation> +<translation id="3114040155724590991">Updating Android System + Starting your app may take longer than usual.</translation> <translation id="3115363211799416195">{0,plural, =1{Download confidential file?}other{Download confidential files?}}</translation> <translation id="3115874930288085374"><ph name="ENROLLMENT_DOMAIN" /> requires you to back up your data and return this <ph name="DEVICE_TYPE" />.</translation> <translation id="3116158981186517402">Laminate</translation> @@ -1256,6 +1261,7 @@ <translation id="4306812610847412719">clipboard</translation> <translation id="4308567447483056043">This policy is ignored because the user is unaffiliated. For this policy to be applied, the Chrome browser and profile must be managed through the Admin console by the same organisation.</translation> <translation id="4310070645992025887">Search your journeys</translation> +<translation id="4310496734563057511">If you share this device with others, you can turn on Windows Hello to verify that it's you whenever you use a saved password</translation> <translation id="4312613361423056926">B2</translation> <translation id="4312866146174492540">Block (default)</translation> <translation id="4314815835985389558">Manage sync</translation> @@ -1470,6 +1476,7 @@ <translation id="4880827082731008257">Search history</translation> <translation id="4881695831933465202">Open</translation> <translation id="4885256590493466218">Pay with <ph name="CARD_DETAIL" /> at checkout</translation> +<translation id="4887406273302438710">Protect passwords with Windows Hello</translation> <translation id="4888600795924685526">Foreign language study</translation> <translation id="4889420713887366944">Open incognito window button; press enter to open a new incognito window to browse privately</translation> <translation id="4892518386797173871">Rear</translation> @@ -1689,6 +1696,7 @@ <translation id="5426179911063097041"><ph name="SITE" /> wants to send you notifications</translation> <translation id="5428105026674456456">Spanish</translation> <translation id="5430298929874300616">Remove bookmark</translation> +<translation id="5434423669266814150">turn on Touch ID for filling in passwords</translation> <translation id="5443468954631487277">Reverse order face up</translation> <translation id="5447765697759493033">This site will not be translated</translation> <translation id="5452270690849572955">This <ph name="HOST_NAME" /> page can’t be found</translation> @@ -2466,6 +2474,7 @@ <translation id="7564049878696755256">You could lose access to your <ph name="ORG_NAME" /> account or experience identity theft. Chrome recommends changing your password now.</translation> <translation id="7564680668369175887">Estate cars</translation> <translation id="7567204685887185387">This server could not prove that it is <ph name="DOMAIN" />; its security certificate might have been issued fraudulently. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation> +<translation id="7568616151991626879">Google Chrome is trying to fill in your password on <ph name="APP_NAME" />.</translation> <translation id="7569490014721427265">Golf</translation> <translation id="7569761772822664555">Manage search engines button: press Enter to manage your default search engine and site search</translation> <translation id="7569952961197462199">Remove credit card from Chrome?</translation> @@ -2496,6 +2505,7 @@ <translation id="7637586430889951925">{COUNT,plural, =0{None}=1{1 password in your account (for <ph name="DOMAIN_LIST" />)}other{# passwords in your account (for <ph name="DOMAIN_LIST" />)}}</translation> <translation id="7638605456503525968">Serial ports</translation> <translation id="7639968568612851608">Dark grey</translation> +<translation id="7646681339175747202">The password that you just used was found in a data breach. Google Password Manager recommends changing your password now.</translation> <translation id="7647206758853451655">Print quality</translation> <translation id="7648992873808071793">Store files on this device</translation> <translation id="7653957176542370971">Payment handler sheet is closed</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 2d6d250..9844369 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Gorde, halere</translation> <translation id="2035400064145347639">Bidaia-gidak eta -dokumentalak</translation> <translation id="2036983605131262583">Ordezko arrabola</translation> +<translation id="2040463897538655645">Memoria aldagarria</translation> <translation id="2040894699575719559">Blokeatu egin da kokapena</translation> <translation id="2042213636306070719">7. erretilua</translation> <translation id="204357726431741734">Hasi saioa Google-ko kontuan gordetako pasahitzak erabiltzeko</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index cf72e748..f57d00d 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">درهرصورت ذخیره شود</translation> <translation id="2035400064145347639">راهنمای سفر و سفرنامه</translation> <translation id="2036983605131262583">رول جایگزین</translation> +<translation id="2040463897538655645">فضای ذخیرهسازی جداشدنی</translation> <translation id="2040894699575719559">مکان مسدود شد</translation> <translation id="2042213636306070719">سینی ۷</translation> <translation id="204357726431741734">ورود به سیستم برای استفاده از گذرواژههای ذخیرهشده در «حساب Google»</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index eb50cd9..7f25accd 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Tallenna silti</translation> <translation id="2035400064145347639">Matkaoppaat ja ‑päiväkirjat</translation> <translation id="2036983605131262583">Vaihtoehtoinen rulla</translation> +<translation id="2040463897538655645">Siirrettävä tallennustila</translation> <translation id="2040894699575719559">Sijainti estetty</translation> <translation id="2042213636306070719">Lokero 7</translation> <translation id="204357726431741734">Kirjaudu sisään käyttääksesi Google-tilillesi tallennettuja salasanoja</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index bf40bcb..335991a 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">I-save pa rin</translation> <translation id="2035400064145347639">Mga gabay sa paglalakbay at travelogue</translation> <translation id="2036983605131262583">Alternatibong Rolyo</translation> +<translation id="2040463897538655645">Naaalis na storage</translation> <translation id="2040894699575719559">Na-block ang lokasyon</translation> <translation id="2042213636306070719">Tray 7</translation> <translation id="204357726431741734">Mag-sign in para magamit ang mga naka-save na password sa iyong Google Account</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 8532e11..7e049fb 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">કોઈપણ રીતે સાચવો</translation> <translation id="2035400064145347639">મુસાફરીની માર્ગદર્શિકાઓ અને પ્રવાસવર્ણન</translation> <translation id="2036983605131262583">વૈકલ્પિક રોલ</translation> +<translation id="2040463897538655645">કાઢી નાખી શકાય તેવો સ્ટોરેજ</translation> <translation id="2040894699575719559">સ્થાનને બ્લૉક કર્યુ છે</translation> <translation id="2042213636306070719">ટ્રે 7</translation> <translation id="204357726431741734">તમારા Google એકાઉન્ટમાં સ્ટોર કરેલા પાસવર્ડનો ઉપયોગ કરવા માટે સાઇન ઇન કરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index b3aaf76d..4568c78 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -422,6 +422,7 @@ <translation id="2034971124472263449">फिर भी सेव करें</translation> <translation id="2035400064145347639">यात्रा गाइड और यात्रा की जानकारी</translation> <translation id="2036983605131262583">वैकल्पिक रोल</translation> +<translation id="2040463897538655645">डिवाइस का निकाले जाने लायक स्टोरेज</translation> <translation id="2040894699575719559">जगह की जानकारी पर रोक लगाई गई</translation> <translation id="2042213636306070719">ट्रे 7</translation> <translation id="204357726431741734">अपने Google खाते में सेव किए गए पासवर्ड इस्तेमाल करने के लिए साइन इन करें</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 415aa81..2b3a83e 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">אני בכל זאת רוצה לשמור</translation> <translation id="2035400064145347639">מדריכי נסיעות ויומני מסע</translation> <translation id="2036983605131262583">גליל חלופי</translation> +<translation id="2040463897538655645">אחסון נשלף</translation> <translation id="2040894699575719559">המיקום נחסם</translation> <translation id="2042213636306070719">מגש 7</translation> <translation id="204357726431741734">כדי להשתמש בסיסמאות השמורות בחשבון Google, עליך להיכנס שוב לחשבון</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index b6a6e2e..89aee75 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -174,6 +174,7 @@ <translation id="1380591466760231819">წერილის ფორმით დაკეცვა</translation> <translation id="138218114945450791">ცისფერი</translation> <translation id="1382194467192730611">USB მოწყობილობა დაშვებულია თქვენი ადმინისტრატორის მიერ</translation> +<translation id="1382378825779654399">როცა რომელიმე საიტზე ფასი დაიკლებს, ელფოსტით გაფრთხილებებს მიიღებთ. ეს გვერდი შეინახება „<ph name="LAST_BOOKMARKS_FOLDER" />“-ში.</translation> <translation id="1382912999714108023">თქვენი ამჟამინდელი ინფორმაცია არ ჩანს? დაუკავშირდით თქვენს ბანკს ინფორმაციის განახლებისთვის.</translation> <translation id="1384725838384960382">უსაფრთხო გადახდის ავტორიზაციის რეგისტრაციის ფურცელი</translation> <translation id="1386623374109090026">ანოტაციები</translation> @@ -1520,6 +1521,7 @@ <translation id="5018422839182700155">ამ გვერდის გახსნა ვერ მოხერხდა</translation> <translation id="5019198164206649151">სარეზერვო საცავი ცუდ მდგომარეობაშია</translation> <translation id="5020776957610079374">მსოფლიო მუსიკა</translation> +<translation id="5021557570875267742">გააკონტროლეთ ფასები Chrome-ის მეშვეობით</translation> <translation id="5023310440958281426">შეამოწმეთ ადმინისტრატორის წესები</translation> <translation id="5029568752722684782">ასლის გასუფთავება</translation> <translation id="5030338702439866405">გამცემი:</translation> @@ -2240,6 +2242,7 @@ <translation id="6993898126790112050">6x9 (კონვერტი)</translation> <translation id="6996312675313362352">ყოველთვის ითარგმნოს <ph name="ORIGINAL_LANGUAGE" /></translation> <translation id="6999969238895751684">გასართობის ინდუსტრია</translation> +<translation id="7003335073762455340">თქვენ თვალს ადევნებთ ამ პროდუქტს. ეს გვერდი შენახულია „<ph name="LAST_BOOKMARKS_FOLDER" />“-ში.</translation> <translation id="7004583254764674281">Windows Hello-ს გამოყენება ბარათების უფრო სწრაფად დასადასტურებლად</translation> <translation id="7006930604109697472">მაინც გაგზავნა</translation> <translation id="7012363358306927923">ჩინეთის UnionPay</translation> @@ -3034,6 +3037,7 @@ <translation id="9174623988242579721">ინდივიდუალური შეკვეთით დამზადებული და სწრაფი სატრანსპორტო საშუალებები</translation> <translation id="9174917557437862841">ჩანართის გადართვის ღილაკი, ამ ჩანართზე გადასართველად დააჭირეთ კლავიშს „Enter“</translation> <translation id="9179703756951298733">მართეთ საგადახდო და საკრედიტო ბარათების ინფორმაცია Chrome-ის პარამეტრებიდან</translation> +<translation id="9179907736442194268">მიიღეთ გაფრთხილებები ელფოსტით, როცა რომელიმე საიტზე ფასი დაიკლებს</translation> <translation id="9183302530794969518">Google Docs</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> მხარდაუჭერელ პროტოკოლს იყენებს.</translation> <translation id="9187461866967718678">ექსტრემალური სპორტი</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 5d62e61e..6a31edc 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">무시하고 저장</translation> <translation id="2035400064145347639">여행 가이드 및 여행기</translation> <translation id="2036983605131262583">대체 롤</translation> +<translation id="2040463897538655645">이동식 저장소</translation> <translation id="2040894699575719559">위치가 차단됨</translation> <translation id="2042213636306070719">트레이 7</translation> <translation id="204357726431741734">Google 계정에 저장된 비밀번호를 사용하여 로그인</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 15b4200..9e5ddb4 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Vis tiek išsaugoti</translation> <translation id="2035400064145347639">Kelionių vadovai ir dienoraščiai</translation> <translation id="2036983605131262583">Alternatyvus ritinėlis</translation> +<translation id="2040463897538655645">Pašalinama saugykla</translation> <translation id="2040894699575719559">Vietovė užblokuota</translation> <translation id="2042213636306070719">7 dėklas</translation> <translation id="204357726431741734">Prisijunkite, kad galėtumėte naudoti „Google“ paskyroje išsaugotus slaptažodžius</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 89ca9760..1110075 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -422,6 +422,7 @@ <translation id="2034971124472263449">မည်သို့ပင်ဖြစ်စေ သိမ်းရန်</translation> <translation id="2035400064145347639">ခရီးသွားလမ်းညွှန်နှင့် ခရီးသွားမှတ်တမ်းများ</translation> <translation id="2036983605131262583">အရန်အလိပ်</translation> +<translation id="2040463897538655645">ဖယ်ရှားနိုင်သည့် သိုလှောင်ခန်း</translation> <translation id="2040894699575719559">တည်နေရာကို ပိတ်ပင်ထားသည်</translation> <translation id="2042213636306070719">ဗန်း ၇</translation> <translation id="204357726431741734">သင့် Google Account တွင် သိမ်းထားသောစကားဝှက်များ အသုံးပြုရန် လက်မှတ်ထိုးဝင်ပါ</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index c18a6ac..202d17909 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Toch opslaan</translation> <translation id="2035400064145347639">Reisgidsen en reisverslagen</translation> <translation id="2036983605131262583">Alternatieve rol</translation> +<translation id="2040463897538655645">Verwijderbare opslag</translation> <translation id="2040894699575719559">Locatie geblokkeerd</translation> <translation id="2042213636306070719">Lade 7</translation> <translation id="204357726431741734">Inloggen om wachtwoorden te gebruiken die zijn opgeslagen in je Google-account</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 1134c5c..158ee0f 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Zapisz mimo to</translation> <translation id="2035400064145347639">Przewodniki turystyczne i materiały podróżnicze</translation> <translation id="2036983605131262583">Rolka alternatywna</translation> +<translation id="2040463897538655645">Pamięć wymienna</translation> <translation id="2040894699575719559">Lokalizacja zablokowana</translation> <translation id="2042213636306070719">Taca 7</translation> <translation id="204357726431741734">Zaloguj się, by używać haseł zapisanych na Twoim koncie Google</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 7466ebf..2d7a1712 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Salvează oricum</translation> <translation id="2035400064145347639">Ghiduri turistice și jurnale de călătorie</translation> <translation id="2036983605131262583">Rolă alternativă</translation> +<translation id="2040463897538655645">Stocare amovibilă</translation> <translation id="2040894699575719559">Accesul la locație a fost blocat</translation> <translation id="2042213636306070719">Tava 7</translation> <translation id="204357726431741734">Conectează-te pentru a folosi parolele salvate în Contul Google</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index b792ad0..8e7d5bc 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Все равно сохранить</translation> <translation id="2035400064145347639">Туристические ресурсы</translation> <translation id="2036983605131262583">Другой рулон</translation> +<translation id="2040463897538655645">Съемный накопитель</translation> <translation id="2040894699575719559">Местоположение заблокировано</translation> <translation id="2042213636306070719">Лоток 7</translation> <translation id="204357726431741734">Войти, чтобы использовать пароли, сохраненные в аккаунте Google</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 7fff27f..b91d33a 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -174,6 +174,7 @@ <translation id="1380591466760231819">Listový záhyb</translation> <translation id="138218114945450791">Svetlomodrá</translation> <translation id="1382194467192730611">Zariadenie USB je povolené správcom</translation> +<translation id="1382378825779654399">Keď na ktoromkoľvek webe klesne cena, dostanete e‑mailové upozornenie. Táto stránka sa uloží do priečinka <ph name="LAST_BOOKMARKS_FOLDER" />.</translation> <translation id="1382912999714108023">Nezobrazujú sa vaše aktuálne informácie? Kontaktujte svoju banku a aktualizujte ich.</translation> <translation id="1384725838384960382">Hárok overenia poverenia zabezpečenej platby</translation> <translation id="1386623374109090026">Anotácie</translation> @@ -421,6 +422,7 @@ <translation id="2034971124472263449">Napriek tomu uložiť</translation> <translation id="2035400064145347639">Turistickí sprievodcovia a cestopisy</translation> <translation id="2036983605131262583">Alternatívny kotúč</translation> +<translation id="2040463897538655645">Vymeniteľné úložisko</translation> <translation id="2040894699575719559">Poloha je blokovaná</translation> <translation id="2042213636306070719">Priehradka č. 7</translation> <translation id="204357726431741734">Prihlásiť sa a používať heslá uložené vo vašom účte Google</translation> @@ -1515,6 +1517,7 @@ <translation id="5018422839182700155">Táto stránka sa nedá otvoriť</translation> <translation id="5019198164206649151">Zlý stav záložného ukladacieho priestoru</translation> <translation id="5020776957610079374">Svetová hudba</translation> +<translation id="5021557570875267742">Sledovanie cien pomocou Chromu</translation> <translation id="5023310440958281426">Skontrolujte pravidlá správcu</translation> <translation id="5029568752722684782">Vymazať kópiu</translation> <translation id="5030338702439866405">Vydavateľ</translation> @@ -2234,6 +2237,7 @@ <translation id="6993898126790112050">6x9 (obálka)</translation> <translation id="6996312675313362352">Vždy prekladať jazyk <ph name="ORIGINAL_LANGUAGE" /></translation> <translation id="6999969238895751684">Zábavný priemysel</translation> +<translation id="7003335073762455340">Tento produkt sledujete. Táto stránka je uložená v priečinku <ph name="LAST_BOOKMARKS_FOLDER" />.</translation> <translation id="7004583254764674281">Potvrdzujte karty rýchlejšie pomocou služby Windows Hello</translation> <translation id="7006930604109697472">Aj tak odoslať</translation> <translation id="7012363358306927923">China UnionPay</translation> @@ -3029,6 +3033,7 @@ <translation id="9174623988242579721">Upravené a výkonné vozidlá</translation> <translation id="9174917557437862841">Tlačidlo na prepnutie karty, stlačením klávesa Enter prepnite na túto kartu</translation> <translation id="9179703756951298733">Spravovať platby a informácie o kreditných kartách v nastaveniach Chromu</translation> +<translation id="9179907736442194268">Dostávajte e‑mailové upozornenia, keď na ľubovoľnom webe klesne cena</translation> <translation id="9183302530794969518">Dokumenty Google</translation> <translation id="9183425211371246419">Web <ph name="HOST_NAME" /> využíva nepodporovaný protokol.</translation> <translation id="9187461866967718678">Extrémne športy</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index ada52f2..8cfb71f 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Vseeno shrani</translation> <translation id="2035400064145347639">Vodniki in potopisi</translation> <translation id="2036983605131262583">Nadomestni kolut</translation> +<translation id="2040463897538655645">Izmenljiva shramba</translation> <translation id="2040894699575719559">Lokacija je blokirana</translation> <translation id="2042213636306070719">Pladenj 7</translation> <translation id="204357726431741734">Prijavite se, če želite uporabljati gesla, shranjena v računu Google</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index d9c11a20..743b40e8 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -176,6 +176,7 @@ <translation id="1380591466760231819">లెటర్ ఫోల్డ్</translation> <translation id="138218114945450791">లేత నీలి రంగు</translation> <translation id="1382194467192730611">మీ నిర్వాహకుడు అనుమతించే USB పరికరం</translation> +<translation id="1382378825779654399">ఏదైనా సైట్లో ధర తగ్గితే, మీరు ఈమెయిల్ అలర్ట్లను పొందుతారు. ఈ పేజీ <ph name="LAST_BOOKMARKS_FOLDER" />లో సేవ్ చేయబడుతుంది.</translation> <translation id="1382912999714108023">మీ ప్రస్తుత సమాచారం కనిపించలేదా? దీన్ని అప్డేట్ చేయడం కోసం మీ బ్యాంక్ను సంప్రదించండి.</translation> <translation id="1384725838384960382">సురక్షిత పేమెంట్ ఆధారాల ప్రామాణీకరణ షీట్</translation> <translation id="1386623374109090026">అదనపు గమనికలు</translation> @@ -1522,6 +1523,7 @@ <translation id="5018422839182700155">ఈ పేజీని తెరవడం సాధ్యపడదు</translation> <translation id="5019198164206649151">బ్యాకింగ్ నిల్వ చెల్లని స్థితిలో ఉంది</translation> <translation id="5020776957610079374">ప్రపంచవ్యాప్తంగాా వినదగిన మ్యూజిక్</translation> +<translation id="5021557570875267742">Chromeతో ధరలు ట్రాక్ చేయండి</translation> <translation id="5023310440958281426">మీ నిర్వాహకుని విధానాలను చూడండి</translation> <translation id="5029568752722684782">కాపీని తీసివేయండి</translation> <translation id="5030338702439866405">వీరిచే జారీచేయబడింది</translation> @@ -2242,6 +2244,7 @@ <translation id="6993898126790112050">6x9 (ఎన్వలప్)</translation> <translation id="6996312675313362352"><ph name="ORIGINAL_LANGUAGE" />భాషలోని కంటెంట్ను ఎల్లప్పుడూ అనువదించు</translation> <translation id="6999969238895751684">వినోద పరిశ్రమ</translation> +<translation id="7003335073762455340">మీరు ఈ ప్రోడక్ట్ను ట్రాక్ చేస్తున్నారు. ఈ పేజీ <ph name="LAST_BOOKMARKS_FOLDER" />లో సేవ్ చేయబడింది.</translation> <translation id="7004583254764674281">కార్డ్లను వేగంగా నిర్ధారించడానికి Windows Helloను ఉపయోగించండి</translation> <translation id="7006930604109697472">ఏదేమైనా పంపు</translation> <translation id="7012363358306927923">చైనా యూనియన్ పే</translation> @@ -3036,6 +3039,7 @@ <translation id="9174623988242579721">అనుకూలంగా మార్పులు చేసిన & ఉత్తమ పనితీరు గల వాహనాలు</translation> <translation id="9174917557437862841">ట్యాబ్ స్విచ్ బటన్, ఈ ట్యాబ్కి మారడానికి ఎంటర్ని నొక్కండి</translation> <translation id="9179703756951298733">Chrome సెట్టింగ్లలో మీ పేమెంట్లను, క్రెడిట్ కార్డ్ సమాచారాన్ని మేనేజ్ చేయండి</translation> +<translation id="9179907736442194268">ఏదైనా సైట్లో ధర తగ్గితే, ఈమెయిల్ అలర్ట్లను పొందండి</translation> <translation id="9183302530794969518">Google Docs</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> మద్దతు లేని ప్రోటోకాల్ను ఉపయోగిస్తోంది.</translation> <translation id="9187461866967718678">ప్రమాదకర క్రీడలు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index b5cfcf8..d51630b 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -174,6 +174,7 @@ <translation id="1380591466760231819">พับแบบจดหมาย</translation> <translation id="138218114945450791">ฟ้าอ่อน</translation> <translation id="1382194467192730611">อุปกรณ์ USB ที่ผู้ดูแลระบบอนุญาต</translation> +<translation id="1382378825779654399">คุณจะได้รับการแจ้งเตือนทางอีเมลหากราคาลดลงในเว็บไซต์ใดก็ตาม ระบบจะบันทึกหน้านี้ไว้ใน<ph name="LAST_BOOKMARKS_FOLDER" /></translation> <translation id="1382912999714108023">หากไม่เห็นข้อมูลปัจจุบันของคุณ โปรดติดต่อธนาคารเพื่ออัปเดต</translation> <translation id="1384725838384960382">ชีตการตรวจสอบสิทธิ์ข้อมูลเข้าสู่ระบบการชำระเงินที่ปลอดภัย</translation> <translation id="1386623374109090026">คำอธิบายประกอบ</translation> @@ -260,6 +261,7 @@ <translation id="156703335097561114">ข้อมูลการเชื่อมต่อเครือข่าย เช่น ที่อยู่ การกำหนดค่าอินเทอร์เฟซ และคุณภาพการเชื่อมต่อ</translation> <translation id="1567040042588613346">นโยบายนี้ทำงานตามที่ควรจะเป็นแต่มีการตั้งค่าเดียวกันไว้ที่อื่นและถูกแทนที่โดยนโยบายนี้</translation> <translation id="1569487616857761740">ป้อนวันที่หมดอายุ</translation> +<translation id="1569694109004336106">Google Chrome กำลังพยายามเปิด Windows Hello เพื่อป้อนรหัสผ่าน</translation> <translation id="1581080074034554886">CVC</translation> <translation id="1583429793053364125">มีสิ่งผิดปกติเกิดขึ้นในขณะที่แสดงหน้าเว็บนี้</translation> <translation id="1586541204584340881">ส่วนขยายที่คุณติดตั้ง</translation> @@ -398,6 +400,7 @@ <translation id="1958218078413065209">คะแนนสูงสุดของคุณคือ <ph name="SCORE" /></translation> <translation id="1959001866257244765">ช่วยปรับปรุงความปลอดภัยในอินเทอร์เน็ตสำหรับทุกคนโดยการส่ง <ph name="BEGIN_WHITEPAPER_LINK" />URL ของหน้าเว็บบางหน้าที่คุณเข้าชม ข้อมูลระบบที่จำกัด และเนื้อหาบางส่วนของหน้า<ph name="END_WHITEPAPER_LINK" />ให้ Google <ph name="BEGIN_PRIVACY_PAGE_LINK" />นโยบายความเป็นส่วนตัว<ph name="END_PRIVACY_PAGE_LINK" /></translation> <translation id="1962204205936693436">บุ๊กมาร์กของ <ph name="DOMAIN" /></translation> +<translation id="1971033026002113380">ปกป้องรหัสผ่านด้วย TouchID</translation> <translation id="1973335181906896915">ข้อผิดพลาดในการจัดเรียง</translation> <translation id="1974060860693918893">ขั้นสูง</translation> <translation id="1975457531113383421">ถาดกระดาษเข้า</translation> @@ -724,6 +727,7 @@ <translation id="2881276955470682203">บันทึกบัตรไหม</translation> <translation id="2882949212241984732">พับทบ 4 ตอน</translation> <translation id="2893773853358652045">ม้วนกระดาษ 4</translation> +<translation id="289834758818479772">หากแชร์อุปกรณ์นี้กับผู้อื่น คุณสามารถเปิด TouchID เพื่อยืนยันตัวตนทุกครั้งที่ใช้รหัสผ่านที่บันทึกไว้</translation> <translation id="2900528713135656174">สร้างกิจกรรม</translation> <translation id="2903493209154104877">ที่อยู่</translation> <translation id="290376772003165898">หน้านี้ไม่ใช่ภาษา<ph name="LANGUAGE" />ใช่ไหม</translation> @@ -800,6 +804,8 @@ <translation id="3108943290502734357">ถาดกลาง</translation> <translation id="3109728660330352905">คุณไม่มีสิทธิ์ดูหน้านี้</translation> <translation id="3113284927548439113">กะที่ 3</translation> +<translation id="3114040155724590991">กำลังอัปเดตระบบ Android + การเริ่มต้นแอปอาจใช้เวลานานกว่าปกติ</translation> <translation id="3115363211799416195">{0,plural, =1{ดาวน์โหลดไฟล์ลับใช่ไหม}other{ดาวน์โหลดไฟล์ลับใช่ไหม}}</translation> <translation id="3115874930288085374"><ph name="ENROLLMENT_DOMAIN" /> กำหนดให้คุณสำรองข้อมูลและส่งคืน <ph name="DEVICE_TYPE" /> เครื่องนี้</translation> <translation id="3116158981186517402">แยกออกเป็นชั้นๆ</translation> @@ -1253,6 +1259,7 @@ <translation id="4306812610847412719">คลิปบอร์ด</translation> <translation id="4308567447483056043">ระบบจะไม่สนใจนโยบายนี้เนื่องจากเป็นผู้ใช้ที่ไม่ได้เชื่อมโยง เบราว์เซอร์และโปรไฟล์ Chrome ต้องมีการจัดการผ่านคอนโซลผู้ดูแลระบบโดยองค์กรเดียวกันจึงจะใช้นโยบายนี้ได้</translation> <translation id="4310070645992025887">ค้นหาเส้นทางการท่องเว็บ</translation> +<translation id="4310496734563057511">หากแชร์อุปกรณ์นี้กับผู้อื่น คุณสามารถเปิด Windows Hello เพื่อยืนยันตัวตนทุกครั้งที่ใช้รหัสผ่านที่บันทึกไว้</translation> <translation id="4312613361423056926">B2</translation> <translation id="4312866146174492540">บล็อก (ค่าเริ่มต้น)</translation> <translation id="4314815835985389558">จัดการการซิงค์</translation> @@ -1467,6 +1474,7 @@ <translation id="4880827082731008257">ค้นประวัติการเข้าชม</translation> <translation id="4881695831933465202">เปิด</translation> <translation id="4885256590493466218">ชำระเงินด้วย <ph name="CARD_DETAIL" /> ที่จุดชำระเงิน</translation> +<translation id="4887406273302438710">ปกป้องรหัสผ่านด้วย Windows Hello</translation> <translation id="4888600795924685526">การเรียนภาษาต่างประเทศ</translation> <translation id="4889420713887366944">ปุ่มเปิดหน้าต่างที่ไม่ระบุตัวตน กด Enter เพื่อเปิดหน้าต่างใหม่ที่ไม่ระบุตัวตนเพื่อท่องเว็บแบบส่วนตัว</translation> <translation id="4892518386797173871">หลัง</translation> @@ -1518,6 +1526,7 @@ <translation id="5018422839182700155">ไม่สามารถเปิดหน้านี้</translation> <translation id="5019198164206649151">ไม่สามารถจัดเก็บเนื่องจากระบบแบ็คเอนด์อยู่ในสถานะไม่ดี</translation> <translation id="5020776957610079374">เวิลด์มิวสิก</translation> +<translation id="5021557570875267742">ติดตามราคาด้วย Chrome</translation> <translation id="5023310440958281426">ตรวจสอบนโยบายของผู้ดูแลระบบของคุณ</translation> <translation id="5029568752722684782">ล้างสำเนา</translation> <translation id="5030338702439866405">ออกโดย</translation> @@ -1685,6 +1694,7 @@ <translation id="5426179911063097041"><ph name="SITE" /> ต้องการส่งการแจ้งเตือนให้คุณ</translation> <translation id="5428105026674456456">สเปน</translation> <translation id="5430298929874300616">นำบุ๊กมาร์กออก</translation> +<translation id="5434423669266814150">เปิด TouchID เพื่อป้อนรหัสผ่าน</translation> <translation id="5443468954631487277">ลำดับย้อนกลับหงายหน้าขึ้น</translation> <translation id="5447765697759493033">ระบบจะไม่แปลไซต์นี้</translation> <translation id="5452270690849572955">ไม่พบหน้า <ph name="HOST_NAME" /> นี้</translation> @@ -2238,6 +2248,7 @@ <translation id="6993898126790112050">6x9 (ซองจดหมาย)</translation> <translation id="6996312675313362352">แปลภาษา<ph name="ORIGINAL_LANGUAGE" />เสมอ</translation> <translation id="6999969238895751684">อุตสาหกรรมบันเทิง</translation> +<translation id="7003335073762455340">คุณกำลังติดตามผลิตภัณฑ์นี้ บันทึกหน้านี้ใน<ph name="LAST_BOOKMARKS_FOLDER" />แล้ว</translation> <translation id="7004583254764674281">ใช้ Windows Hello เพื่อยืนยันบัตรได้เร็วขึ้น</translation> <translation id="7006930604109697472">ส่งเลย</translation> <translation id="7012363358306927923">China UnionPay</translation> @@ -2461,6 +2472,7 @@ <translation id="7564049878696755256">คุณอาจเข้าถึงบัญชี <ph name="ORG_NAME" /> ไม่ได้หรือถูกโจรกรรมข้อมูลประจำตัว Chrome ขอแนะนำให้เปลี่ยนรหัสผ่านตอนนี้เลย</translation> <translation id="7564680668369175887">รถโดยสาร</translation> <translation id="7567204685887185387">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะอาจมีการออกใบรับรองความปลอดภัยปลอม โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ</translation> +<translation id="7568616151991626879">Google Chrome กำลังพยายามป้อนรหัสผ่านของคุณใน "<ph name="APP_NAME" />"</translation> <translation id="7569490014721427265">กอล์ฟ</translation> <translation id="7569761772822664555">ปุ่มจัดการเครื่องมือค้นหา กด Enter เพื่อจัดการเครื่องมือค้นหาและการค้นหาเว็บไซต์เริ่มต้น</translation> <translation id="7569952961197462199">นำบัตรเครดิตออกจาก Chrome ไหม</translation> @@ -2491,6 +2503,7 @@ <translation id="7637586430889951925">{COUNT,plural, =0{ไม่มี}=1{รหัสผ่าน 1 รายการในบัญชี (สำหรับ <ph name="DOMAIN_LIST" />)}other{รหัสผ่าน # รายการในบัญชี (สำหรับ <ph name="DOMAIN_LIST" />)}}</translation> <translation id="7638605456503525968">พอร์ตอนุกรม</translation> <translation id="7639968568612851608">เทาเข้ม</translation> +<translation id="7646681339175747202">ระบบพบว่ารหัสผ่านที่คุณเพิ่งใช้มีการรั่วไหลจากการละเมิดข้อมูล Google เครื่องมือจัดการรหัสผ่านแนะนำให้เปลี่ยนรหัสผ่านทันที</translation> <translation id="7647206758853451655">คุณภาพการพิมพ์</translation> <translation id="7648992873808071793">จัดเก็บไฟล์บนอุปกรณ์นี้</translation> <translation id="7653957176542370971">แผ่นงานของเครื่องจัดการการชำระเงินปิดอยู่</translation> @@ -3033,6 +3046,7 @@ <translation id="9174623988242579721">ยานพาหนะสั่งผลิตและสมรรถนะสูง</translation> <translation id="9174917557437862841">ปุ่มเปลี่ยนแท็บ โปรดกด Enter เพื่อเปลี่ยนไปยังแท็บนี้</translation> <translation id="9179703756951298733">จัดการการชำระเงินและข้อมูลบัตรเครดิตในการตั้งค่า Chrome</translation> +<translation id="9179907736442194268">รับการแจ้งเตือนทางอีเมลหากราคาลดลงในเว็บไซต์ใดก็ตาม</translation> <translation id="9183302530794969518">Google เอกสาร</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> ใช้โปรโตคอลที่ไม่รองรับ</translation> <translation id="9187461866967718678">กีฬาผาดโผน</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 8429a65..2a39afb 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Yine de kaydet</translation> <translation id="2035400064145347639">Seyahat rehberleri ve seyahat günlükleri</translation> <translation id="2036983605131262583">Alternatif Rulo</translation> +<translation id="2040463897538655645">Çıkarılabilir depolama alanı</translation> <translation id="2040894699575719559">Konum engellendi</translation> <translation id="2042213636306070719">Tepsi 7</translation> <translation id="204357726431741734">Google Hesabınızda kayıtlı şifreleri kullanmak için oturum açın</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index eff16fe..3b1f305a 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -421,6 +421,7 @@ <translation id="2034971124472263449">Усе одно зберегти</translation> <translation id="2035400064145347639">Путівники та матеріали про подорожі</translation> <translation id="2036983605131262583">Альтернативний рулон</translation> +<translation id="2040463897538655645">Знімний носій</translation> <translation id="2040894699575719559">Доступ до геоданих заблоковано</translation> <translation id="2042213636306070719">Лоток 7</translation> <translation id="204357726431741734">Увійдіть, щоб користуватися паролями, збереженими в обліковому записі Google</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 14d733ec..04e24b9 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -422,6 +422,7 @@ <translation id="2034971124472263449">بہرحال محفوظ کریں</translation> <translation id="2035400064145347639">سفری رہنما اور سفرنامے</translation> <translation id="2036983605131262583">متبادل رول</translation> +<translation id="2040463897538655645">قابل ہٹاؤ اسٹوریج</translation> <translation id="2040894699575719559">مقام مسدود کر دیا گیا ہے</translation> <translation id="2042213636306070719">ٹرے 7</translation> <translation id="204357726431741734">اپنے Google اکاؤنٹ میں محفوظ کردہ پاس ورڈز کا استعمال کرنے کے لئے سائن ان کریں</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index f43ca75..14aaf16 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -259,6 +259,7 @@ <translation id="156703335097561114">Manzillar, interfeys konfiguratsiyasi hamda ulanish sifati kabi tarmoqga oid axborot</translation> <translation id="1567040042588613346">Bu parametr xatosiz ishlayapti, lekin boshqa qaysidir parametr qiymati bilan almashtirildi.</translation> <translation id="1569487616857761740">Amal qilish muddatini kiriting</translation> +<translation id="1569694109004336106">Google Chrome parollarni kiritishda Windows Hello himoyasini yoqishga urinmoqda.</translation> <translation id="1581080074034554886">CVC</translation> <translation id="1583429793053364125">Veb-sahifani ochish vaqtida kutilmagan xatolik yuz berdi.</translation> <translation id="1586541204584340881">Oʻrnatilgan kengaytmalar</translation> @@ -397,6 +398,7 @@ <translation id="1958218078413065209">Eng yuqori ballingiz: <ph name="SCORE" />.</translation> <translation id="1959001866257244765"><ph name="BEGIN_WHITEPAPER_LINK" />Ochilgan sahifalar manzillari, tizim va sahifalar<ph name="END_WHITEPAPER_LINK" /> haqidagi ayrim maʼlumotlarni Google serverlariga yuborish orqali internetdagi xavfsizlik tizimini hamma uchun yaxshilashga yordam berasiz. <ph name="BEGIN_PRIVACY_PAGE_LINK" />Maxfiylik siyosati<ph name="END_PRIVACY_PAGE_LINK" /></translation> <translation id="1962204205936693436"><ph name="DOMAIN" /> xatcho‘plari</translation> +<translation id="1971033026002113380">Parollarni TouchID yordamida himoyalash</translation> <translation id="1973335181906896915">Seriyalashtirish amali bajarilmadi</translation> <translation id="1974060860693918893">Qo‘shimcha</translation> <translation id="1975457531113383421">Kiritish tarnovi</translation> @@ -724,6 +726,7 @@ <translation id="2881276955470682203">Karta eslab qolinsinmi?</translation> <translation id="2882949212241984732">Darvozasimon shaklida taxlash</translation> <translation id="2893773853358652045">Toʻrtinchi oʻram</translation> +<translation id="289834758818479772">Bu qurilmani boshqalar bilan birga ishlatsangiz, saqlangan parollaringizdan foydalanishda TouchID tekshiruvini yoqishingiz mumkin.</translation> <translation id="2900528713135656174">Tadbir yaratish</translation> <translation id="2903493209154104877">Manzillar</translation> <translation id="290376772003165898">Sahifa <ph name="LANGUAGE" /> tilida emasmi?</translation> @@ -800,6 +803,8 @@ <translation id="3108943290502734357">Oʻrta tarnov</translation> <translation id="3109728660330352905">Sizda bu sahifani ko‘rishga ruxsat yo‘q.</translation> <translation id="3113284927548439113">Uchinchi siljish</translation> +<translation id="3114040155724590991">Android tizimi yangilanmoqda + Ilova odatdagidan kechroq ishga tushishi mumkin.</translation> <translation id="3115363211799416195">{0,plural, =1{Maxfiy fayl yuklab olinsinmi?}other{Maxfiy fayllar yuklab olinsinmi?}}</translation> <translation id="3115874930288085374"><ph name="ENROLLMENT_DOMAIN" /> maʼlumotlaringizni zaxiralash va bu <ph name="DEVICE_TYPE" /> qurilmasini qaytarishingizni talab qilmoqda.</translation> <translation id="3116158981186517402">Laminatsiyalash</translation> @@ -1250,6 +1255,7 @@ <translation id="4306812610847412719">vaqtinchalik xotira</translation> <translation id="4308567447483056043">Bu parametr foydalanuvchi begonaligi uchun inkor etildi. Bu parametr tatbiq qilinishi uchun Chrome brauzeri va profili bir xil tashkilot tomonidan administrator konsoli orqali boshqarilishi lozim.</translation> <translation id="4310070645992025887">Sayohatlar xizmatidan qidirish</translation> +<translation id="4310496734563057511">Bu qurilmani boshqalar bilan birga ishlatsangiz, saqlangan parollaringizdan foydalanishda Windows Hello tekshiruvini yoqishingiz mumkin.</translation> <translation id="4312613361423056926">B2</translation> <translation id="4312866146174492540">Bloklansin (standart parametr)</translation> <translation id="4314815835985389558">Sinxronizatsiyani boshqarish</translation> @@ -1464,6 +1470,7 @@ <translation id="4880827082731008257">Qidiruv tarixi</translation> <translation id="4881695831933465202">Ochish</translation> <translation id="4885256590493466218">Hisob-kitob vaqtida <ph name="CARD_DETAIL" /> bilan toʻlang</translation> +<translation id="4887406273302438710">Parollarni Windows Hello yordamida himoyalash</translation> <translation id="4888600795924685526">Chet tillarini oʻrganish</translation> <translation id="4889420713887366944">Inkognito oynasini ochish tugmasi, yangi Inkognito oynasini ochib internetni kuzatuvsiz kezish uchun Enter tugmasini bosing</translation> <translation id="4892518386797173871">Orqasi</translation> @@ -1682,6 +1689,7 @@ <translation id="5426179911063097041"><ph name="SITE" /> sayti bildirishnoma yuborishga ruxsat so‘ramoqda.</translation> <translation id="5428105026674456456">Ispancha</translation> <translation id="5430298929874300616">Xatcho‘pni o‘chirish</translation> +<translation id="5434423669266814150">parollarni kiritishda TouchID tekshiruvini yoqish</translation> <translation id="5443468954631487277">Teskari tartibda old tomonida</translation> <translation id="5447765697759493033">Bu sayt tarjima qilinmaydi</translation> <translation id="5452270690849572955"><ph name="HOST_NAME" /> sahifasi topilmadi</translation> @@ -2457,6 +2465,7 @@ <translation id="7564049878696755256"><ph name="ORG_NAME" /> hisobingiz xavf ostida va shaxsiy ma’lumotlaringizni kimdir ko‘rishi mumkin. Parolingizni hoziroq o‘zgartirishni tavsiya etamiz.</translation> <translation id="7564680668369175887">Ulama vagonlar</translation> <translation id="7567204685887185387">Bu <ph name="DOMAIN" /> serveri ekanligini tasdiqlab bo‘lmadi. Uning havfsizlik sertifikati ishonchli tuyulmayapti. Server noto‘g‘ri sozlangan yoki kimdir ma’lumotlaringizni o‘g‘rilashga urinayotgan bo‘lishi mumkin.</translation> +<translation id="7568616151991626879">Google Chrome parollarni kiritishda <ph name="APP_NAME" /> himoyasini yoqishga urinmoqda.</translation> <translation id="7569490014721427265">Golf</translation> <translation id="7569761772822664555">Qidiruv tizimlarini boshqarish tugmasi, birlamchi qidiruv tizimi va qidiruv saytini boshqarish uchun Enter tugmasini bosing</translation> <translation id="7569952961197462199">Bu kredit karta Chrome’dan o‘chirib tashlansinmi?</translation> @@ -2487,6 +2496,7 @@ <translation id="7637586430889951925">{COUNT,plural, =0{Yoʻq}=1{Hisobingizda 1 ta parol bor (<ph name="DOMAIN_LIST" /> uchun)}other{Hisobingizda # ta parol bor (<ph name="DOMAIN_LIST" /> uchun)}}</translation> <translation id="7638605456503525968">Ketma-ket portlar</translation> <translation id="7639968568612851608">Toʻq kulrang</translation> +<translation id="7646681339175747202">Hozirgina siz foydalangan parol oshkor qilingan. Google Parollar menejeri bu parolni hoziroq almashtirishni tavsiya etadi.</translation> <translation id="7647206758853451655">Bosma sifati</translation> <translation id="7648992873808071793">Fayllarni bu qurilmada saqlash</translation> <translation id="7653957176542370971">Toʻlovlarni qayta ishlash vositasi yopildi</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index d929200..8644d9b9 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -174,6 +174,7 @@ <translation id="1380591466760231819">三折頁</translation> <translation id="138218114945450791">淺藍色</translation> <translation id="1382194467192730611">系統管理員允許使用的 USB 裝置</translation> +<translation id="1382378825779654399">如果產品在任何網站上降價,系統將向您傳送電郵警示。此網頁將會儲存至「<ph name="LAST_BOOKMARKS_FOLDER" />」。</translation> <translation id="1382912999714108023">目前的資料不正確?請通知銀行更新。</translation> <translation id="1384725838384960382">安全付款憑證驗證工作表</translation> <translation id="1386623374109090026">註解</translation> @@ -421,6 +422,7 @@ <translation id="2034971124472263449">仍要儲存</translation> <translation id="2035400064145347639">旅遊指南和遊記</translation> <translation id="2036983605131262583">替用卷</translation> +<translation id="2040463897538655645">可攜式儲存裝置</translation> <translation id="2040894699575719559">位置已封鎖</translation> <translation id="2042213636306070719">紙匣 7</translation> <translation id="204357726431741734">登入即可使用儲存在 Google 帳戶中的密碼</translation> @@ -1518,6 +1520,7 @@ <translation id="5018422839182700155">無法開啟此網頁</translation> <translation id="5019198164206649151">備份儲存狀態不佳</translation> <translation id="5020776957610079374">世界音樂</translation> +<translation id="5021557570875267742">使用 Chrome 追蹤價格</translation> <translation id="5023310440958281426">請查看您的管理員政策</translation> <translation id="5029568752722684782">清除副本</translation> <translation id="5030338702439866405">發行者:</translation> @@ -2238,6 +2241,7 @@ <translation id="6993898126790112050">6x9 (信封)</translation> <translation id="6996312675313362352">一律翻譯<ph name="ORIGINAL_LANGUAGE" /></translation> <translation id="6999969238895751684">娛樂業</translation> +<translation id="7003335073762455340">您正在追蹤此產品。此網頁已儲存在「<ph name="LAST_BOOKMARKS_FOLDER" />」中。</translation> <translation id="7004583254764674281">使用 Windows Hello 可加快確認付款卡</translation> <translation id="7006930604109697472">仍要傳送</translation> <translation id="7012363358306927923">中國銀聯</translation> @@ -3032,6 +3036,7 @@ <translation id="9174623988242579721">改裝車和性能車</translation> <translation id="9174917557437862841">分頁切換按鈕,㩒一下 Enter 鍵就可以轉去呢個分頁</translation> <translation id="9179703756951298733">在 Chrome 設定中管理付款和信用卡資料</translation> +<translation id="9179907736442194268">如果產品在任何網站上降價,系統將向您傳送電郵警示</translation> <translation id="9183302530794969518">Google 文件</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> 使用不支援的通訊協定。</translation> <translation id="9187461866967718678">極限運動</translation>
diff --git a/components/sync/base/model_type.h b/components/sync/base/model_type.h index 21952d0..a14f532 100644 --- a/components/sync/base/model_type.h +++ b/components/sync/base/model_type.h
@@ -347,6 +347,14 @@ SHARING_MESSAGE); } +// Types for which downloaded updates are applied immediately, before all +// updates are downloaded and the Sync cycle finishes. +// For these types, ModelTypeSyncBridge::MergeSyncData() will never be called +// (since without downloading all the data, no initial merge is possible). +constexpr ModelTypeSet ApplyUpdatesImmediatelyTypes() { + return ModelTypeSet(HISTORY); +} + // User types that can be encrypted, which is a subset of UserTypes() and a // superset of AlwaysEncryptedUserTypes(); ModelTypeSet EncryptableUserTypes();
diff --git a/components/sync/engine/forwarding_model_type_processor.cc b/components/sync/engine/forwarding_model_type_processor.cc index 1ae80a47..e94125a 100644 --- a/components/sync/engine/forwarding_model_type_processor.cc +++ b/components/sync/engine/forwarding_model_type_processor.cc
@@ -48,8 +48,10 @@ void ForwardingModelTypeProcessor::OnUpdateReceived( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) { - processor_->OnUpdateReceived(type_state, std::move(updates)); + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { + processor_->OnUpdateReceived(type_state, std::move(updates), + std::move(gc_directive)); } } // namespace syncer
diff --git a/components/sync/engine/forwarding_model_type_processor.h b/components/sync/engine/forwarding_model_type_processor.h index 3d1b0071..da1d4ec 100644 --- a/components/sync/engine/forwarding_model_type_processor.h +++ b/components/sync/engine/forwarding_model_type_processor.h
@@ -37,7 +37,9 @@ const FailedCommitResponseDataList& error_response_list) override; void OnCommitFailed(SyncCommitError commit_error) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) override; + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; private: const raw_ptr<ModelTypeProcessor> processor_;
diff --git a/components/sync/engine/get_updates_processor.cc b/components/sync/engine/get_updates_processor.cc index 8fdf06b..f9c1bde75 100644 --- a/components/sync/engine/get_updates_processor.cc +++ b/components/sync/engine/get_updates_processor.cc
@@ -207,7 +207,7 @@ sync_pb::DataTypeProgressMarker* progress_marker = get_updates->add_from_progress_marker(); *progress_marker = handler_it->second->GetDownloadProgress(); - progress_marker->clear_gc_directive(); + DCHECK(!progress_marker->has_gc_directive()); sync_pb::DataTypeContext context = handler_it->second->GetDataTypeContext(); if (!context.context().empty())
diff --git a/components/sync/engine/model_type_processor.h b/components/sync/engine/model_type_processor.h index a4112476..5c24f5db 100644 --- a/components/sync/engine/model_type_processor.h +++ b/components/sync/engine/model_type_processor.h
@@ -9,7 +9,9 @@ #include "base/callback_forward.h" #include "components/sync/engine/commit_and_get_updates_types.h" +#include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/model_type_state.pb.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace syncer { class CommitQueue; @@ -52,8 +54,10 @@ // Informs this object that there are some incoming updates it should // handle. - virtual void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) = 0; + virtual void OnUpdateReceived( + const sync_pb::ModelTypeState& type_state, + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) = 0; }; } // namespace syncer
diff --git a/components/sync/engine/model_type_processor_proxy.cc b/components/sync/engine/model_type_processor_proxy.cc index c67c508b..6e26aa5 100644 --- a/components/sync/engine/model_type_processor_proxy.cc +++ b/components/sync/engine/model_type_processor_proxy.cc
@@ -70,10 +70,12 @@ void ModelTypeProcessorProxy::OnUpdateReceived( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) { + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { task_runner_->PostTask( - FROM_HERE, base::BindOnce(&ModelTypeProcessor::OnUpdateReceived, - processor_, type_state, std::move(updates))); + FROM_HERE, + base::BindOnce(&ModelTypeProcessor::OnUpdateReceived, processor_, + type_state, std::move(updates), std::move(gc_directive))); } } // namespace syncer
diff --git a/components/sync/engine/model_type_processor_proxy.h b/components/sync/engine/model_type_processor_proxy.h index dd750b16..76e47ab 100644 --- a/components/sync/engine/model_type_processor_proxy.h +++ b/components/sync/engine/model_type_processor_proxy.h
@@ -31,7 +31,9 @@ const FailedCommitResponseDataList& error_response_list) override; void OnCommitFailed(SyncCommitError commit_error) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) override; + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; private: base::WeakPtr<ModelTypeProcessor> processor_;
diff --git a/components/sync/engine/model_type_worker.cc b/components/sync/engine/model_type_worker.cc index 474c05d..262b05f 100644 --- a/components/sync/engine/model_type_worker.cc +++ b/components/sync/engine/model_type_worker.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/containers/contains.h" #include "base/containers/cxx20_erase.h" +#include "base/feature_list.h" #include "base/format_macros.h" #include "base/guid.h" #include "base/logging.h" @@ -225,6 +226,11 @@ DCHECK(cryptographer_); DCHECK(!AlwaysEncryptedUserTypes().Has(type_) || encryption_enabled_); + // GC directive is stored independently of progress marker and is used during + // a sync cycle (i.e. in-memory only). Clear GC directive on load to clean up + // previously persisted values. + model_type_state_.mutable_progress_marker()->clear_gc_directive(); + if (!CommitOnlyTypes().Has(GetModelType())) { DCHECK_EQ(type, GetModelTypeFromSpecificsFieldNumber( initial_state.progress_marker().data_type_id())); @@ -338,6 +344,7 @@ // TODO(rlarocque): Handle data type context conflicts. *model_type_state_.mutable_type_context() = mutated_context; *model_type_state_.mutable_progress_marker() = progress_marker; + ExtractGcDirective(); for (const sync_pb::SyncEntity* update_entity : applicable_updates) { RecordEntityChangeMetrics( @@ -410,6 +417,16 @@ base::UmaHistogramEnumeration(kBlockedByUndecryptableUpdateHistogramName, ModelTypeHistogramValue(type_)); } + + // Usually, updates must only be applied at the end of a sync cycle, once all + // updates have been downloaded. This is mostly important during initial sync, + // so that the merge of local and remote data can happen. + // Data types that do not do an actual merge also don't have to download all + // remote data first. Instead, apply updates as they come in. This saves the + // need to accumulate all data in memory. + if (ApplyUpdatesImmediatelyTypes().Has(type_)) { + ApplyUpdates(status); + } } // static @@ -550,9 +567,10 @@ DeduplicatePendingUpdatesBasedOnOriginatorClientItemId(); model_type_processor_->OnUpdateReceived(model_type_state_, - std::move(pending_updates_)); - + std::move(pending_updates_), + std::move(pending_gc_directive_)); pending_updates_.clear(); + pending_gc_directive_.reset(); } void ModelTypeWorker::NudgeForCommit() { @@ -928,6 +946,22 @@ return false; } +void ModelTypeWorker::ExtractGcDirective() { + DCHECK(model_type_state_.has_progress_marker()); + + if (model_type_state_.progress_marker().has_gc_directive()) { + // Keep a new GC directive if received. + pending_gc_directive_ = model_type_state_.progress_marker().gc_directive(); + model_type_state_.mutable_progress_marker()->clear_gc_directive(); + return; + } + + // Remove the GC directive if not present in the response, to mimic the + // previous behavior. + // TODO(crbug.com/1356900): keep the GC directive during current sync cycle. + pending_gc_directive_.reset(); +} + GetLocalChangesRequest::GetLocalChangesRequest( CancelationSignal* cancelation_signal) : cancelation_signal_(cancelation_signal),
diff --git a/components/sync/engine/model_type_worker.h b/components/sync/engine/model_type_worker.h index 8ef5bba..874cb1e 100644 --- a/components/sync/engine/model_type_worker.h +++ b/components/sync/engine/model_type_worker.h
@@ -27,6 +27,7 @@ #include "components/sync/engine/nudge_handler.h" #include "components/sync/engine/sync_encryption_handler.h" #include "components/sync/engine/update_handler.h" +#include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/model_type_state.pb.h" namespace sync_pb { @@ -266,6 +267,10 @@ // Returns whether |pending_updates_| contain any non-deletion update. bool HasNonDeletionUpdates() const; + // Extraxts GC directive from the progress marker to handle it independently + // of |model_type_state_|. + void ExtractGcDirective(); + const ModelType type_; const raw_ptr<Cryptographer> cryptographer_; @@ -312,6 +317,10 @@ // other. UpdateResponseDataList pending_updates_; + // Pending GC directive if received during the current sync cycle. If there + // are several pending GC directives, the latest one will be stored. + absl::optional<sync_pb::GarbageCollectionDirective> pending_gc_directive_; + // Indicates if processor has local changes. Processor only nudges worker once // and worker might not be ready to commit entities at the time. HasLocalChangesState has_local_changes_state_ = kNoNudgedLocalChanges;
diff --git a/components/sync/model/client_tag_based_model_type_processor.cc b/components/sync/model/client_tag_based_model_type_processor.cc index dfb04d3..631efe9 100644 --- a/components/sync/model/client_tag_based_model_type_processor.cc +++ b/components/sync/model/client_tag_based_model_type_processor.cc
@@ -155,7 +155,8 @@ // For commit-only types, no updates are expected and hence we can // consider initial_sync_done(), reflecting that sync is enabled. model_type_state.set_initial_sync_done(true); - OnFullUpdateReceived(model_type_state, UpdateResponseDataList()); + OnFullUpdateReceived(model_type_state, UpdateResponseDataList(), + /*gc_directive=*/absl::nullopt); DCHECK(entity_tracker_); } else { activation_response->model_type_state = model_type_state; @@ -699,10 +700,9 @@ // Returns whether the state has a version_watermark based GC directive, which // tells us to clear all sync data that's stored locally. -bool HasClearAllDirective(const sync_pb::ModelTypeState& model_type_state) { - return model_type_state.progress_marker() - .gc_directive() - .has_version_watermark(); +bool HasClearAllDirective( + const absl::optional<sync_pb::GarbageCollectionDirective>& gc_directive) { + return gc_directive.has_value() && gc_directive->has_version_watermark(); } void ClientTagBasedModelTypeProcessor::OnCommitFailed( @@ -726,16 +726,18 @@ void ClientTagBasedModelTypeProcessor::OnUpdateReceived( const sync_pb::ModelTypeState& model_type_state, - UpdateResponseDataList updates) { + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(model_ready_to_sync_); DCHECK(!model_error_); + DCHECK(!model_type_state.progress_marker().has_gc_directive()); const bool is_initial_sync = !IsTrackingMetadata(); LogUpdatesReceivedByProcessorHistogram(type_, is_initial_sync, updates.size()); - if (!ValidateUpdate(model_type_state, updates)) { + if (!ValidateUpdate(model_type_state, updates, gc_directive)) { return; } @@ -749,9 +751,10 @@ // on the client, without having to know exactly which entities the client // has. const bool treating_as_full_update = - is_initial_sync || HasClearAllDirective(model_type_state); + is_initial_sync || HasClearAllDirective(gc_directive); if (treating_as_full_update) { - error = OnFullUpdateReceived(model_type_state, std::move(updates)); + error = OnFullUpdateReceived(model_type_state, std::move(updates), + std::move(gc_directive)); } else { error = OnIncrementalUpdateReceived(model_type_state, std::move(updates)); } @@ -789,7 +792,8 @@ bool ClientTagBasedModelTypeProcessor::ValidateUpdate( const sync_pb::ModelTypeState& model_type_state, - const UpdateResponseDataList& updates) { + const UpdateResponseDataList& updates, + const absl::optional<sync_pb::GarbageCollectionDirective>& gc_directive) { if (!entity_tracker_) { // Due to uss_migrator, initial sync (when migrating from non-USS) does not // contain any gc directives. Thus, we cannot expect the conditions below to @@ -798,7 +802,7 @@ return true; } - if (HasClearAllDirective(model_type_state) && + if (HasClearAllDirective(gc_directive) && bridge_->SupportsIncrementalUpdates()) { ReportErrorImpl(ModelError(FROM_HERE, "Received an update with version watermark for " @@ -806,7 +810,7 @@ ErrorSite::kSupportsIncrementalUpdatesMismatch); return false; - } else if (!HasClearAllDirective(model_type_state) && + } else if (!HasClearAllDirective(gc_directive) && !bridge_->SupportsIncrementalUpdates() && !updates.empty()) { // We receive an update without clear all directive from the server to // indicate no data has changed. This contradicts with the list of updates @@ -827,7 +831,8 @@ absl::optional<ModelError> ClientTagBasedModelTypeProcessor::OnFullUpdateReceived( const sync_pb::ModelTypeState& model_type_state, - UpdateResponseDataList updates) { + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { std::unique_ptr<MetadataChangeList> metadata_changes = bridge_->CreateMetadataChangeList(); DCHECK(model_ready_to_sync_); @@ -836,10 +841,10 @@ // update. DCHECK(model_type_state.initial_sync_done()); - // Ensure that this is the initial sync, and it was not already marked done. - DCHECK(HasClearAllDirective(model_type_state) || !entity_tracker_); + // Ensure that this is the initial sync or a cleanup. + DCHECK(HasClearAllDirective(gc_directive) || !entity_tracker_); - if (entity_tracker_ && HasClearAllDirective(model_type_state)) { + if (entity_tracker_ && HasClearAllDirective(gc_directive)) { ExpireAllEntries(metadata_changes.get()); entity_tracker_->set_model_type_state(model_type_state); } @@ -914,9 +919,15 @@ } // Let the bridge handle associating and merging the data. - absl::optional<ModelError> error = bridge_->MergeSyncData( - std::move(metadata_changes), std::move(entity_data)); - return error; + // For ApplyUpdatesImmediatelyTypes(), no merge is necessary or supported, so + // call ApplySyncChanges() instead. + if (ApplyUpdatesImmediatelyTypes().Has(type_)) { + return bridge_->ApplySyncChanges(std::move(metadata_changes), + std::move(entity_data)); + } + + return bridge_->MergeSyncData(std::move(metadata_changes), + std::move(entity_data)); } absl::optional<ModelError>
diff --git a/components/sync/model/client_tag_based_model_type_processor.h b/components/sync/model/client_tag_based_model_type_processor.h index 7e3e09e..32c736d8 100644 --- a/components/sync/model/client_tag_based_model_type_processor.h +++ b/components/sync/model/client_tag_based_model_type_processor.h
@@ -103,7 +103,9 @@ const FailedCommitResponseDataList& error_response_list) override; void OnCommitFailed(SyncCommitError commit_error) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) override; + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; // ModelTypeControllerDelegate implementation. // |start_callback| will never be called synchronously. @@ -161,15 +163,18 @@ // Validates the update specified by the input parameters and returns whether // it should get further processed. If the update is incorrect, this function // also reports an error. - bool ValidateUpdate(const sync_pb::ModelTypeState& model_type_state, - const UpdateResponseDataList& updates); + bool ValidateUpdate( + const sync_pb::ModelTypeState& model_type_state, + const UpdateResponseDataList& updates, + const absl::optional<sync_pb::GarbageCollectionDirective>& gc_directive); // Handle the first update received from the server after being enabled. If // the data type does not support incremental updates, this will be called for // any server update. absl::optional<ModelError> OnFullUpdateReceived( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates); + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive); // Handle any incremental updates received from the server after being // enabled.
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index fab99d7..cd8c4a3d 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -117,7 +117,8 @@ void NigoriModelTypeProcessor::OnUpdateReceived( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) { + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(model_ready_to_sync_); // If there is a model error, it must have been reported already but hasn't @@ -127,6 +128,8 @@ return; } + // TODO(crbug.com/1356900): validate incoming updates, e.g. |gc_directive| + // must be empty for Nigori. absl::optional<ModelError> error; const bool is_initial_sync = !model_type_state_.initial_sync_done();
diff --git a/components/sync/nigori/nigori_model_type_processor.h b/components/sync/nigori/nigori_model_type_processor.h index 80f3c02..4ebdbe1 100644 --- a/components/sync/nigori/nigori_model_type_processor.h +++ b/components/sync/nigori/nigori_model_type_processor.h
@@ -41,7 +41,9 @@ const CommitResponseDataList& committed_response_list, const FailedCommitResponseDataList& error_response_list) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) override; + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; // ModelTypeControllerDelegate implementation. void OnSyncStarting(const DataTypeActivationRequest& request,
diff --git a/components/sync/nigori/nigori_model_type_processor_unittest.cc b/components/sync/nigori/nigori_model_type_processor_unittest.cc index e8d18d9..b7fa36d 100644 --- a/components/sync/nigori/nigori_model_type_processor_unittest.cc +++ b/components/sync/nigori/nigori_model_type_processor_unittest.cc
@@ -426,8 +426,8 @@ MergeSyncData(OptionalEntityDataHasDecryptorTokenKeyName( kDecryptorTokenKeyName))); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); } TEST_F(NigoriModelTypeProcessorTest, ShouldApplySyncChanges) { @@ -442,8 +442,8 @@ ApplySyncChanges(OptionalEntityDataHasDecryptorTokenKeyName( kDecryptorTokenKeyName))); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); } TEST_F(NigoriModelTypeProcessorTest, ShouldApplySyncChangesWhenEmptyUpdates) { @@ -455,7 +455,8 @@ EXPECT_CALL(*mock_nigori_sync_bridge(), ApplySyncChanges(Eq(absl::nullopt))); processor()->OnUpdateReceived(CreateDummyModelTypeState(), - UpdateResponseDataList()); + UpdateResponseDataList(), + /*gc_directive=*/absl::nullopt); } TEST_F(NigoriModelTypeProcessorTest, ShouldApplySyncChangesWhenReflection) { @@ -470,8 +471,8 @@ // metadata. EXPECT_CALL(*mock_nigori_sync_bridge(), ApplySyncChanges(Eq(absl::nullopt))); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); } TEST_F(NigoriModelTypeProcessorTest, ShouldStopSyncingAndKeepMetadata) { @@ -533,8 +534,8 @@ MergeSyncData(OptionalEntityDataHasDecryptorTokenKeyName( kDecryptorTokenKeyName))); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); } TEST_F(NigoriModelTypeProcessorTest, ShouldDisconnectWhenMergeSyncDataFails) { @@ -560,8 +561,8 @@ ASSERT_TRUE(processor()->IsConnectedForTest()); EXPECT_CALL(error_handler_callback, Run); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); EXPECT_FALSE(processor()->IsConnectedForTest()); } @@ -589,8 +590,8 @@ ASSERT_TRUE(processor()->IsConnectedForTest()); EXPECT_CALL(error_handler_callback, Run); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); EXPECT_FALSE(processor()->IsConnectedForTest()); }
diff --git a/components/sync/test/fake_model_type_processor.cc b/components/sync/test/fake_model_type_processor.cc index 5bb64a8c..4cb9515 100644 --- a/components/sync/test/fake_model_type_processor.cc +++ b/components/sync/test/fake_model_type_processor.cc
@@ -29,6 +29,7 @@ void FakeModelTypeProcessor::OnUpdateReceived( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) {} + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) {} } // namespace syncer
diff --git a/components/sync/test/fake_model_type_processor.h b/components/sync/test/fake_model_type_processor.h index 6507674..73dc3e1e 100644 --- a/components/sync/test/fake_model_type_processor.h +++ b/components/sync/test/fake_model_type_processor.h
@@ -26,7 +26,9 @@ const CommitResponseDataList& committed_response_list, const FailedCommitResponseDataList& error_response_list) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList updates) override; + UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; }; } // namespace syncer
diff --git a/components/sync/test/mock_model_type_processor.cc b/components/sync/test/mock_model_type_processor.cc index de3c4fc..6f735dd 100644 --- a/components/sync/test/mock_model_type_processor.cc +++ b/components/sync/test/mock_model_type_processor.cc
@@ -12,6 +12,7 @@ #include "base/hash/sha1.h" #include "components/sync/base/client_tag_hash.h" #include "components/sync/engine/commit_queue.h" +#include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/entity_specifics.pb.h" namespace syncer { @@ -64,10 +65,11 @@ void MockModelTypeProcessor::OnUpdateReceived( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList response_list) { + UpdateResponseDataList response_list, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { pending_tasks_.push_back(base::BindOnce( &MockModelTypeProcessor::OnUpdateReceivedImpl, base::Unretained(this), - type_state, std::move(response_list))); + type_state, std::move(response_list), std::move(gc_directive))); if (is_synchronous_) RunQueuedTasks(); } @@ -174,6 +176,12 @@ return type_states_received_on_update_[n]; } +sync_pb::GarbageCollectionDirective MockModelTypeProcessor::GetNthGcDirective( + size_t n) const { + DCHECK_LT(n, received_gc_directives_.size()); + return received_gc_directives_[n]; +} + size_t MockModelTypeProcessor::GetNumCommitResponses() const { return received_commit_responses_.size(); } @@ -274,7 +282,8 @@ void MockModelTypeProcessor::OnUpdateReceivedImpl( const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList response_list) { + UpdateResponseDataList response_list, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { type_states_received_on_update_.push_back(type_state); for (const UpdateResponseData& response : response_list) { const ClientTagHash& client_tag_hash = response.entity.client_tag_hash; @@ -285,6 +294,8 @@ update_response_items_.insert(std::make_pair(client_tag_hash, &response)); } received_update_responses_.push_back(std::move(response_list)); + received_gc_directives_.push_back( + gc_directive.value_or(sync_pb::GarbageCollectionDirective())); } // Fetches the sequence number as of the most recent update request.
diff --git a/components/sync/test/mock_model_type_processor.h b/components/sync/test/mock_model_type_processor.h index 9ab9ffe..f51bb68 100644 --- a/components/sync/test/mock_model_type_processor.h +++ b/components/sync/test/mock_model_type_processor.h
@@ -17,6 +17,7 @@ #include "base/callback.h" #include "components/sync/engine/commit_and_get_updates_types.h" #include "components/sync/engine/model_type_processor.h" +#include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/model_type_state.pb.h" namespace syncer { @@ -54,7 +55,9 @@ const FailedCommitResponseDataList& error_response_list) override; void OnCommitFailed(SyncCommitError commit_error) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList response_list) override; + UpdateResponseDataList response_list, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; // By default, this object behaves as if all messages are processed // immediately. Sometimes it is useful to defer work until later, as might @@ -93,6 +96,7 @@ size_t GetNumUpdateResponses() const; std::vector<const UpdateResponseData*> GetNthUpdateResponse(size_t n) const; sync_pb::ModelTypeState GetNthUpdateState(size_t n) const; + sync_pb::GarbageCollectionDirective GetNthGcDirective(size_t n) const; // Getters to access the log of received commit responses. // @@ -137,8 +141,10 @@ // Process a received update response. // // Implemented as an Impl method so we can defer its execution in some cases. - void OnUpdateReceivedImpl(const sync_pb::ModelTypeState& type_state, - UpdateResponseDataList response_list); + void OnUpdateReceivedImpl( + const sync_pb::ModelTypeState& type_state, + UpdateResponseDataList response_list, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive); // Getter and setter for per-item sequence number tracking. int64_t GetCurrentSequenceNumber(const ClientTagHash& tag_hash) const; @@ -161,9 +167,10 @@ // A log of messages received by this object. std::vector<CommitResponseDataList> received_commit_responses_; + std::vector<sync_pb::ModelTypeState> type_states_received_on_commit_; std::vector<UpdateResponseDataList> received_update_responses_; std::vector<sync_pb::ModelTypeState> type_states_received_on_update_; - std::vector<sync_pb::ModelTypeState> type_states_received_on_commit_; + std::vector<sync_pb::GarbageCollectionDirective> received_gc_directives_; size_t commit_failures_count_ = 0; // Latest responses received, indexed by tag_hash.
diff --git a/components/sync/test/mock_model_type_worker.cc b/components/sync/test/mock_model_type_worker.cc index 1fc6a47..f9d300f8 100644 --- a/components/sync/test/mock_model_type_worker.cc +++ b/components/sync/test/mock_model_type_worker.cc
@@ -122,7 +122,8 @@ } void MockModelTypeWorker::UpdateFromServer() { - processor_->OnUpdateReceived(model_type_state_, UpdateResponseDataList()); + processor_->OnUpdateReceived(model_type_state_, UpdateResponseDataList(), + /*gc_directive=*/absl::nullopt); } void MockModelTypeWorker::UpdateFromServer( @@ -151,7 +152,8 @@ } void MockModelTypeWorker::UpdateFromServer(UpdateResponseDataList updates) { - processor_->OnUpdateReceived(model_type_state_, std::move(updates)); + processor_->OnUpdateReceived(model_type_state_, std::move(updates), + /*gc_directive=*/absl::nullopt); } syncer::UpdateResponseData MockModelTypeWorker::GenerateUpdateData( @@ -237,7 +239,8 @@ void MockModelTypeWorker::TombstoneFromServer(const ClientTagHash& tag_hash) { UpdateResponseDataList list; list.push_back(GenerateTombstoneUpdateData(tag_hash)); - processor_->OnUpdateReceived(model_type_state_, std::move(list)); + processor_->OnUpdateReceived(model_type_state_, std::move(list), + /*gc_directive=*/absl::nullopt); } void MockModelTypeWorker::AckOnePendingCommit() { @@ -327,20 +330,20 @@ const std::string& ekn, UpdateResponseDataList update) { model_type_state_.set_encryption_key_name(ekn); - processor_->OnUpdateReceived(model_type_state_, std::move(update)); + processor_->OnUpdateReceived(model_type_state_, std::move(update), + /*gc_directive=*/absl::nullopt); } void MockModelTypeWorker::UpdateWithGarbageCollection( const sync_pb::GarbageCollectionDirective& gcd) { - *model_type_state_.mutable_progress_marker()->mutable_gc_directive() = gcd; - processor_->OnUpdateReceived(model_type_state_, UpdateResponseDataList()); + processor_->OnUpdateReceived(model_type_state_, UpdateResponseDataList(), + gcd); } void MockModelTypeWorker::UpdateWithGarbageCollection( UpdateResponseDataList update, const sync_pb::GarbageCollectionDirective& gcd) { - *model_type_state_.mutable_progress_marker()->mutable_gc_directive() = gcd; - processor_->OnUpdateReceived(model_type_state_, std::move(update)); + processor_->OnUpdateReceived(model_type_state_, std::move(update), gcd); } std::string MockModelTypeWorker::GenerateId(const ClientTagHash& tag_hash) {
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index dde9aac7..4ab740b9 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -174,12 +174,16 @@ void BookmarkModelTypeProcessor::OnUpdateReceived( const sync_pb::ModelTypeState& model_type_state, - syncer::UpdateResponseDataList updates) { + syncer::UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!model_type_state.cache_guid().empty()); DCHECK_EQ(model_type_state.cache_guid(), cache_guid_); DCHECK(model_type_state.initial_sync_done()); + // TODO(crbug.com/1356900): validate incoming updates, e.g. |gc_directive| + // must be empty for Bookmarks. + syncer::LogUpdatesReceivedByProcessorHistogram( syncer::BOOKMARKS, /*is_initial_sync=*/!bookmark_tracker_, updates.size());
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.h b/components/sync_bookmarks/bookmark_model_type_processor.h index 86d2f91..f3e730d 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.h +++ b/components/sync_bookmarks/bookmark_model_type_processor.h
@@ -54,7 +54,9 @@ const syncer::CommitResponseDataList& committed_response_list, const syncer::FailedCommitResponseDataList& error_response_list) override; void OnUpdateReceived(const sync_pb::ModelTypeState& type_state, - syncer::UpdateResponseDataList updates) override; + syncer::UpdateResponseDataList updates, + absl::optional<sync_pb::GarbageCollectionDirective> + gc_directive) override; // ModelTypeControllerDelegate implementation. void OnSyncStarting(const syncer::DataTypeActivationRequest& request,
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc index 4c160876..5d97bf4 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -354,8 +354,8 @@ ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); base::HistogramTester histogram_tester; - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); EXPECT_THAT(processor()->GetTrackerForTest(), NotNull()); histogram_tester.ExpectUniqueSample( @@ -386,8 +386,8 @@ bookmark_model()->bookmark_bar_node(); ASSERT_TRUE(bookmark_bar->children().empty()); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); ASSERT_THAT(bookmark_bar->children().front().get(), NotNull()); EXPECT_THAT(bookmark_bar->children().front()->GetTitle(), @@ -423,8 +423,8 @@ kRandomPosition, /*response_version=*/1, bookmark_node->guid())); base::HistogramTester histogram_tester; - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); // Check if the bookmark has been updated properly. EXPECT_THAT(bookmark_bar->children().front().get(), Eq(bookmark_node)); @@ -466,8 +466,8 @@ updates[0].response_version++; EXPECT_CALL(*schedule_save_closure(), Run()); - processor()->OnUpdateReceived(CreateDummyModelTypeState(), - std::move(updates)); + processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), + /*gc_directive=*/absl::nullopt); } TEST_F(BookmarkModelTypeProcessorTest, ShouldDecodeSyncMetadata) { @@ -618,8 +618,8 @@ // Push empty updates list to the processor together with the updated model // type state. syncer::UpdateResponseDataList empty_updates_list; - processor()->OnUpdateReceived(model_type_state, - std::move(empty_updates_list)); + processor()->OnUpdateReceived(model_type_state, std::move(empty_updates_list), + /*gc_directive=*/absl::nullopt); // The model type state inside the tracker should have been updated, and // carries the new encryption key name. @@ -658,7 +658,8 @@ EXPECT_CALL(*mock_commit_queue(), NudgeForCommit()).Times(0); syncer::UpdateResponseDataList updates; updates.push_back(std::move(response_data)); - processor()->OnUpdateReceived(model_type_state, std::move(updates)); + processor()->OnUpdateReceived(model_type_state, std::move(updates), + /*gc_directive=*/absl::nullopt); // The bookmarks shouldn't be marked for committing. ASSERT_THAT(tracker->GetEntityForSyncId(kNodeId), NotNull()); @@ -852,7 +853,8 @@ // Synchronize with the server and get any updates. EXPECT_CALL(*mock_commit_queue(), NudgeForCommit()); processor()->OnUpdateReceived(CreateDummyModelTypeState(), - syncer::UpdateResponseDataList()); + syncer::UpdateResponseDataList(), + /*gc_directive=*/absl::nullopt); // Check that all entities are unsynced now and metadata is marked as // reuploaded.
diff --git a/components/sync_preferences/pref_model_associator_unittest.cc b/components/sync_preferences/pref_model_associator_unittest.cc index 8690bcb..2624a90 100644 --- a/components/sync_preferences/pref_model_associator_unittest.cc +++ b/components/sync_preferences/pref_model_associator_unittest.cc
@@ -81,16 +81,11 @@ pref_service_->GetSyncableService(syncer::PREFERENCES)); } - void SetContentPattern(base::Value* patterns_dict, + void SetContentPattern(base::Value::Dict& patterns_dict, const std::string& expression, int setting) { - base::Value* expression_dict = - patterns_dict->FindKeyOfType(expression, base::Value::Type::DICTIONARY); - if (!expression_dict) { - expression_dict = patterns_dict->SetKey( - expression, base::Value(base::Value::Type::DICTIONARY)); - } - expression_dict->SetKey("setting", base::Value(setting)); + base::Value::Dict* expression_dict = patterns_dict.EnsureDict(expression); + expression_dict->Set("setting", setting); } void SetPrefToEmpty(const std::string& pref_name) { @@ -170,9 +165,8 @@ TEST_F(ListPreferenceMergeTest, ServerNull) { auto null_value = std::make_unique<base::Value>(); { - ListPrefUpdate update(pref_service_.get(), kListPrefName); - base::Value* local_list_value = update.Get(); - local_list_value->Append(local_url0_); + ScopedListPrefUpdate update(pref_service_.get(), kListPrefName); + update->Append(local_url0_); } const PrefService::Preference* pref = @@ -187,9 +181,8 @@ TEST_F(ListPreferenceMergeTest, ServerEmpty) { std::unique_ptr<base::Value> empty_value(new base::ListValue); { - ListPrefUpdate update(pref_service_.get(), kListPrefName); - base::Value* local_list_value = update.Get(); - local_list_value->Append(local_url0_); + ScopedListPrefUpdate update(pref_service_.get(), kListPrefName); + update->Append(local_url0_); } const PrefService::Preference* pref = @@ -203,10 +196,9 @@ TEST_F(ListPreferenceMergeTest, Merge) { { - ListPrefUpdate update(pref_service_.get(), kListPrefName); - base::Value* local_list_value = update.Get(); - local_list_value->Append(local_url0_); - local_list_value->Append(local_url1_); + ScopedListPrefUpdate update(pref_service_.get(), kListPrefName); + update->Append(local_url0_); + update->Append(local_url1_); } const PrefService::Preference* pref = @@ -224,11 +216,10 @@ TEST_F(ListPreferenceMergeTest, Duplicates) { { - ListPrefUpdate update(pref_service_.get(), kListPrefName); - base::Value* local_list_value = update.Get(); - local_list_value->Append(local_url0_); - local_list_value->Append(server_url0_); - local_list_value->Append(server_url1_); + ScopedListPrefUpdate update(pref_service_.get(), kListPrefName); + update->Append(local_url0_); + update->Append(server_url0_); + update->Append(server_url1_); } const PrefService::Preference* pref = @@ -245,10 +236,9 @@ TEST_F(ListPreferenceMergeTest, Equals) { { - ListPrefUpdate update(pref_service_.get(), kListPrefName); - base::Value* local_list_value = update.Get(); - local_list_value->Append(server_url0_); - local_list_value->Append(server_url1_); + ScopedListPrefUpdate update(pref_service_.get(), kListPrefName); + update->Append(server_url0_); + update->Append(server_url1_); } base::Value original = server_url_list_.Clone(); @@ -267,9 +257,9 @@ expression2_("expression2"), expression3_("expression3"), expression4_("expression4") { - SetContentPattern(&server_patterns_, expression0_, 1); - SetContentPattern(&server_patterns_, expression1_, 2); - SetContentPattern(&server_patterns_, expression2_, 1); + SetContentPattern(server_patterns_.GetDict(), expression0_, 1); + SetContentPattern(server_patterns_.GetDict(), expression1_, 2); + SetContentPattern(server_patterns_.GetDict(), expression2_, 1); } std::string expression0_; @@ -277,7 +267,7 @@ std::string expression2_; std::string expression3_; std::string expression4_; - base::DictionaryValue server_patterns_; + base::Value server_patterns_{base::Value::Type::DICT}; }; TEST_F(DictionaryPreferenceMergeTest, LocalEmpty) { @@ -292,9 +282,8 @@ TEST_F(DictionaryPreferenceMergeTest, ServerNull) { auto null_value = std::make_unique<base::Value>(); { - DictionaryPrefUpdate update(pref_service_.get(), kDictionaryPrefName); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression3_, 1); + ScopedDictPrefUpdate update(pref_service_.get(), kDictionaryPrefName); + SetContentPattern(*update, expression3_, 1); } const PrefService::Preference* pref = @@ -309,9 +298,8 @@ TEST_F(DictionaryPreferenceMergeTest, ServerEmpty) { std::unique_ptr<base::Value> empty_value(new base::DictionaryValue); { - DictionaryPrefUpdate update(pref_service_.get(), kDictionaryPrefName); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression3_, 1); + ScopedDictPrefUpdate update(pref_service_.get(), kDictionaryPrefName); + SetContentPattern(*update, expression3_, 1); } const PrefService::Preference* pref = @@ -325,9 +313,8 @@ TEST_F(DictionaryPreferenceMergeTest, MergeNoConflicts) { { - DictionaryPrefUpdate update(pref_service_.get(), kDictionaryPrefName); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression3_, 1); + ScopedDictPrefUpdate update(pref_service_.get(), kDictionaryPrefName); + SetContentPattern(*update, expression3_, 1); } base::Value merged_value(pref_sync_service_->MergePreference( @@ -335,22 +322,21 @@ *pref_service_->FindPreference(kDictionaryPrefName)->GetValue(), server_patterns_)); - base::DictionaryValue expected; - SetContentPattern(&expected, expression0_, 1); - SetContentPattern(&expected, expression1_, 2); - SetContentPattern(&expected, expression2_, 1); - SetContentPattern(&expected, expression3_, 1); + base::Value::Dict expected; + SetContentPattern(expected, expression0_, 1); + SetContentPattern(expected, expression1_, 2); + SetContentPattern(expected, expression2_, 1); + SetContentPattern(expected, expression3_, 1); EXPECT_EQ(merged_value, expected); } TEST_F(DictionaryPreferenceMergeTest, MergeConflicts) { { - DictionaryPrefUpdate update(pref_service_.get(), kDictionaryPrefName); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression0_, 2); - SetContentPattern(local_dict_value, expression2_, 1); - SetContentPattern(local_dict_value, expression3_, 1); - SetContentPattern(local_dict_value, expression4_, 2); + ScopedDictPrefUpdate update(pref_service_.get(), kDictionaryPrefName); + SetContentPattern(*update, expression0_, 2); + SetContentPattern(*update, expression2_, 1); + SetContentPattern(*update, expression3_, 1); + SetContentPattern(*update, expression4_, 2); } base::Value merged_value(pref_sync_service_->MergePreference( @@ -358,12 +344,12 @@ *pref_service_->FindPreference(kDictionaryPrefName)->GetValue(), server_patterns_)); - base::DictionaryValue expected; - SetContentPattern(&expected, expression0_, 1); - SetContentPattern(&expected, expression1_, 2); - SetContentPattern(&expected, expression2_, 1); - SetContentPattern(&expected, expression3_, 1); - SetContentPattern(&expected, expression4_, 2); + base::Value::Dict expected; + SetContentPattern(expected, expression0_, 1); + SetContentPattern(expected, expression1_, 2); + SetContentPattern(expected, expression2_, 1); + SetContentPattern(expected, expression3_, 1); + SetContentPattern(expected, expression4_, 2); EXPECT_EQ(merged_value, expected); } @@ -382,11 +368,10 @@ TEST_F(DictionaryPreferenceMergeTest, Equal) { { - DictionaryPrefUpdate update(pref_service_.get(), kDictionaryPrefName); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression0_, 1); - SetContentPattern(local_dict_value, expression1_, 2); - SetContentPattern(local_dict_value, expression2_, 1); + ScopedDictPrefUpdate update(pref_service_.get(), kDictionaryPrefName); + SetContentPattern(*update, expression0_, 1); + SetContentPattern(*update, expression1_, 2); + SetContentPattern(*update, expression2_, 1); } base::Value merged_value(pref_sync_service_->MergePreference( @@ -398,11 +383,10 @@ TEST_F(DictionaryPreferenceMergeTest, ConflictButServerWins) { { - DictionaryPrefUpdate update(pref_service_.get(), kDictionaryPrefName); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression0_, 2); - SetContentPattern(local_dict_value, expression1_, 2); - SetContentPattern(local_dict_value, expression2_, 1); + ScopedDictPrefUpdate update(pref_service_.get(), kDictionaryPrefName); + SetContentPattern(*update, expression0_, 2); + SetContentPattern(*update, expression1_, 2); + SetContentPattern(*update, expression2_, 1); } base::Value merged_value(pref_sync_service_->MergePreference( @@ -420,20 +404,19 @@ expression0_("expression0"), expression1_("expression1") { server_url_list_.Append(url0_); - SetContentPattern(&server_patterns_, expression0_, 1); + SetContentPattern(server_patterns_.GetDict(), expression0_, 1); } bool MergeListPreference(const char* pref) { { - ListPrefUpdate update(pref_service_.get(), pref); - base::Value* local_list_value = update.Get(); - local_list_value->Append(url1_); + ScopedListPrefUpdate update(pref_service_.get(), pref); + update->Append(url1_); } base::Value merged_value(pref_sync_service_->MergePreference( pref, *pref_service_->GetUserPrefValue(pref), server_url_list_)); - base::ListValue expected; + base::Value::List expected; expected.Append(url0_); expected.Append(url1_); return merged_value == expected; @@ -441,17 +424,16 @@ bool MergeDictionaryPreference(const char* pref) { { - DictionaryPrefUpdate update(pref_service_.get(), pref); - base::Value* local_dict_value = update.Get(); - SetContentPattern(local_dict_value, expression1_, 1); + ScopedDictPrefUpdate update(pref_service_.get(), pref); + SetContentPattern(*update, expression1_, 1); } base::Value merged_value(pref_sync_service_->MergePreference( pref, *pref_service_->GetUserPrefValue(pref), server_patterns_)); - base::DictionaryValue expected; - SetContentPattern(&expected, expression0_, 1); - SetContentPattern(&expected, expression1_, 1); + base::Value::Dict expected; + SetContentPattern(expected, expression0_, 1); + SetContentPattern(expected, expression1_, 1); return merged_value == expected; } @@ -461,7 +443,7 @@ std::string expression1_; std::string content_type0_; base::ListValue server_url_list_; - base::DictionaryValue server_patterns_; + base::Value server_patterns_{base::Value::Type::DICT}; }; TEST_F(IndividualPreferenceMergeTest, ListPreference) {
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc index 62c21fa..be60e3b 100644 --- a/components/sync_preferences/pref_service_syncable_unittest.cc +++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -299,10 +299,9 @@ TEST_F(PrefServiceSyncableTest, ModelAssociationEmptyCloud) { prefs_.SetString(kStringPrefName, kExampleUrl0); { - ListPrefUpdate update(GetPrefs(), kListPrefName); - base::Value* url_list = update.Get(); - url_list->Append(kExampleUrl0); - url_list->Append(kExampleUrl1); + ScopedListPrefUpdate update(GetPrefs(), kListPrefName); + update->Append(kExampleUrl0); + update->Append(kExampleUrl1); } syncer::SyncChangeList out; InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); @@ -318,9 +317,8 @@ TEST_F(PrefServiceSyncableTest, ModelAssociationCloudHasData) { prefs_.SetString(kStringPrefName, kExampleUrl0); { - ListPrefUpdate update(GetPrefs(), kListPrefName); - base::Value* url_list = update.Get(); - url_list->Append(kExampleUrl0); + ScopedListPrefUpdate update(GetPrefs(), kListPrefName); + update->Append(kExampleUrl0); } syncer::SyncDataList in; @@ -511,10 +509,9 @@ TEST_F(PrefServiceSyncableMergeTest, ShouldMergeSelectedListValues) { { - ListPrefUpdate update(&prefs_, kListPrefName); - base::Value* url_list = update.Get(); - url_list->Append(kExampleUrl0); - url_list->Append(kExampleUrl1); + ScopedListPrefUpdate update(&prefs_, kListPrefName); + update->Append(kExampleUrl0); + update->Append(kExampleUrl1); } base::ListValue urls_to_restore; @@ -592,10 +589,9 @@ TEST_F(PrefServiceSyncableMergeTest, ShouldMergeSelectedDictionaryValues) { { - DictionaryPrefUpdate update(&prefs_, kDictPrefName); - base::Value* dict_value = update.Get(); - dict_value->SetStringKey("my_key1", "my_value1"); - dict_value->SetStringKey("my_key3", "my_value3"); + ScopedDictPrefUpdate update(&prefs_, kDictPrefName); + update->Set("my_key1", "my_value1"); + update->Set("my_key3", "my_value3"); } base::DictionaryValue remote_update;
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc index b8571678..6f7ffb1 100644 --- a/components/sync_sessions/session_sync_bridge_unittest.cc +++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -220,7 +220,8 @@ for (const SessionSpecifics& specifics : remote_data) { initial_updates.push_back(SpecificsToUpdateResponse(specifics)); } - real_processor_->OnUpdateReceived(state, std::move(initial_updates)); + real_processor_->OnUpdateReceived(state, std::move(initial_updates), + /*gc_directive=*/absl::nullopt); } std::map<std::string, std::unique_ptr<EntityData>> GetAllData() { @@ -1255,7 +1256,8 @@ syncer::UpdateResponseDataList updates; updates.push_back( CreateTombstone(SessionStore::GetClientTag(foreign_header))); - real_processor()->OnUpdateReceived(state, std::move(updates)); + real_processor()->OnUpdateReceived(state, std::move(updates), + /*gc_directive=*/absl::nullopt); foreign_session_tab = nullptr; EXPECT_FALSE(bridge()->GetOpenTabsUIDelegate()->GetForeignTab( @@ -1356,7 +1358,8 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateTombstone(kLocalCacheGuid)); updates.push_back(CreateTombstone(tab_client_tag1)); - real_processor()->OnUpdateReceived(state, std::move(updates)); + real_processor()->OnUpdateReceived(state, std::move(updates), + /*gc_directive=*/absl::nullopt); // State should remain unchanged (deletions ignored). EXPECT_THAT( @@ -1516,7 +1519,7 @@ // Mimic receiving an empty list of remote updates. sync_pb::ModelTypeState state; state.set_initial_sync_done(true); - real_processor()->OnUpdateReceived(state, {}); + real_processor()->OnUpdateReceived(state, {}, /*gc_directive=*/absl::nullopt); } TEST_F(SessionSyncBridgeTest, ShouldDoGarbageCollection) { @@ -1561,7 +1564,8 @@ Delete(SessionStore::GetTabStorageKey(kStaleSessionTag, kTabNodeId), _)); EXPECT_CALL(mock_foreign_session_updated_cb(), Run()).Times(AtLeast(1)); - real_processor()->OnUpdateReceived(state, std::move(updates)); + real_processor()->OnUpdateReceived(state, std::move(updates), + /*gc_directive=*/absl::nullopt); } TEST_F(SessionSyncBridgeTest, ShouldReturnBrowserTypeInGetData) {
diff --git a/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out b/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out index 02d9c76c..9c421ece 100644 --- a/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out +++ b/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out
@@ -13,8 +13,8 @@ ADDRESS_HOME_ZIP | creditCard.billingContact.address.postalCode | Zip code: | | creditCard.billingContact.shippingAddressAsBillingAddress_2 EMAIL_ADDRESS | user.email | email address: | | creditCard.billingContact.shippingAddressAsBillingAddress_2 PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | user.phone.areaCode | phone: | | creditCard.billingContact.shippingAddressAsBillingAddress_2 -PHONE_HOME_NUMBER | user.phone.exchangeNumber | phone:Please enter your phone number | | creditCard.billingContact.shippingAddressAsBillingAddress_2 -PHONE_HOME_WHOLE_NUMBER | user.phone.subscriberNumber | phone:Please enter your phone number | | creditCard.billingContact.shippingAddressAsBillingAddress_2 +PHONE_HOME_NUMBER | user.phone.exchangeNumber | phone: | | creditCard.billingContact.shippingAddressAsBillingAddress_2 +PHONE_HOME_WHOLE_NUMBER | user.phone.subscriberNumber | phone: | | creditCard.billingContact.shippingAddressAsBillingAddress_2 UNKNOWN_TYPE | user.profile.createAccount | Yes! Create an account for me at macys.com | true | creditCard.billingContact.shippingAddressAsBillingAddress_2 EMAIL_ADDRESS | user.profile.email | email address: | | user.profile.email_3 EMAIL_ADDRESS | user.profile.confirmEmail | Confirm email address: | | user.profile.email_3
diff --git a/components/test/data/autofill/heuristics/output/125_bug_462080.out b/components/test/data/autofill/heuristics/output/125_bug_462080.out index 7edfe596..03ce065 100644 --- a/components/test/data/autofill/heuristics/output/125_bug_462080.out +++ b/components/test/data/autofill/heuristics/output/125_bug_462080.out
@@ -3,8 +3,8 @@ UNKNOWN_TYPE | | Can edit Access level for invited people. | | _1 UNKNOWN_TYPE | | Enter names or email addresses... | | _1 UNKNOWN_TYPE | :z | Add a note | | _1 -UNKNOWN_TYPE | :g.urlInput | | | _1 -UNKNOWN_TYPE | :g.urlTextArea | | | _1 +UNKNOWN_TYPE | :g.urlInput | Link to share | | _1 +UNKNOWN_TYPE | :g.urlTextArea | Link to share | | _1 UNKNOWN_TYPE | :q.fakeRecipient | Invite people: | Enter names or email addresses... | _1 UNKNOWN_TYPE | :m | Enter names or email addresses... | | _1 UNKNOWN_TYPE | :i | Optional: include a personal message... | | _1
diff --git a/components/test/data/payments/redirect/destination/README.md b/components/test/data/payments/redirect/destination/README.md new file mode 100644 index 0000000..753b61b --- /dev/null +++ b/components/test/data/payments/redirect/destination/README.md
@@ -0,0 +1,3 @@ +Just-in-time installable payment handler with payment method identifier +"https://<hostname>/redirect/destination/pay". This payment handler always can +make payments and responds to a payment request with {"status": "success"}.
diff --git a/components/test/data/payments/redirect/destination/app.js b/components/test/data/payments/redirect/destination/app.js new file mode 100644 index 0000000..03170d2 --- /dev/null +++ b/components/test/data/payments/redirect/destination/app.js
@@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +self.addEventListener('canmakepayment', (event) => { + event.respondWith(true); +}); + +self.addEventListener('paymentrequest', (event) => { + event.respondWith({ + methodName: event.methodData[0].supportedMethods, + details: {status: 'success'}, + }); +});
diff --git a/components/test/data/payments/redirect/destination/app.json b/components/test/data/payments/redirect/destination/app.json new file mode 100644 index 0000000..7ce645e --- /dev/null +++ b/components/test/data/payments/redirect/destination/app.json
@@ -0,0 +1,11 @@ +{ + "name": "Redirect Destination Pay", + "icons": [{ + "src": "/icon.png", + "sizes": "40x40", + "type": "image/png" + }], + "serviceworker": { + "src": "app.js" + } +}
diff --git a/components/test/data/payments/redirect/destination/pay b/components/test/data/payments/redirect/destination/pay new file mode 100644 index 0000000..027fc399 --- /dev/null +++ b/components/test/data/payments/redirect/destination/pay
@@ -0,0 +1,3 @@ +{ + "default_applications": ["https://subdomain.test.example/redirect/destination/app.json"] +}
diff --git a/components/test/data/payments/redirect/pay b/components/test/data/payments/redirect/pay new file mode 100644 index 0000000..e0dfe7d --- /dev/null +++ b/components/test/data/payments/redirect/pay
@@ -0,0 +1 @@ +<!-- Intentionally blank. -->
diff --git a/components/test/data/payments/redirect/pay.mock-http-headers b/components/test/data/payments/redirect/pay.mock-http-headers new file mode 100644 index 0000000..a6a67d9 --- /dev/null +++ b/components/test/data/payments/redirect/pay.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 301 Moved Permanently +Location: https://subdomain.test.example/redirect/destination/pay
diff --git a/components/test/data/payments/redirect/redirect.html b/components/test/data/payments/redirect/redirect.html new file mode 100644 index 0000000..c2b31d9 --- /dev/null +++ b/components/test/data/payments/redirect/redirect.html
@@ -0,0 +1,15 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5"> + <script> + async function checkCanMakePayment(paymentMethodName) { + return new PaymentRequest( + [{supportedMethods: paymentMethodName,}], + {total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}}}) + .canMakePayment(); + } + </script> + </head> +</html>
diff --git a/components/web_cache/browser/web_cache_manager.cc b/components/web_cache/browser/web_cache_manager.cc index b477740e6..b522fe9 100644 --- a/components/web_cache/browser/web_cache_manager.cc +++ b/components/web_cache/browser/web_cache_manager.cc
@@ -431,7 +431,7 @@ void WebCacheManager::ReviseAllocationStrategyLater() { DCHECK(!base::FeatureList::IsEnabled( blink::features::kNoCentralWebCacheLimitControl)); - if (!base::FeatureList::IsEnabled(kTrimWebCacheOnMemoryPressureOnly)) + if (base::FeatureList::IsEnabled(kTrimWebCacheOnMemoryPressureOnly)) return; // Avoid piling up notifications.
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index d129064..85da44f 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -575,8 +575,17 @@ // Clear set of nodes cleared from the cache after atomic update. nodes_already_cleared_.clear(); + // When the root changes, send the new root id and a navigate signal to Java. if (root_changed) { - wcax->HandleNavigate(); + auto* root_manager = + static_cast<BrowserAccessibilityManagerAndroid*>(GetRootManager()); + DCHECK(root_manager); + + auto* root = static_cast<BrowserAccessibilityAndroid*>( + root_manager->GetBrowserAccessibilityRoot()); + DCHECK(root); + + wcax->HandleNavigate(root->unique_id()); } // Update the maximum number of nodes in the cache after each atomic update.
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc index 4d3bc8f..4304bb9d 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.cc +++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -29,6 +29,7 @@ #include "net/base/data_url.h" #include "ui/accessibility/accessibility_features.h" #include "ui/accessibility/ax_assistant_structure.h" +#include "ui/accessibility/platform/ax_android_constants.h" #include "ui/events/android/motion_event_android.h" using base::android::AttachCurrentThread; @@ -593,12 +594,12 @@ return false; } -void WebContentsAccessibilityAndroid::HandleNavigate() { +void WebContentsAccessibilityAndroid::HandleNavigate(int32_t root_id) { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); if (obj.is_null()) return; - Java_WebContentsAccessibilityImpl_handleNavigate(env, obj); + Java_WebContentsAccessibilityImpl_handleNavigate(env, obj, root_id); } void WebContentsAccessibilityAndroid::UpdateMaxNodesInCache() { @@ -648,7 +649,7 @@ if (root) return static_cast<jint>(root->unique_id()); } - return -1; + return ui::kAXAndroidInvalidViewId; } jboolean WebContentsAccessibilityAndroid::IsNodeValid(JNIEnv* env, @@ -750,8 +751,7 @@ node->GetUnclippedRootFrameBoundsRect(&offscreen_result), dip_scale, dip_scale); gfx::Rect parent_relative_rect = absolute_rect; - bool is_root = !node->PlatformGetParent(); - if (!is_root) { + if (node->PlatformGetParent()) { gfx::Rect parent_rect = gfx::ScaleToEnclosingRect( node->PlatformGetParent()->GetUnclippedRootFrameBoundsRect(), dip_scale, dip_scale); @@ -762,7 +762,7 @@ Java_WebContentsAccessibilityImpl_setAccessibilityNodeInfoLocation( env, obj, info, unique_id, absolute_rect.x(), absolute_rect.y(), parent_relative_rect.x(), parent_relative_rect.y(), absolute_rect.width(), - absolute_rect.height(), is_root, is_offscreen); + absolute_rect.height(), is_offscreen); } jboolean WebContentsAccessibilityAndroid::UpdateCachedAccessibilityNodeInfo( @@ -814,13 +814,11 @@ if (obj.is_null()) return false; - bool is_root = !node->PlatformGetParent(); - if (!is_root) { - auto* android_node = - static_cast<BrowserAccessibilityAndroid*>(node->PlatformGetParent()); - Java_WebContentsAccessibilityImpl_setAccessibilityNodeInfoParent( - env, obj, info, android_node->unique_id()); - } + int parent_id = ui::kAXAndroidInvalidViewId; + auto* parent_node = + static_cast<BrowserAccessibilityAndroid*>(node->PlatformGetParent()); + if (parent_node) + parent_id = parent_node->unique_id(); // Build a vector of child ids std::vector<int> child_ids; @@ -852,7 +850,8 @@ node->IsSeekControl(), node->IsFormDescendant()); Java_WebContentsAccessibilityImpl_setAccessibilityNodeInfoBaseAttributes( - env, obj, info, is_root, GetCanonicalJNIString(env, node->GetClassName()), + env, obj, info, unique_id, parent_id, + GetCanonicalJNIString(env, node->GetClassName()), GetCanonicalJNIString(env, node->GetRoleString()), GetCanonicalJNIString(env, node->GetRoleDescription()), base::android::ConvertUTF16ToJavaString(env, node->GetHint()),
diff --git a/content/browser/accessibility/web_contents_accessibility_android.h b/content/browser/accessibility/web_contents_accessibility_android.h index d5873bb..5e20cbb 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.h +++ b/content/browser/accessibility/web_contents_accessibility_android.h
@@ -309,7 +309,7 @@ void SendDelayedWindowContentChangedEvent(); bool OnHoverEvent(const ui::MotionEventAndroid& event); void HandleHover(int32_t unique_id); - void HandleNavigate(); + void HandleNavigate(int32_t root_id); void UpdateMaxNodesInCache(); void ClearNodeInfoCacheForGivenId(int32_t unique_id); void HandleEndOfTestSignal();
diff --git a/content/browser/android/app_web_message_port.cc b/content/browser/android/app_web_message_port.cc index 89571941..6bb2c68 100644 --- a/content/browser/android/app_web_message_port.cc +++ b/content/browser/android/app_web_message_port.cc
@@ -20,6 +20,7 @@ #include "third_party/blink/public/common/messaging/string_message_codec.h" #include "third_party/blink/public/common/messaging/transferable_message.h" #include "third_party/blink/public/common/messaging/transferable_message_mojom_traits.h" +#include "third_party/blink/public/common/messaging/web_message_port.h" #include "third_party/blink/public/mojom/messaging/transferable_message.mojom.h" namespace content::android { @@ -104,6 +105,10 @@ base::android::ScopedJavaLocalRef<jobject>(j_message_payload))); transferable_message.ports = blink::MessagePortChannel::CreateFromHandles(Release(env, j_ports)); + // As the message is posted from an Android app and not from another renderer, + // set the agent cluster ID to the embedder's. + transferable_message.sender_agent_cluster_id = + blink::WebMessagePort::GetEmbedderAgentClusterID(); mojo::Message mojo_message = blink::mojom::TransferableMessage::SerializeAsMessage(
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc index 9747b05..8c4fbd82f 100644 --- a/content/browser/interest_group/interest_group_auction.cc +++ b/content/browser/interest_group/interest_group_auction.cc
@@ -400,7 +400,7 @@ std::move(winner->seller_debug_win_report_url).value(), signals, top_level_signals)); } - // `top_level_signals` is passed as parameter `signals` for top level + // `top_level_signals` is passed as parameter `signals` for top-level // seller. if (winner->top_level_seller_debug_win_report_url.has_value()) { debug_win_report_urls.emplace_back(FillPostAuctionSignals( @@ -422,7 +422,7 @@ std::move(bid_state->seller_debug_loss_report_url).value(), signals, top_level_signals)); } - // `top_level_signals` is passed as parameter `signals` for top level + // `top_level_signals` is passed as parameter `signals` for top-level // seller. if (bid_state->top_level_seller_debug_loss_report_url.has_value()) { debug_loss_report_urls.emplace_back(FillPostAuctionSignals( @@ -1205,8 +1205,8 @@ signals.made_highest_scoring_other_bid ? "true" : "false"); // For component auction sellers only, which get post auction signals from - // both their own component auctions and top level auction. - // For now, we're assuming top level auctions to be first-price auction only + // both their own component auctions and top-level auction. + // For now, we're assuming top-level auctions to be first-price auction only // (not second-price auction) and it does not need highest_scoring_other_bid. if (top_level_signals.has_value()) { base::ReplaceSubstringsAfterOffset( @@ -1249,10 +1249,10 @@ PostAuctionSignals signals; signals.winning_bid = top_bid_ ? top_bid_->bid->bid : 0.0; signals.highest_scoring_other_bid = highest_scoring_other_bid_; - // `top_level_signals` includes post auction signals from top level auction. - // Will only will be used in debug report URLs of top level seller and + // `top_level_signals` includes post auction signals from top-level auction. + // Will only will be used in debug report URLs of top-level seller and // component sellers. - // For now, we're assuming top level auctions to be first-price auction only + // For now, we're assuming top-level auctions to be first-price auction only // (not second-price auction) and it does not need highest_scoring_other_bid. absl::optional<PostAuctionSignals> top_level_signals; if (parent_) {
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h index d8bcacb..a7f2294 100644 --- a/content/browser/interest_group/interest_group_auction.h +++ b/content/browser/interest_group/interest_group_auction.h
@@ -73,7 +73,7 @@ struct PostAuctionSignals { PostAuctionSignals() = default; - // For now, top level post auction signals do not have + // For now, top-level post auction signals do not have // `highest_scoring_other_bid` or `made_highest_scoring_other_bid`. PostAuctionSignals(double winning_bid, bool made_winning_bid) : winning_bid(winning_bid), made_winning_bid(made_winning_bid) {} @@ -221,8 +221,8 @@ // URLs of forDebuggingOnly.reportAdAuctionLoss(url) and // forDebuggingOnly.reportAdAuctionWin(url) called in generateBid(). - // They support post auction signal placeholders in their URL string, - // for example, "https://example.com/${highestScoringOtherBid}". + // They support post auction signal placeholders in their query string, for + // example, "https://example.com/?${winningBid}". // Placeholders will be replaced by corresponding values. For a component // auction, post auction signals are only from the component auction, but // not the top-level auction. @@ -232,8 +232,8 @@ // URLs of forDebuggingOnly.reportAdAuctionLoss(url) and // forDebuggingOnly.reportAdAuctionWin(url) called in scoreAd(). In the case // of a component auction, these are the values from component seller that - // the scored ad was created in, and post auction signals are from the - // component auction. + // the scored ad was created in, and post auction signals are from both the + // component auction and top-level auction. absl::optional<GURL> seller_debug_loss_report_url; absl::optional<GURL> seller_debug_win_report_url;
diff --git a/content/browser/message_port_provider.cc b/content/browser/message_port_provider.cc index 06b4f08..0ca48815 100644 --- a/content/browser/message_port_provider.cc +++ b/content/browser/message_port_provider.cc
@@ -45,6 +45,10 @@ blink::TransferableMessage message = blink::EncodeWebMessagePayload(data); message.ports = std::move(channels); + // As the message is posted from the embedder and not from another renderer, + // set the agent cluster ID to the embedder's. + message.sender_agent_cluster_id = + blink::WebMessagePort::GetEmbedderAgentClusterID(); RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(&page.GetMainDocument());
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc index b11b70c..be4d549 100644 --- a/content/browser/portal/portal_browsertest.cc +++ b/content/browser/portal/portal_browsertest.cc
@@ -2607,10 +2607,14 @@ [](Portal* portal_a, Portal* portal_b, const GURL&, blink::mojom::ReferrerPtr, blink::mojom::Portal::NavigateCallback callback) { - portal_a->Activate(blink::TransferableMessage(), base::TimeTicks::Now(), - 0, base::DoNothing()); - portal_b->Activate(blink::TransferableMessage(), base::TimeTicks::Now(), - 0, base::DoNothing()); + blink::TransferableMessage message1; + message1.sender_agent_cluster_id = base::UnguessableToken::Create(); + blink::TransferableMessage message2; + message2.sender_agent_cluster_id = base::UnguessableToken::Create(); + portal_a->Activate(std::move(message1), base::TimeTicks::Now(), 0, + base::DoNothing()); + portal_b->Activate(std::move(message2), base::TimeTicks::Now(), 0, + base::DoNothing()); std::move(callback).Run(); }, portal_a, portal_b)); @@ -2640,10 +2644,14 @@ portal_interceptor->SetNavigateCallback(base::BindRepeating( [](Portal* portal, const GURL&, blink::mojom::ReferrerPtr, blink::mojom::Portal::NavigateCallback callback) { - portal->Activate(blink::TransferableMessage(), base::TimeTicks::Now(), - 0, base::DoNothing()); - portal->Activate(blink::TransferableMessage(), base::TimeTicks::Now(), - 0, base::DoNothing()); + blink::TransferableMessage message1; + message1.sender_agent_cluster_id = base::UnguessableToken::Create(); + blink::TransferableMessage message2; + message2.sender_agent_cluster_id = base::UnguessableToken::Create(); + portal->Activate(std::move(message1), base::TimeTicks::Now(), 0, + base::DoNothing()); + portal->Activate(std::move(message2), base::TimeTicks::Now(), 0, + base::DoNothing()); std::move(callback).Run(); }, portal));
diff --git a/content/browser/service_worker/service_worker_object_host_unittest.cc b/content/browser/service_worker/service_worker_object_host_unittest.cc index d2108f6..6c77654 100644 --- a/content/browser/service_worker/service_worker_object_host_unittest.cc +++ b/content/browser/service_worker/service_worker_object_host_unittest.cc
@@ -321,6 +321,7 @@ // by calling DispatchExtendableMessageEvent on |object_host|. // Expected status is kOk. blink::TransferableMessage message; + message.sender_agent_cluster_id = base::UnguessableToken::Create(); SetUpDummyMessagePort(&message.ports); base::RunLoop loop; CallDispatchExtendableMessageEvent( @@ -351,6 +352,7 @@ // by calling DispatchExtendableMessageEvent on |object_host|. // Expected status is kErrorTimeout. blink::TransferableMessage message; + message.sender_agent_cluster_id = base::UnguessableToken::Create(); SetUpDummyMessagePort(&message.ports); base::RunLoop loop; CallDispatchExtendableMessageEvent( @@ -417,6 +419,7 @@ // Simulate postMessage() from the window client to the worker. blink::TransferableMessage message; + message.sender_agent_cluster_id = base::UnguessableToken::Create(); SetUpDummyMessagePort(&message.ports); bool called = false; blink::ServiceWorkerStatusCode status =
diff --git a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc index ba2f900..00ec46e 100644 --- a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc +++ b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc
@@ -613,8 +613,9 @@ // Sites with a service worker are identified as supporting offline capability // only when it returns a valid response in the offline mode. +// TODO(crbug.com/1365409): Flaky on all platforms. IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest, - CheckOfflineCapability) { + DISABLED_CheckOfflineCapability) { EXPECT_TRUE(NavigateToURL(shell(), embedded_test_server()->GetURL( "/service_worker/create_service_worker.html")));
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc index 7a4c0c2..4a4e4c7 100644 --- a/content/browser/service_worker/service_worker_version_unittest.cc +++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -913,8 +913,11 @@ ReceiveServiceWorkerStatus(&error_status, run_loop.QuitClosure())); // Dispatch a dummy event. + auto message_event = blink::mojom::ExtendableMessageEvent::New(); + message_event->message.sender_agent_cluster_id = + base::UnguessableToken::Create(); version_->endpoint()->DispatchExtendableMessageEvent( - blink::mojom::ExtendableMessageEvent::New(), + std::move(message_event), version_->CreateSimpleEventCallback(request_id)); worker->RunUntilDispatchMessageEvent();
diff --git a/content/ppapi_plugin/ppapi_plugin_main.cc b/content/ppapi_plugin/ppapi_plugin_main.cc index d4bb39c..86e093a 100644 --- a/content/ppapi_plugin/ppapi_plugin_main.cc +++ b/content/ppapi_plugin/ppapi_plugin_main.cc
@@ -57,6 +57,10 @@ #include <stdlib.h> #endif +#if BUILDFLAG(IS_MAC) +#include "base/system/sys_info.h" +#endif + #if BUILDFLAG(IS_WIN) sandbox::TargetServices* g_target_services = NULL; #else @@ -69,6 +73,12 @@ int PpapiPluginMain(MainFunctionParams parameters) { const base::CommandLine& command_line = *parameters.command_line; +#if BUILDFLAG(IS_MAC) + // Specified when launching the process in + // PpapiPluginSandboxedProcessLauncherDelegate::EnableCpuSecurityMitigations. + base::SysInfo::SetIsCpuSecurityMitigationsEnabled(true); +#endif + #if BUILDFLAG(IS_WIN) // https://crbug.com/1139752 Premature unload of shell32 caused process to // crash during process shutdown. Fixed in Windows 11.
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index d60e17d..0d9b40e 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -650,10 +650,12 @@ if (!isAccessibilityEnabled()) { return null; } - int rootId = WebContentsAccessibilityImplJni.get().getRootId(mNativeObj); + if (mCurrentRootId == View.NO_ID) { + mCurrentRootId = WebContentsAccessibilityImplJni.get().getRootId(mNativeObj); + } if (virtualViewId == View.NO_ID) { - return createNodeForHost(rootId); + return createNodeForHost(mCurrentRootId); } if (!isFrameInfoInitialized()) { @@ -700,7 +702,7 @@ info.setPackageName(mContext.getPackageName()); info.setSource(mView, virtualViewId); - if (virtualViewId == rootId) { + if (virtualViewId == mCurrentRootId) { info.setParent(mView); } @@ -1558,20 +1560,15 @@ @CalledByNative private void handleContentChanged(int id) { - int rootId = WebContentsAccessibilityImplJni.get().getRootId(mNativeObj); - if (rootId != mCurrentRootId) { - mCurrentRootId = rootId; - sendAccessibilityEvent(View.NO_ID, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - } else { - sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - } + sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } @CalledByNative - private void handleNavigate() { + private void handleNavigate(int newRootId) { mAccessibilityFocusId = View.NO_ID; mAccessibilityFocusRect = null; mUserHasTouchExplored = false; + mCurrentRootId = newRootId; // Invalidate the host, since its child is now gone. sendAccessibilityEvent(View.NO_ID, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } @@ -1632,11 +1629,6 @@ } @CalledByNative - private void setAccessibilityNodeInfoParent(AccessibilityNodeInfoCompat node, int parentId) { - node.setParent(mView, parentId); - } - - @CalledByNative private void addAccessibilityNodeInfoChildren( AccessibilityNodeInfoCompat node, int[] childIds) { for (int childId : childIds) { @@ -1790,8 +1782,8 @@ @CalledByNative private void setAccessibilityNodeInfoBaseAttributes(AccessibilityNodeInfoCompat node, - boolean isRoot, String className, String role, String roleDescription, String hint, - String targetUrl, boolean canOpenPopup, boolean multiLine, int inputType, + int virtualViewId, int parentId, String className, String role, String roleDescription, + String hint, String targetUrl, boolean canOpenPopup, boolean multiLine, int inputType, int liveRegion, String errorMessage, int clickableScore, String display) { node.setClassName(className); @@ -1805,10 +1797,14 @@ if (!targetUrl.isEmpty()) { bundle.putCharSequence(EXTRAS_KEY_TARGET_URL, targetUrl); } - if (isRoot) { + if (virtualViewId == mCurrentRootId) { bundle.putCharSequence(EXTRAS_KEY_SUPPORTED_ELEMENTS, mSupportedHtmlElementTypes); } + if (parentId != View.NO_ID) { + node.setParent(mView, parentId); + } + node.setCanOpenPopup(canOpenPopup); node.setDismissable(false); // No concept of "dismissable" on the web currently. node.setMultiLine(multiLine); @@ -1984,11 +1980,11 @@ @CalledByNative protected void setAccessibilityNodeInfoLocation(AccessibilityNodeInfoCompat node, final int virtualViewId, int absoluteLeft, int absoluteTop, int parentRelativeLeft, - int parentRelativeTop, int width, int height, boolean isRootNode, boolean isOffscreen) { + int parentRelativeTop, int width, int height, boolean isOffscreen) { // First set the bounds in parent. Rect boundsInParent = new Rect(parentRelativeLeft, parentRelativeTop, parentRelativeLeft + width, parentRelativeTop + height); - if (isRootNode) { + if (virtualViewId == mCurrentRootId) { // Offset of the web content relative to the View. AccessibilityCoordinates ac = mDelegate.getAccessibilityCoordinates(); boundsInParent.offset(0, (int) ac.getContentOffsetYPix());
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc index 02e3953..9f568aa 100644 --- a/content/renderer/render_process_impl.cc +++ b/content/renderer/render_process_impl.cc
@@ -50,6 +50,10 @@ #include "v8/include/v8-wasm-trap-handler-posix.h" #endif +#if BUILDFLAG(IS_MAC) +#include "base/system/sys_info.h" +#endif + namespace { void SetV8FlagIfFeature(const base::Feature& feature, const char* v8_flag) { @@ -95,6 +99,12 @@ : RenderProcess(GetThreadPoolInitParams()) { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); +#if BUILDFLAG(IS_MAC) + // Specified when launching the process in + // RendererSandboxedProcessLauncherDelegate::EnableCpuSecurityMitigations + base::SysInfo::SetIsCpuSecurityMitigationsEnabled(true); +#endif + #if BUILDFLAG(DCHECK_IS_CONFIGURABLE) // Some official builds ship with DCHECKs compiled in. Failing DCHECKs then // are either fatal or simply log the error, based on a feature flag.
diff --git a/content/renderer/service_worker/service_worker_provider_context_unittest.cc b/content/renderer/service_worker/service_worker_provider_context_unittest.cc index 9cfa687..dff56da 100644 --- a/content/renderer/service_worker/service_worker_provider_context_unittest.cc +++ b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
@@ -707,8 +707,10 @@ provider_impl->SetClient(client.get()); ASSERT_FALSE(client->was_receive_message_called()); + blink::TransferableMessage message; + message.sender_agent_cluster_id = base::UnguessableToken::Create(); container_remote->PostMessageToClient(std::move(object_info), - blink::TransferableMessage()); + std::move(message)); base::RunLoop().RunUntilIdle(); // The passed reference should be owned by the provider client (but the
diff --git a/content/services/auction_worklet/seller_worklet_unittest.cc b/content/services/auction_worklet/seller_worklet_unittest.cc index 6844e9f..3c1c065 100644 --- a/content/services/auction_worklet/seller_worklet_unittest.cc +++ b/content/services/auction_worklet/seller_worklet_unittest.cc
@@ -1118,21 +1118,21 @@ TEST_F(SellerWorkletTest, ScoreAdBid) { bid_ = 5; - RunScoreAdWithReturnValueExpectingResult(base::StringPrintf("bid"), 5); + RunScoreAdWithReturnValueExpectingResult("bid", 5); bid_ = 0.5; - RunScoreAdWithReturnValueExpectingResult(base::StringPrintf("bid"), 0.5); + RunScoreAdWithReturnValueExpectingResult("bid", 0.5); bid_ = -1; - RunScoreAdWithReturnValueExpectingResult(base::StringPrintf("bid"), 0); + RunScoreAdWithReturnValueExpectingResult("bid", 0); } TEST_F(SellerWorkletTest, ScoreAdBiddingDuration) { // Test browserSignals.bidding_duration_msec. browser_signal_bidding_duration_msecs_ = 0; - RunScoreAdWithReturnValueExpectingResult( - base::StringPrintf("browserSignals.biddingDurationMsec"), 0); + RunScoreAdWithReturnValueExpectingResult("browserSignals.biddingDurationMsec", + 0); browser_signal_bidding_duration_msecs_ = 100; - RunScoreAdWithReturnValueExpectingResult( - base::StringPrintf("browserSignals.biddingDurationMsec"), 100); + RunScoreAdWithReturnValueExpectingResult("browserSignals.biddingDurationMsec", + 100); } // Test that auction config gets into scoreAd. More detailed handling of
diff --git a/device/bluetooth/bluetooth_adapter_mac.h b/device/bluetooth/bluetooth_adapter_mac.h index ea98881..de175f3 100644 --- a/device/bluetooth/bluetooth_adapter_mac.h +++ b/device/bluetooth/bluetooth_adapter_mac.h
@@ -42,6 +42,8 @@ public BluetoothDiscoveryManagerMac::Observer, public BluetoothLowEnergyDiscoveryManagerMac::Observer { public: + using DevicesInfo = std::map<std::string, std::string>; + static scoped_refptr<BluetoothAdapterMac> CreateAdapter(); static scoped_refptr<BluetoothAdapterMac> CreateAdapterForTest( std::string name, @@ -124,8 +126,7 @@ void RemovePairingDelegateInternal( device::BluetoothDevice::PairingDelegate* pairing_delegate) override; - void UpdateKnownLowEnergyDevices( - std::map<std::string, std::string> updated_low_energy_device_info); + void UpdateKnownLowEnergyDevices(DevicesInfo updated_low_energy_device_info); private: // Struct bundling information about the state of the HostController. @@ -312,7 +313,7 @@ // Map of UUID formatted device identifiers of paired Bluetooth devices and // corresponding device address. - std::map<std::string, std::string> low_energy_devices_info_; + DevicesInfo low_energy_devices_info_; base::WeakPtrFactory<BluetoothAdapterMac> weak_ptr_factory_{this}; };
diff --git a/device/bluetooth/bluetooth_adapter_mac.mm b/device/bluetooth/bluetooth_adapter_mac.mm index 9bb0ff3e..64499041 100644 --- a/device/bluetooth/bluetooth_adapter_mac.mm +++ b/device/bluetooth/bluetooth_adapter_mac.mm
@@ -24,6 +24,7 @@ #include "base/mac/scoped_ioobject.h" #include "base/memory/ptr_util.h" #include "base/numerics/safe_conversions.h" +#include "base/ranges/algorithm.h" #include "base/strings/sys_string_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_traits.h" @@ -409,8 +410,8 @@ } void BluetoothAdapterMac::UpdateKnownLowEnergyDevices( - std::map<std::string, std::string> updated_low_energy_devices_info) { - std::map<std::string, std::string> changed_devices; + DevicesInfo updated_low_energy_devices_info) { + DevicesInfo changed_devices; // Notify DeviceChanged() to devices that have been newly paired as well as to // devices that have been removed from the pairing list. std::set_symmetric_difference( @@ -881,9 +882,8 @@ bool BluetoothAdapterMac::IsBluetoothLowEnergyDeviceSystemPaired( base::StringPiece device_identifier) const { - auto it = std::find_if( - low_energy_devices_info_.begin(), low_energy_devices_info_.end(), - [&](const auto& info) { return info.first == device_identifier; }); + auto it = base::ranges::find(low_energy_devices_info_, device_identifier, + &DevicesInfo::value_type::first); if (it == low_energy_devices_info_.end()) return false;
diff --git a/device/bluetooth/bluetooth_low_energy_device_mac.mm b/device/bluetooth/bluetooth_low_energy_device_mac.mm index 5ac795f..30758052 100644 --- a/device/bluetooth/bluetooth_low_energy_device_mac.mm +++ b/device/bluetooth/bluetooth_low_energy_device_mac.mm
@@ -11,6 +11,7 @@ #include "base/mac/mac_util.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/ptr_util.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" #include "device/bluetooth/bluetooth_adapter_mac.h" @@ -442,13 +443,12 @@ // Notify when all services have been discovered. bool discovery_complete = discovery_pending_count_ == 0 && - std::find_if_not( - gatt_services_.begin(), - gatt_services_.end(), [](GattServiceMap::value_type & pair) { + base::ranges::all_of( + gatt_services_, [](GattServiceMap::value_type& pair) { BluetoothRemoteGattService* gatt_service = pair.second.get(); return static_cast<BluetoothRemoteGattServiceMac*>(gatt_service) ->IsDiscoveryComplete(); - }) == gatt_services_.end(); + }); if (discovery_complete) { DVLOG(1) << *this << ": Discovery complete."; device_uuids_.ReplaceServiceUUIDs(gatt_services_);
diff --git a/device/bluetooth/dbus/bluetooth_gatt_application_service_provider.cc b/device/bluetooth/dbus/bluetooth_gatt_application_service_provider.cc index d5ed139..b62301c1 100644 --- a/device/bluetooth/dbus/bluetooth_gatt_application_service_provider.cc +++ b/device/bluetooth/dbus/bluetooth_gatt_application_service_provider.cc
@@ -9,6 +9,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" +#include "base/ranges/algorithm.h" #include "device/bluetooth/bluetooth_gatt_characteristic.h" #include "device/bluetooth/bluez/bluetooth_gatt_service_bluez.h" #include "device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl.h" @@ -160,10 +161,9 @@ void BluetoothGattApplicationServiceProvider::SendValueChanged( const dbus::ObjectPath& characteristic_path, const std::vector<uint8_t>& value) { - auto characteristic = std::find_if( - characteristic_providers_.begin(), characteristic_providers_.end(), - [&](const std::unique_ptr<BluetoothGattCharacteristicServiceProvider>& - p) { return p->object_path() == characteristic_path; }); + auto characteristic = base::ranges::find( + characteristic_providers_, characteristic_path, + &BluetoothGattCharacteristicServiceProvider::object_path); if (characteristic == characteristic_providers_.end()) { LOG(ERROR) << "Couldn't find characteristic provider for: " << characteristic_path.value();
diff --git a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc index 48d302ec..eff01f0 100644 --- a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc +++ b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
@@ -9,6 +9,7 @@ #include <utility> #include "base/bind.h" +#include "base/ranges/algorithm.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/threading/thread_task_runner_handle.h" @@ -369,10 +370,9 @@ BluetoothRemoteGattService* service) { auto* device_service = static_cast<BluetoothRemoteGattServiceWinrt*>(service) ->GetDeviceServiceForTesting(); - auto iter = std::find_if(fake_services_.begin(), fake_services_.end(), - [device_service](const auto& fake_service) { - return device_service == fake_service.Get(); - }); + auto iter = base::ranges::find( + fake_services_, device_service, + &Microsoft::WRL::ComPtr<FakeGattDeviceServiceWinrt>::Get); DCHECK(iter != fake_services_.end()); fake_services_.erase(iter); SimulateGattServicesChanged();
diff --git a/device/fido/cable/fido_ble_connection_unittest.cc b/device/fido/cable/fido_ble_connection_unittest.cc index f969fb76..4c7bb75 100644 --- a/device/fido/cable/fido_ble_connection_unittest.cc +++ b/device/fido/cable/fido_ble_connection_unittest.cc
@@ -11,6 +11,7 @@ #include "base/callback_helpers.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" +#include "base/ranges/algorithm.h" #include "base/run_loop.h" #include "base/strings/string_piece.h" #include "base/test/task_environment.h" @@ -72,10 +73,8 @@ BluetoothDevice* GetMockDevice(MockBluetoothAdapter* adapter, const std::string& address) { const std::vector<BluetoothDevice*> devices = adapter->GetMockDevices(); - auto found = std::find_if(devices.begin(), devices.end(), - [&address](const auto* device) { - return device->GetAddress() == address; - }); + auto found = + base::ranges::find(devices, address, &BluetoothDevice::GetAddress); return found != devices.end() ? *found : nullptr; }
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc index d8c4284..edeba48 100644 --- a/device/fido/fido_device_authenticator.cc +++ b/device/fido/fido_device_authenticator.cc
@@ -4,7 +4,6 @@ #include "device/fido/fido_device_authenticator.h" -#include <algorithm> #include <numeric> #include <utility> @@ -12,6 +11,7 @@ #include "base/containers/contains.h" #include "base/feature_list.h" #include "base/logging.h" +#include "base/ranges/algorithm.h" #include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -912,11 +912,10 @@ return; } - auto existing_large_blob = - std::find_if(large_blob_array->begin(), large_blob_array->end(), - [&large_blob_key](const LargeBlobData& blob) { - return blob.Decrypt(large_blob_key); - }); + auto existing_large_blob = base::ranges::find_if( + *large_blob_array, [&large_blob_key](const LargeBlobData& blob) { + return blob.Decrypt(large_blob_key).has_value(); + }); LargeBlobData new_large_blob_data(large_blob_key, std::move(large_blob)); if (existing_large_blob != large_blob_array->end()) {
diff --git a/device/gamepad/gamepad_blocklist.cc b/device/gamepad/gamepad_blocklist.cc index 9ff09bfe..8d623ba 100644 --- a/device/gamepad/gamepad_blocklist.cc +++ b/device/gamepad/gamepad_blocklist.cc
@@ -6,9 +6,11 @@ #include <stddef.h> -#include <algorithm> #include <iterator> +#include "base/containers/contains.h" +#include "base/ranges/algorithm.h" + namespace device { namespace { @@ -92,17 +94,11 @@ } // namespace bool GamepadIsExcluded(uint16_t vendor_id, uint16_t product_id) { - const uint16_t* vendors_begin = std::begin(kBlockedVendors); - const uint16_t* vendors_end = std::end(kBlockedVendors); - if (std::find(vendors_begin, vendors_end, vendor_id) != vendors_end) - return true; - - const VendorProductPair* devices_begin = std::begin(kBlockedDevices); - const VendorProductPair* devices_end = std::end(kBlockedDevices); - return std::find_if( - devices_begin, devices_end, [=](const VendorProductPair& item) { + return base::Contains(kBlockedVendors, vendor_id) || + base::ranges::any_of( + kBlockedDevices, [=](const VendorProductPair& item) { return vendor_id == item.vendor && product_id == item.product; - }) != devices_end; + }); } } // namespace device
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc index f8180c28..7ff10975 100644 --- a/device/gamepad/gamepad_standard_mappings_linux.cc +++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -4,9 +4,9 @@ #include <stddef.h> -#include <algorithm> #include <iterator> +#include "base/ranges/algorithm.h" #include "device/gamepad/gamepad_id_list.h" #include "device/gamepad/gamepad_standard_mappings.h" @@ -891,7 +891,7 @@ constexpr struct MappingData { GamepadId gamepad_id; GamepadStandardMappingFunction function; -} AvailableMappings[] = { +} kAvailableMappings[] = { // PowerA Wireless Controller - Nintendo GameCube style {GamepadId::kPowerALicPro, MapperSwitchPro}, // DragonRise Generic USB @@ -1005,13 +1005,10 @@ GamepadBusType bus_type) { GamepadId gamepad_id = GamepadIdList::Get().GetGamepadId(product_name, vendor_id, product_id); - const MappingData* begin = std::begin(AvailableMappings); - const MappingData* end = std::end(AvailableMappings); - const auto* find_it = std::find_if(begin, end, [=](const MappingData& item) { - return gamepad_id == item.gamepad_id; - }); + const auto* find_it = base::ranges::find(kAvailableMappings, gamepad_id, + &MappingData::gamepad_id); GamepadStandardMappingFunction mapper = - (find_it == end) ? nullptr : find_it->function; + (find_it == std::end(kAvailableMappings)) ? nullptr : find_it->function; // The Linux kernel was updated in version 4.10 to better support Dualshock 4 // and Dualshock 3/SIXAXIS gamepads. The driver patches the bcdHID value when
diff --git a/device/gamepad/gamepad_standard_mappings_mac.mm b/device/gamepad/gamepad_standard_mappings_mac.mm index 60fd48a..771ec14 100644 --- a/device/gamepad/gamepad_standard_mappings_mac.mm +++ b/device/gamepad/gamepad_standard_mappings_mac.mm
@@ -4,9 +4,9 @@ #include <stddef.h> -#include <algorithm> #include <iterator> +#include "base/ranges/algorithm.h" #include "device/gamepad/gamepad_id_list.h" #include "device/gamepad/gamepad_standard_mappings.h" @@ -720,7 +720,7 @@ constexpr struct MappingData { GamepadId gamepad_id; GamepadStandardMappingFunction function; -} AvailableMappings[] = { +} kAvailableMappings[] = { // PowerA Wireless Controller - Nintendo GameCube style {GamepadId::kPowerALicPro, MapperSwitchPro}, // Snakebyte iDroid:con @@ -838,13 +838,10 @@ GamepadBusType bus_type) { GamepadId gamepad_id = GamepadIdList::Get().GetGamepadId(product_name, vendor_id, product_id); - const MappingData* begin = std::begin(AvailableMappings); - const MappingData* end = std::end(AvailableMappings); - const auto* find_it = std::find_if(begin, end, [=](const MappingData& item) { - return gamepad_id == item.gamepad_id; - }); + const auto* find_it = base::ranges::find(kAvailableMappings, gamepad_id, + &MappingData::gamepad_id); GamepadStandardMappingFunction mapper = - (find_it == end) ? nullptr : find_it->function; + (find_it == std::end(kAvailableMappings)) ? nullptr : find_it->function; // The Switch Joy-Con Charging Grip allows a pair of Joy-Cons to be docked // with the grip and used over USB as a single composite gamepad. The Nintendo
diff --git a/device/gamepad/gamepad_standard_mappings_win.cc b/device/gamepad/gamepad_standard_mappings_win.cc index a08cdc6..f838a5d6 100644 --- a/device/gamepad/gamepad_standard_mappings_win.cc +++ b/device/gamepad/gamepad_standard_mappings_win.cc
@@ -4,9 +4,9 @@ #include <stddef.h> -#include <algorithm> #include <iterator> +#include "base/ranges/algorithm.h" #include "device/gamepad/gamepad_id_list.h" #include "device/gamepad/gamepad_standard_mappings.h" @@ -488,7 +488,7 @@ constexpr struct MappingData { GamepadId gamepad_id; GamepadStandardMappingFunction function; -} AvailableMappings[] = { +} kAvailableMappings[] = { // PowerA Wireless Controller - Nintendo GameCube style {GamepadId::kPowerALicPro, MapperSwitchPro}, // Snakebyte iDroid:con @@ -568,13 +568,10 @@ GamepadBusType bus_type) { GamepadId gamepad_id = GamepadIdList::Get().GetGamepadId(product_name, vendor_id, product_id); - const MappingData* begin = std::begin(AvailableMappings); - const MappingData* end = std::end(AvailableMappings); - const auto* find_it = std::find_if(begin, end, [=](const MappingData& item) { - return gamepad_id == item.gamepad_id; - }); + const auto* find_it = base::ranges::find(kAvailableMappings, gamepad_id, + &MappingData::gamepad_id); GamepadStandardMappingFunction mapper = - (find_it == end) ? nullptr : find_it->function; + (find_it == std::end(kAvailableMappings)) ? nullptr : find_it->function; // The Switch Joy-Con Charging Grip allows a pair of Joy-Cons to be docked // with the grip and used over USB as a single composite gamepad. The Nintendo
diff --git a/device/gamepad/hid_haptic_gamepad.cc b/device/gamepad/hid_haptic_gamepad.cc index 65b0dbd..2a8ecff 100644 --- a/device/gamepad/hid_haptic_gamepad.cc +++ b/device/gamepad/hid_haptic_gamepad.cc
@@ -4,9 +4,9 @@ #include "device/gamepad/hid_haptic_gamepad.h" -#include <algorithm> #include <vector> +#include "base/ranges/algorithm.h" #include "device/gamepad/hid_writer.h" namespace device { @@ -50,7 +50,6 @@ // Stadia controller {0x18d1, 0x9400, 0x05, 5, 1, 3, 2 * kBitsPerByte, 0, 0xffff}, }; -size_t kHapticReportDataLength = std::size(kHapticReportData); HidHapticGamepad::HidHapticGamepad(const HapticReportData& data, std::unique_ptr<HidWriter> writer) @@ -79,26 +78,21 @@ // static bool HidHapticGamepad::IsHidHaptic(uint16_t vendor_id, uint16_t product_id) { - const auto* begin = kHapticReportData; - const auto* end = kHapticReportData + kHapticReportDataLength; - const auto* find_it = - std::find_if(begin, end, [=](const HapticReportData& d) { + return base::ranges::any_of( + kHapticReportData, [=](const HapticReportData& d) { return d.vendor_id == vendor_id && d.product_id == product_id; }); - return find_it != end; } // static const HidHapticGamepad::HapticReportData* HidHapticGamepad::GetHapticReportData( uint16_t vendor_id, uint16_t product_id) { - const auto* begin = kHapticReportData; - const auto* end = kHapticReportData + kHapticReportDataLength; const auto* find_it = - std::find_if(begin, end, [=](const HapticReportData& d) { + base::ranges::find_if(kHapticReportData, [=](const HapticReportData& d) { return d.vendor_id == vendor_id && d.product_id == product_id; }); - return find_it == end ? nullptr : &*find_it; + return find_it == std::end(kHapticReportData) ? nullptr : &*find_it; } void HidHapticGamepad::DoShutdown() {
diff --git a/device/udev_linux/fake_udev_loader.cc b/device/udev_linux/fake_udev_loader.cc index d0c2ad5..25b91ef2 100644 --- a/device/udev_linux/fake_udev_loader.cc +++ b/device/udev_linux/fake_udev_loader.cc
@@ -11,6 +11,7 @@ #include "base/files/scoped_file.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" +#include "base/ranges/algorithm.h" struct udev { // empty @@ -223,9 +224,7 @@ udev_device* FakeUdevLoader::udev_device_new_from_syspath(udev* udev_context, const char* syspath) { DCHECK(syspath); - auto it = - std::find_if(devices_.begin(), devices_.end(), - [syspath](const auto& d) { return d->syspath == syspath; }); + auto it = base::ranges::find(devices_, syspath, &udev_device::syspath); return it == devices_.end() ? nullptr : it->get(); }
diff --git a/device/vr/openxr/openxr_extension_helper.cc b/device/vr/openxr/openxr_extension_helper.cc index 6cecf583..8ed9cfe 100644 --- a/device/vr/openxr/openxr_extension_helper.cc +++ b/device/vr/openxr/openxr_extension_helper.cc
@@ -6,6 +6,8 @@ #include <tuple> +#include "base/ranges/algorithm.h" + namespace device { OpenXrExtensionMethods::OpenXrExtensionMethods() = default; @@ -27,11 +29,11 @@ bool OpenXrExtensionEnumeration::ExtensionSupported( const char* extension_name) const { - return std::find_if( - extension_properties_.begin(), extension_properties_.end(), - [&extension_name](const XrExtensionProperties& properties) { - return strcmp(properties.extensionName, extension_name) == 0; - }) != extension_properties_.end(); + return base::ranges::any_of( + extension_properties_, + [&extension_name](const XrExtensionProperties& properties) { + return strcmp(properties.extensionName, extension_name) == 0; + }); } OpenXrExtensionHelper::~OpenXrExtensionHelper() = default;
diff --git a/device/vr/test/fake_vr_device_provider.cc b/device/vr/test/fake_vr_device_provider.cc index ca64c22..0b4c9c7b 100644 --- a/device/vr/test/fake_vr_device_provider.cc +++ b/device/vr/test/fake_vr_device_provider.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "device/vr/test/fake_vr_device_provider.h" + +#include "base/ranges/algorithm.h" #include "device/vr/vr_device_base.h" namespace device { @@ -22,11 +24,7 @@ } void FakeVRDeviceProvider::RemoveDevice(mojom::XRDeviceId device_id) { - auto it = std::find_if( - devices_.begin(), devices_.end(), - [device_id](const std::unique_ptr<VRDeviceBase>& device) { - return static_cast<VRDeviceBase*>(device.get())->GetId() == device_id; - }); + auto it = base::ranges::find(devices_, device_id, &VRDeviceBase::GetId); if (initialized_) client_->RemoveRuntime(device_id); devices_.erase(it);
diff --git a/docs/gpu/gpu_testing.md b/docs/gpu/gpu_testing.md index ed24173b..6019640 100644 --- a/docs/gpu/gpu_testing.md +++ b/docs/gpu/gpu_testing.md
@@ -446,6 +446,37 @@ [isolate-server-credentials]: gpu_testing_bot_details.md#Isolate-server-credentials +## Debugging a Specific Subset of Tests on a Specific GPU Bot + +When a test exhibits flake on the bots, it can be convenient to run it +repeatedly with local code modifications on the bot where it is exhibiting +flake. One way of doing this is via swarming (see the below section). However, a +lower-overhead alternative that also works in the case where you are looking to +run on a bot for which you cannot locally build is to locally alter the +configuration of the bot in question to specify that it should run only the +tests desired, repeating as many times as desired. Instructions for doing this +are as follows (see the [example CL] for a concrete instantiation of these +instructions): + +1. In testsuite_exceptions.pyl, find the section for the test suite in question + (creating it if it doesn't exist). +2. Add modifications for the bot in question and specify arguments such that + your desired tests are run for the desired number of iterations. +3. Run testing/buildbot/generate_buildbot_json.py and verify that the JSON file + for the bot in question was modified as you would expect. +4. Upload and run tryjobs on that specific bot via "Choose Tryjobs." +5. Examine the test results. (You can verify that the tests run were as you + expected by examining the test results for individual shards of the run + of the test suite in question.) +6. Add logging/code modifications/etc as desired and go back to step 4, + repeating the process until you've uncovered the underlying issue. +7. Remove the the changes to testsuite_exceptions.pyl and the JSON file if + turning the CL into one intended for submission! + +Here is an [example CL] that does this. + +[example CL]: https://chromium-review.googlesource.com/c/chromium/src/+/3898592/4 + ## Running Locally Built Binaries on the GPU Bots See the [Swarming documentation] for instructions on how to upload your binaries to the isolate server and trigger execution on Swarming.
diff --git a/extensions/browser/api/guest_view/guest_view_internal_api.cc b/extensions/browser/api/guest_view/guest_view_internal_api.cc index a438a2d8..f4582992 100644 --- a/extensions/browser/api/guest_view/guest_view_internal_api.cc +++ b/extensions/browser/api/guest_view/guest_view_internal_api.cc
@@ -52,7 +52,7 @@ if (!sender_web_contents) return RespondNow(Error("Guest views can only be embedded in web content")); - GuestViewManager::WebContentsCreatedCallback callback = base::BindOnce( + auto callback = base::BindOnce( &GuestViewInternalCreateGuestFunction::CreateGuestCallback, this); // Add flag to |create_params| to indicate that the element size is specified @@ -65,12 +65,8 @@ } void GuestViewInternalCreateGuestFunction::CreateGuestCallback( - content::WebContents* guest_web_contents) { - int guest_instance_id = 0; - if (guest_web_contents) { - GuestViewBase* guest = GuestViewBase::FromWebContents(guest_web_contents); - guest_instance_id = guest->guest_instance_id(); - } + guest_view::GuestViewBase* guest) { + int guest_instance_id = guest ? guest->guest_instance_id() : 0; base::Value::Dict return_params; return_params.Set(guest_view::kID, guest_instance_id);
diff --git a/extensions/browser/api/guest_view/guest_view_internal_api.h b/extensions/browser/api/guest_view/guest_view_internal_api.h index 4ee668f..5e283c3f 100644 --- a/extensions/browser/api/guest_view/guest_view_internal_api.h +++ b/extensions/browser/api/guest_view/guest_view_internal_api.h
@@ -7,6 +7,10 @@ #include "extensions/browser/extension_function.h" +namespace guest_view { +class GuestViewBase; +} // namespace guest_view + namespace extensions { class GuestViewInternalCreateGuestFunction : public ExtensionFunction { @@ -27,7 +31,7 @@ ResponseAction Run() final; private: - void CreateGuestCallback(content::WebContents* guest_web_contents); + void CreateGuestCallback(guest_view::GuestViewBase* guest); }; class GuestViewInternalSetSizeFunction : public ExtensionFunction {
diff --git a/extensions/browser/bad_message.h b/extensions/browser/bad_message.h index 81cdcaf..debf3e2a 100644 --- a/extensions/browser/bad_message.h +++ b/extensions/browser/bad_message.h
@@ -28,7 +28,7 @@ EH_BAD_EVENT_ID = 3, AVG_BAD_INST_ID = 4, AVG_BAD_EXT_ID = 5, - AVG_NULL_AVG = 6, + OBSOLETE_AVG_NULL_AVG = 6, // Invalid decrement of an Extensions SW ref count. ESWMF_INVALID_DECREMENT_ACTIVITY = 7, EFD_BAD_MESSAGE = 8,
diff --git a/extensions/browser/guest_view/app_view/app_view_guest.cc b/extensions/browser/guest_view/app_view/app_view_guest.cc index 1320f1b..b12422e 100644 --- a/extensions/browser/guest_view/app_view/app_view_guest.cc +++ b/extensions/browser/guest_view/app_view/app_view_guest.cc
@@ -41,14 +41,14 @@ struct ResponseInfo { scoped_refptr<const Extension> guest_extension; - base::WeakPtr<AppViewGuest> app_view_guest; + std::unique_ptr<GuestViewBase> app_view_guest; GuestViewBase::WebContentsCreatedCallback callback; ResponseInfo(const Extension* guest_extension, - const base::WeakPtr<AppViewGuest>& app_view_guest, + std::unique_ptr<GuestViewBase> app_view_guest, GuestViewBase::WebContentsCreatedCallback callback) : guest_extension(guest_extension), - app_view_guest(app_view_guest), + app_view_guest(std::move(app_view_guest)), callback(std::move(callback)) {} ~ResponseInfo() = default; @@ -81,28 +81,34 @@ } ResponseInfo* response_info = it->second.get(); - if (!response_info->app_view_guest || - (response_info->guest_extension->id() != guest_extension_id)) { - // The app is trying to communicate with an <appview> not assigned to it, or - // the <appview> is already dead "nullptr". - bad_message::BadMessageReason reason = !response_info->app_view_guest - ? bad_message::AVG_NULL_AVG - : bad_message::AVG_BAD_EXT_ID; - bad_message::ReceivedBadMessage(guest_render_process_host, reason); + scoped_refptr<const Extension> guest_extension = + response_info->guest_extension; + + if (guest_extension->id() != guest_extension_id) { + // The app is trying to communicate with an <appview> not assigned to it. + bad_message::ReceivedBadMessage(guest_render_process_host, + bad_message::AVG_BAD_EXT_ID); return false; } - response_info->app_view_guest->CompleteCreateWebContents( - url, response_info->guest_extension.get(), - std::move(response_info->callback)); - + std::unique_ptr<GuestViewBase> app_view_guest = + std::move(response_info->app_view_guest); + GuestViewBase::WebContentsCreatedCallback callback = + std::move(response_info->callback); response_map->erase(it); + + auto* raw_app_view_guest = static_cast<AppViewGuest*>(app_view_guest.get()); + raw_app_view_guest->CompleteCreateWebContents(url, guest_extension.get(), + std::move(app_view_guest), + std::move(callback)); + return true; } // static -GuestViewBase* AppViewGuest::Create(WebContents* owner_web_contents) { - return new AppViewGuest(owner_web_contents); +std::unique_ptr<GuestViewBase> AppViewGuest::Create( + WebContents* owner_web_contents) { + return base::WrapUnique(new AppViewGuest(owner_web_contents)); } AppViewGuest::AppViewGuest(WebContents* owner_web_contents) @@ -165,22 +171,23 @@ render_frame_host, security_origin, type, guest_extension); } -void AppViewGuest::CreateWebContents(const base::Value::Dict& create_params, +void AppViewGuest::CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) { const std::string* app_id = create_params.FindString(appview::kAppID); if (!app_id) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } // Verifying that the appId is not the same as the host application. if (owner_host() == *app_id) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } const base::Value::Dict* data = create_params.FindDict(appview::kData); if (!data) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } @@ -192,17 +199,18 @@ if (!guest_extension || !guest_extension->is_platform_app() || !embedder_extension || !embedder_extension->is_platform_app()) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } const LazyContextId context_id(browser_context(), guest_extension->id()); LazyContextTaskQueue* queue = context_id.GetTaskQueue(); if (queue->ShouldEnqueueTask(browser_context(), guest_extension)) { - queue->AddPendingTask(context_id, - base::BindOnce(&AppViewGuest::LaunchAppAndFireEvent, - weak_ptr_factory_.GetWeakPtr(), - data->Clone(), std::move(callback))); + queue->AddPendingTask( + context_id, + base::BindOnce(&AppViewGuest::LaunchAppAndFireEvent, + weak_ptr_factory_.GetWeakPtr(), std::move(owned_this), + data->Clone(), std::move(callback))); return; } @@ -211,7 +219,7 @@ process_manager->GetBackgroundHostForExtension(guest_extension->id()); DCHECK(host); LaunchAppAndFireEvent( - data->Clone(), std::move(callback), + std::move(owned_this), data->Clone(), std::move(callback), std::make_unique<LazyContextTaskQueue::ContextInfo>(host)); } @@ -236,9 +244,10 @@ void AppViewGuest::CompleteCreateWebContents( const GURL& url, const Extension* guest_extension, + std::unique_ptr<GuestViewBase> owned_this, WebContentsCreatedCallback callback) { if (!url.is_valid()) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } url_ = url; @@ -249,12 +258,11 @@ content::SiteInstance::CreateForURL(browser_context(), guest_extension->url())); params.guest_delegate = this; - // TODO(erikchen): Fix ownership semantics for guest views. - // https://crbug.com/832879. - std::move(callback).Run(WebContents::Create(params).release()); + std::move(callback).Run(std::move(owned_this), WebContents::Create(params)); } void AppViewGuest::LaunchAppAndFireEvent( + std::unique_ptr<GuestViewBase> owned_this, base::Value::Dict data, WebContentsCreatedCallback callback, std::unique_ptr<LazyContextTaskQueue::ContextInfo> context_info) { @@ -263,7 +271,7 @@ context_info->extension_id, app_runtime::OnEmbedRequested::kEventName); if (!has_event_listener) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } @@ -274,7 +282,7 @@ g_pending_response_map.Get().insert(std::make_pair( guest_instance_id(), - std::make_unique<ResponseInfo>(extension, weak_ptr_factory_.GetWeakPtr(), + std::make_unique<ResponseInfo>(extension, std::move(owned_this), std::move(callback)))); base::Value::Dict embed_request;
diff --git a/extensions/browser/guest_view/app_view/app_view_guest.h b/extensions/browser/guest_view/app_view/app_view_guest.h index 8516a22..5454fa3c3 100644 --- a/extensions/browser/guest_view/app_view/app_view_guest.h +++ b/extensions/browser/guest_view/app_view/app_view_guest.h
@@ -24,10 +24,12 @@ public: static const char Type[]; + ~AppViewGuest() override; AppViewGuest(const AppViewGuest&) = delete; AppViewGuest& operator=(const AppViewGuest&) = delete; - static GuestViewBase* Create(content::WebContents* owner_web_contents); + static std::unique_ptr<GuestViewBase> Create( + content::WebContents* owner_web_contents); // Completes the creation of a WebContents associated with the provided // |guest_extension_id| and |guest_instance_id| for the given @@ -53,10 +55,9 @@ private: explicit AppViewGuest(content::WebContents* owner_web_contents); - ~AppViewGuest() override; - // GuestViewBase implementation. - void CreateWebContents(const base::Value::Dict& create_params, + void CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) final; void DidInitialize(const base::Value::Dict& create_params) final; const char* GetAPINamespace() const final; @@ -75,9 +76,11 @@ void CompleteCreateWebContents(const GURL& url, const Extension* guest_extension, + std::unique_ptr<GuestViewBase> owned_this, WebContentsCreatedCallback callback); void LaunchAppAndFireEvent( + std::unique_ptr<GuestViewBase> owned_this, base::Value::Dict data, WebContentsCreatedCallback callback, std::unique_ptr<LazyContextTaskQueue::ContextInfo> context_info);
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.cc b/extensions/browser/guest_view/extension_options/extension_options_guest.cc index bd227ab..39fdb5345a 100644 --- a/extensions/browser/guest_view/extension_options/extension_options_guest.cc +++ b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
@@ -48,11 +48,13 @@ ExtensionOptionsGuest::~ExtensionOptionsGuest() = default; // static -GuestViewBase* ExtensionOptionsGuest::Create(WebContents* owner_web_contents) { - return new ExtensionOptionsGuest(owner_web_contents); +std::unique_ptr<GuestViewBase> ExtensionOptionsGuest::Create( + WebContents* owner_web_contents) { + return base::WrapUnique(new ExtensionOptionsGuest(owner_web_contents)); } void ExtensionOptionsGuest::CreateWebContents( + std::unique_ptr<GuestViewBase> owned_this, const base::Value::Dict& create_params, WebContentsCreatedCallback callback) { // Get the extension's base URL. @@ -60,14 +62,14 @@ create_params.FindString(extensionoptions::kExtensionId); if (!extension_id || !crx_file::id_util::IdIsValid(*extension_id)) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } GURL extension_url = extensions::Extension::GetBaseURLFromExtensionId(*extension_id); if (!extension_url.is_valid()) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } @@ -79,13 +81,13 @@ if (!extension) { // The ID was valid but the extension didn't exist. Typically this will // happen when an extension is disabled. - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } options_page_ = extensions::OptionsPageInfo::GetOptionsPage(extension); if (!options_page_.is_valid()) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } @@ -96,9 +98,7 @@ browser_context(), content::SiteInstance::CreateForURL(browser_context(), extension_url)); params.guest_delegate = this; - // TODO(erikchen): Fix ownership semantics for guest views. - // https://crbug.com/832879. - std::move(callback).Run(WebContents::Create(params).release()); + std::move(callback).Run(std::move(owned_this), WebContents::Create(params)); } void ExtensionOptionsGuest::DidInitialize(
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.h b/extensions/browser/guest_view/extension_options/extension_options_guest.h index a5bbcbd..e7ca270 100644 --- a/extensions/browser/guest_view/extension_options/extension_options_guest.h +++ b/extensions/browser/guest_view/extension_options/extension_options_guest.h
@@ -20,18 +20,19 @@ public: static const char Type[]; + ~ExtensionOptionsGuest() override; ExtensionOptionsGuest(const ExtensionOptionsGuest&) = delete; ExtensionOptionsGuest& operator=(const ExtensionOptionsGuest&) = delete; - static guest_view::GuestViewBase* Create( + static std::unique_ptr<GuestViewBase> Create( content::WebContents* owner_web_contents); private: explicit ExtensionOptionsGuest(content::WebContents* owner_web_contents); - ~ExtensionOptionsGuest() override; // GuestViewBase implementation. - void CreateWebContents(const base::Value::Dict& create_params, + void CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) final; void DidInitialize(const base::Value::Dict& create_params) final; void GuestViewDidStopLoading() final;
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc index 5c963ec..1c0e8690 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
@@ -16,7 +16,6 @@ #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" -#include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" #include "content/public/common/webplugininfo.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.h" @@ -119,16 +118,16 @@ } void MimeHandlerViewAttachHelper::AttachToOuterWebContents( - MimeHandlerViewGuest* guest_view, + std::unique_ptr<MimeHandlerViewGuest> guest_view, int32_t embedder_render_process_id, content::RenderFrameHost* outer_contents_frame, int32_t element_instance_id, bool is_full_page_plugin) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - pending_guests_[element_instance_id] = guest_view->GetWeakPtr(); - outer_contents_frame->PrepareForInnerWebContentsAttach(base::BindOnce( - &MimeHandlerViewAttachHelper::ResumeAttachOrDestroy, - weak_factory_.GetWeakPtr(), element_instance_id, is_full_page_plugin)); + outer_contents_frame->PrepareForInnerWebContentsAttach( + base::BindOnce(&MimeHandlerViewAttachHelper::ResumeAttachOrDestroy, + weak_factory_.GetWeakPtr(), std::move(guest_view), + element_instance_id, is_full_page_plugin)); } // static @@ -147,37 +146,41 @@ render_process_host->AddObserver(this); } -MimeHandlerViewAttachHelper::~MimeHandlerViewAttachHelper() {} +MimeHandlerViewAttachHelper::~MimeHandlerViewAttachHelper() = default; void MimeHandlerViewAttachHelper::ResumeAttachOrDestroy( + std::unique_ptr<MimeHandlerViewGuest> guest_view, int32_t element_instance_id, bool is_full_page_plugin, content::RenderFrameHost* plugin_rfh) { if (resume_attach_callback_for_testing_) { std::move(resume_attach_callback_for_testing_) .Run(base::BindOnce(&MimeHandlerViewAttachHelper::ResumeAttachOrDestroy, - weak_factory_.GetWeakPtr(), element_instance_id, - is_full_page_plugin, plugin_rfh)); + weak_factory_.GetWeakPtr(), std::move(guest_view), + element_instance_id, is_full_page_plugin, + plugin_rfh)); return; } DCHECK(!plugin_rfh || (plugin_rfh->GetProcess() == render_process_host_)); - auto guest_view = pending_guests_[element_instance_id]; - pending_guests_.erase(element_instance_id); if (!guest_view) return; if (!plugin_rfh) { - mojo::AssociatedRemote<mojom::MimeHandlerViewContainerManager> - container_manager; - guest_view->GetEmbedderFrame() - ->GetRemoteAssociatedInterfaces() - ->GetInterface(&container_manager); - container_manager->DestroyFrameContainer(element_instance_id); - guest_view->Destroy(true); + auto* embedder_frame = guest_view->GetEmbedderFrame(); + if (embedder_frame && embedder_frame->IsRenderFrameLive()) { + mojo::AssociatedRemote<mojom::MimeHandlerViewContainerManager> + container_manager; + embedder_frame->GetRemoteAssociatedInterfaces()->GetInterface( + &container_manager); + container_manager->DestroyFrameContainer(element_instance_id); + } + guest_view.reset(); return; } - guest_view->AttachToOuterWebContentsFrame(plugin_rfh, element_instance_id, - is_full_page_plugin, - base::NullCallback()); + + auto* raw_guest_view = guest_view.get(); + raw_guest_view->AttachToOuterWebContentsFrame( + std::move(guest_view), plugin_rfh, element_instance_id, + is_full_page_plugin, base::NullCallback()); } } // namespace extensions
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h index 8657452..32de46e 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h
@@ -69,11 +69,12 @@ // Starts the attaching process for the |guest_view|'s WebContents to its // outer WebContents (embedder WebContents) on the UI thread. - void AttachToOuterWebContents(MimeHandlerViewGuest* guest_view, - int32_t embedder_render_process_id, - content::RenderFrameHost* outer_contents_frame, - int32_t element_instance_id, - bool is_full_page_plugin); + void AttachToOuterWebContents( + std::unique_ptr<MimeHandlerViewGuest> guest_view, + int32_t embedder_render_process_id, + content::RenderFrameHost* outer_contents_frame, + int32_t element_instance_id, + bool is_full_page_plugin); // When set, the next asynchronous guestview attachment operation will call // `callback` when it reaches ResumeAttachOrDestroy() rather than continuing. @@ -91,7 +92,8 @@ // the embedder WebContents. If |plugin_rfh| is nullptr then attaching is not // possible and the guest should be destroyed; otherwise it is safe to proceed // to attaching the WebContentses. - void ResumeAttachOrDestroy(int32_t element_instance_id, + void ResumeAttachOrDestroy(std::unique_ptr<MimeHandlerViewGuest> guest_view, + int32_t element_instance_id, bool is_full_page_plugin, content::RenderFrameHost* plugin_rfh); @@ -108,14 +110,6 @@ explicit MimeHandlerViewAttachHelper( content::RenderProcessHost* render_process_host); - // From the time the MimeHandlerViewGuest starts the attach process - // (AttachToOuterWebContents) to when the inner WebContents of GuestView - // attaches to the outer WebContents, there is a gap where the embedder - // RenderFrameHost (parent frame to the outer contents frame) can go away. - // Therefore, we keep a weak pointer to the GuestViews here (see - // https://crbug.com/959572). - base::flat_map<int32_t, base::WeakPtr<MimeHandlerViewGuest>> pending_guests_; - const raw_ptr<content::RenderProcessHost> render_process_host_; // Allows delaying ResumeAttachOrDestroy for testing.
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.cc index 3567f2e..e643c7a8 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.cc +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.cc
@@ -189,7 +189,7 @@ } base::Value::Dict create_params; create_params.Set(mime_handler_view::kStreamId, stream_id_); - manager->CreateGuest( + manager->CreateGuestAndTransferOwnership( MimeHandlerViewGuest::Type, web_contents(), create_params, base::BindOnce(&MimeHandlerViewEmbedder::DidCreateMimeHandlerViewGuest, weak_factory_.GetWeakPtr(), @@ -199,8 +199,11 @@ void MimeHandlerViewEmbedder::DidCreateMimeHandlerViewGuest( mojo::PendingRemote<mime_handler::BeforeUnloadControl> before_unload_control_remote, - content::WebContents* guest_web_contents) { - auto* guest_view = MimeHandlerViewGuest::FromWebContents(guest_web_contents); + std::unique_ptr<guest_view::GuestViewBase> guest) { + auto* raw_guest_view = static_cast<MimeHandlerViewGuest*>(guest.release()); + std::unique_ptr<MimeHandlerViewGuest> guest_view = + base::WrapUnique(raw_guest_view); + if (!guest_view) return; guest_view->SetBeforeUnloadController( @@ -232,9 +235,9 @@ !guest_view->maybe_has_frame_container() && !guest_view->GetEmbedderFrame()->GetParentOrOuterDocument(); MimeHandlerViewAttachHelper::Get(embedder_frame_process_id) - ->AttachToOuterWebContents(guest_view, embedder_frame_process_id, - outer_contents_rfh_, element_instance_id, - is_full_page /* is_full_page_plugin */); + ->AttachToOuterWebContents( + std::move(guest_view), embedder_frame_process_id, outer_contents_rfh_, + element_instance_id, is_full_page /* is_full_page_plugin */); // MHVE is no longer required. DestroySelf(); }
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.h index c17679d..c96b81c 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.h +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.h
@@ -20,6 +20,10 @@ class RenderFrameHost; } // namespace content +namespace guest_view { +class GuestViewBase; +} // namespace guest_view + namespace extensions { // MimeHandlerViewEmbedder is instantiated in response to a frame navigation to @@ -74,7 +78,7 @@ void DidCreateMimeHandlerViewGuest( mojo::PendingRemote<mime_handler::BeforeUnloadControl> before_unload_control_remote, - content::WebContents* guest_web_contents); + std::unique_ptr<guest_view::GuestViewBase> guest); // Returns null before |render_frame_host_| is known. mojom::MimeHandlerViewContainerManager* GetContainerManager();
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc index 6e0cb46a..13738304 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
@@ -77,8 +77,9 @@ const char MimeHandlerViewGuest::Type[] = "mimehandler"; // static -GuestViewBase* MimeHandlerViewGuest::Create(WebContents* owner_web_contents) { - return new MimeHandlerViewGuest(owner_web_contents); +std::unique_ptr<GuestViewBase> MimeHandlerViewGuest::Create( + WebContents* owner_web_contents) { + return base::WrapUnique(new MimeHandlerViewGuest(owner_web_contents)); } MimeHandlerViewGuest::MimeHandlerViewGuest(WebContents* owner_web_contents) @@ -163,18 +164,19 @@ } void MimeHandlerViewGuest::CreateWebContents( + std::unique_ptr<GuestViewBase> owned_this, const base::Value::Dict& create_params, WebContentsCreatedCallback callback) { const std::string* stream_id = create_params.FindString(mime_handler_view::kStreamId); if (!stream_id || stream_id->empty()) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } stream_ = MimeHandlerStreamManager::Get(browser_context()) ->ReleaseStream(*stream_id); if (!stream_) { - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } mime_type_ = stream_->mime_type(); @@ -187,7 +189,7 @@ if (!mime_handler_extension) { LOG(ERROR) << "Extension for mime_type not found, mime_type = " << stream_->mime_type(); - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } @@ -225,13 +227,11 @@ WebContents::CreateParams params(browser_context(), guest_site_instance.get()); params.guest_delegate = this; - // TODO(erikchen): Fix ownership semantics for guest views. - // https://crbug.com/832879. - std::move(callback).Run( - WebContents::CreateWithSessionStorage( - params, - owner_web_contents()->GetController().GetSessionStorageNamespaceMap()) - .release()); + std::move(callback).Run(std::move(owned_this), + WebContents::CreateWithSessionStorage( + params, owner_web_contents() + ->GetController() + .GetSessionStorageNamespaceMap())); } void MimeHandlerViewGuest::DidAttachToEmbedder() { @@ -364,14 +364,6 @@ return true; } -void MimeHandlerViewGuest::OnRenderFrameHostDeleted(int process_id, - int routing_id) { - if (process_id == embedder_frame_id_.child_id && - routing_id == embedder_frame_id_.frame_routing_id) { - Destroy(/*also_delete=*/true); - } -} - void MimeHandlerViewGuest::EnterFullscreenModeForTab( content::RenderFrameHost* requesting_frame, const blink::mojom::FullscreenOptions& options) {
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h index 33bb494..06d3ed3 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
@@ -83,10 +83,11 @@ class MimeHandlerViewGuest : public guest_view::GuestView<MimeHandlerViewGuest> { public: + ~MimeHandlerViewGuest() override; MimeHandlerViewGuest(const MimeHandlerViewGuest&) = delete; MimeHandlerViewGuest& operator=(const MimeHandlerViewGuest&) = delete; - static guest_view::GuestViewBase* Create( + static std::unique_ptr<GuestViewBase> Create( content::WebContents* owner_web_contents); static const char Type[]; @@ -128,7 +129,6 @@ protected: explicit MimeHandlerViewGuest(content::WebContents* owner_web_contents); - ~MimeHandlerViewGuest() override; private: friend class TestMimeHandlerViewGuest; @@ -136,7 +136,8 @@ // GuestViewBase implementation. const char* GetAPINamespace() const final; int GetTaskPrefix() const final; - void CreateWebContents(const base::Value::Dict& create_params, + void CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) override; void DidAttachToEmbedder() override; void DidInitialize(const base::Value::Dict& create_params) final; @@ -159,7 +160,6 @@ bool SaveFrame(const GURL& url, const content::Referrer& referrer, content::RenderFrameHost* rfh) final; - void OnRenderFrameHostDeleted(int process_id, int routing_id) final; void EnterFullscreenModeForTab( content::RenderFrameHost* requesting_frame, const blink::mojom::FullscreenOptions& options) override;
diff --git a/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.cc index 97b8e58e..80df882 100644 --- a/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.cc +++ b/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.cc
@@ -32,9 +32,9 @@ } // static -GuestViewBase* TestMimeHandlerViewGuest::Create( +std::unique_ptr<GuestViewBase> TestMimeHandlerViewGuest::Create( content::WebContents* owner_web_contents) { - return new TestMimeHandlerViewGuest(owner_web_contents); + return base::WrapUnique(new TestMimeHandlerViewGuest(owner_web_contents)); } // static @@ -50,6 +50,7 @@ } void TestMimeHandlerViewGuest::CreateWebContents( + std::unique_ptr<GuestViewBase> owned_this, const base::Value::Dict& create_params, WebContentsCreatedCallback callback) { // Delay the creation of the guest's WebContents if |delay_| is set. @@ -58,8 +59,8 @@ content::GetUIThreadTaskRunner({})->PostDelayedTask( FROM_HERE, base::BindOnce(&TestMimeHandlerViewGuest::CallBaseCreateWebContents, - weak_ptr_factory_.GetWeakPtr(), create_params.Clone(), - std::move(callback)), + weak_ptr_factory_.GetWeakPtr(), std::move(owned_this), + create_params.Clone(), std::move(callback)), delta); // Reset the delay for the next creation. @@ -67,7 +68,8 @@ return; } - MimeHandlerViewGuest::CreateWebContents(create_params, std::move(callback)); + MimeHandlerViewGuest::CreateWebContents(std::move(owned_this), create_params, + std::move(callback)); } void TestMimeHandlerViewGuest::DidAttachToEmbedder() { @@ -92,10 +94,12 @@ } void TestMimeHandlerViewGuest::CallBaseCreateWebContents( + std::unique_ptr<GuestViewBase> owned_this, base::Value::Dict create_params, WebContentsCreatedCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - MimeHandlerViewGuest::CreateWebContents(create_params, std::move(callback)); + MimeHandlerViewGuest::CreateWebContents(std::move(owned_this), create_params, + std::move(callback)); } // static
diff --git a/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.h b/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.h index 527caee1b..cafec95a 100644 --- a/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.h +++ b/extensions/browser/guest_view/mime_handler_view/test_mime_handler_view_guest.h
@@ -24,6 +24,7 @@ // control over the MimeHandlerViewGuest for the purposes of testing. class TestMimeHandlerViewGuest : public MimeHandlerViewGuest { public: + ~TestMimeHandlerViewGuest() override; TestMimeHandlerViewGuest(const TestMimeHandlerViewGuest&) = delete; TestMimeHandlerViewGuest& operator=(const TestMimeHandlerViewGuest&) = delete; @@ -32,7 +33,8 @@ static void RegisterTestGuestViewType( guest_view::TestGuestViewManager* manager); - static GuestViewBase* Create(content::WebContents* owner_web_contents); + static std::unique_ptr<GuestViewBase> Create( + content::WebContents* owner_web_contents); // Set a delay in the next creation of a guest's WebContents by |delay| // milliseconds. @@ -46,7 +48,8 @@ void WaitForGuestAttached(); // MimeHandlerViewGuest override: - void CreateWebContents(const base::Value::Dict& create_params, + void CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) override; void DidAttachToEmbedder() override; @@ -61,11 +64,11 @@ private: explicit TestMimeHandlerViewGuest(content::WebContents* owner_web_contents); - ~TestMimeHandlerViewGuest() override; // Used to call MimeHandlerViewGuest::CreateWebContents using a scoped_ptr for // |create_params|. - void CallBaseCreateWebContents(base::Value::Dict create_params, + void CallBaseCreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + base::Value::Dict create_params, WebContentsCreatedCallback callback); // A value in milliseconds that the next creation of a guest's WebContents
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc index 11ce52cf..c68d515 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.cc +++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -264,8 +264,9 @@ } // static -GuestViewBase* WebViewGuest::Create(WebContents* owner_web_contents) { - return new WebViewGuest(owner_web_contents); +std::unique_ptr<GuestViewBase> WebViewGuest::Create( + WebContents* owner_web_contents) { + return base::WrapUnique(new WebViewGuest(owner_web_contents)); } // static @@ -302,7 +303,8 @@ return rules_registry_id; } -void WebViewGuest::CreateWebContents(const base::Value::Dict& create_params, +void WebViewGuest::CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) { RenderProcessHost* owner_render_process_host = owner_web_contents()->GetPrimaryMainFrame()->GetProcess(); @@ -318,7 +320,7 @@ if (!base::IsStringUTF8(storage_partition_id)) { bad_message::ReceivedBadMessage(owner_render_process_host, bad_message::WVG_PARTITION_ID_NOT_UTF8); - std::move(callback).Run(nullptr); + std::move(callback).Run(std::move(owned_this), nullptr); return; } std::string partition_domain = GetOwnerSiteURL().host(); @@ -361,9 +363,7 @@ WebContents::CreateParams params(browser_context(), std::move(guest_site_instance)); params.guest_delegate = this; - // TODO(erikchen): Fix ownership semantics for guest views. - // https://crbug.com/832879. - WebContents* new_contents = WebContents::Create(params).release(); + std::unique_ptr<WebContents> new_contents = WebContents::Create(params); // Grant access to the origin of the embedder to the guest process. This // allows blob: and filesystem: URLs with the embedder origin to be created @@ -375,7 +375,7 @@ new_contents->GetPrimaryMainFrame()->GetProcess()->GetID(), url::Origin::Create(GetOwnerSiteURL())); - std::move(callback).Run(new_contents); + std::move(callback).Run(std::move(owned_this), std::move(new_contents)); } void WebViewGuest::DidAttachToEmbedder() { @@ -491,13 +491,15 @@ return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX; } -void WebViewGuest::GuestDestroyed() { +void WebViewGuest::WebContentsDestroyed() { // Note that this is not always redundant with guest removal in // RenderFrameDeleted(), such as when destroying unattached guests that never // had a RenderFrame created. WebViewRendererState::GetInstance()->RemoveGuest( web_contents()->GetPrimaryMainFrame()->GetProcess()->GetID(), web_contents()->GetPrimaryMainFrame()->GetRoutingID()); + // The following call may destroy `this`. + GuestViewBase::WebContentsDestroyed(); } void WebViewGuest::GuestReady() { @@ -541,11 +543,6 @@ webview::kEventZoomChange, std::move(args))); } -void WebViewGuest::WillDestroy() { - if (!attached() && GetOpener()) - GetOpener()->pending_new_windows_.erase(this); -} - void WebViewGuest::CloseContents(WebContents* source) { auto args = std::make_unique<base::DictionaryValue>(); DispatchEventToView( @@ -619,24 +616,26 @@ base::Value::Dict create_params; create_params.Set(webview::kStoragePartitionId, storage_partition_id); - guest_manager->CreateGuest( + guest_manager->CreateGuestAndTransferOwnership( WebViewGuest::Type, embedder_web_contents(), create_params, base::BindOnce(&WebViewGuest::NewGuestWebViewCallback, weak_ptr_factory_.GetWeakPtr(), params)); } -void WebViewGuest::NewGuestWebViewCallback(const content::OpenURLParams& params, - WebContents* guest_web_contents) { - WebViewGuest* new_guest = WebViewGuest::FromWebContents(guest_web_contents); - new_guest->SetOpener(this); +void WebViewGuest::NewGuestWebViewCallback( + const content::OpenURLParams& params, + std::unique_ptr<GuestViewBase> guest) { + auto* raw_new_guest = static_cast<WebViewGuest*>(guest.release()); + std::unique_ptr<WebViewGuest> new_guest = base::WrapUnique(raw_new_guest); - // Take ownership of |new_guest|. + raw_new_guest->SetOpener(this); + pending_new_windows_.insert( - std::make_pair(new_guest, NewWindowInfo(params.url, std::string()))); + std::make_pair(raw_new_guest, NewWindowInfo(params.url, std::string()))); // Request permission to show the new window. RequestNewWindowPermission(params.disposition, gfx::Rect(), - new_guest->web_contents()); + std::move(new_guest)); } // TODO(fsamuel): Find a reliable way to test the 'responsive' and @@ -766,7 +765,18 @@ base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableSpatialNavigation)) {} -WebViewGuest::~WebViewGuest() = default; +WebViewGuest::~WebViewGuest() { + if (!attached() && GetOpener()) + GetOpener()->pending_new_windows_.erase(this); + + // For ease of understanding, we manually clear any unattached, owned + // WebContents before we finish running the destructor of WebViewGuest. This + // is because destroying the WebContents will trigger WebContentsObserver + // notifications which call back into this class. If we wait to destroy the + // WebContents in GuestViewBase's destructor, then only the base class' WCO + // overrides will be called. + ClearOwnedGuestContents(); +} void WebViewGuest::DidFinishNavigation( content::NavigationHandle* navigation_handle) { @@ -1321,13 +1331,24 @@ const blink::mojom::WindowFeatures& window_features, bool user_gesture, bool* was_blocked) { - // This is the guest we created during CreateNewGuestWindow, which we now own. - // TODO(erikchen): Fix ownership semantics for WebContents inside this class. - // https://crbug.com/832879. if (was_blocked) *was_blocked = false; + + // This is the guest we created during CreateNewGuestWindow. We can now take + // ownership of it. + WebViewGuest* web_view_guest = + WebViewGuest::FromWebContents(new_contents.get()); + DCHECK_NE(this, web_view_guest); + + std::unique_ptr<GuestViewBase> owned_guest = + GuestViewManager::FromBrowserContext(browser_context()) + ->TransferOwnership(web_view_guest); + std::unique_ptr<WebViewGuest> owned_web_view_guest = + base::WrapUnique(static_cast<WebViewGuest*>(owned_guest.release())); + owned_web_view_guest->TakeGuestContentsOwnership(std::move(new_contents)); + RequestNewWindowPermission(disposition, window_features.bounds, - new_contents.release()); + std::move(owned_web_view_guest)); } WebContents* WebViewGuest::OpenURLFromTab( @@ -1503,41 +1524,45 @@ web_contents()->GetController().LoadURLWithParams(load_url_params); } -void WebViewGuest::RequestNewWindowPermission(WindowOpenDisposition disposition, - const gfx::Rect& initial_bounds, - WebContents* new_contents) { - auto* guest = WebViewGuest::FromWebContents(new_contents); - if (!guest) +void WebViewGuest::RequestNewWindowPermission( + WindowOpenDisposition disposition, + const gfx::Rect& initial_bounds, + std::unique_ptr<WebViewGuest> new_guest) { + if (!new_guest) return; - auto it = pending_new_windows_.find(guest); + auto it = pending_new_windows_.find(new_guest.get()); if (it == pending_new_windows_.end()) return; const NewWindowInfo& new_window_info = it->second; // Retrieve the opener partition info if we have it. - const auto storage_partition_config = guest->GetGuestMainFrame() + const auto storage_partition_config = new_guest->GetGuestMainFrame() ->GetSiteInstance() ->GetStoragePartitionConfig(); std::string storage_partition_id = GetStoragePartitionIdFromPartitionConfig(storage_partition_config); + const int guest_instance_id = new_guest->guest_instance_id(); + base::DictionaryValue request_info; request_info.SetIntKey(webview::kInitialHeight, initial_bounds.height()); request_info.SetIntKey(webview::kInitialWidth, initial_bounds.width()); request_info.SetStringKey(webview::kTargetURL, new_window_info.url.spec()); request_info.SetStringKey(webview::kName, new_window_info.name); - request_info.SetIntKey(webview::kWindowID, guest->guest_instance_id()); + request_info.SetIntKey(webview::kWindowID, guest_instance_id); // We pass in partition info so that window-s created through newwindow // API can use it to set their partition attribute. request_info.SetStringKey(webview::kStoragePartitionId, storage_partition_id); request_info.SetStringKey(webview::kWindowOpenDisposition, WindowOpenDispositionToString(disposition)); + GuestViewManager::FromBrowserContext(browser_context()) + ->ManageOwnership(std::move(new_guest)); + web_view_permission_helper_->RequestPermission( WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW, request_info, base::BindOnce(&WebViewGuest::OnWebViewNewWindowResponse, - weak_ptr_factory_.GetWeakPtr(), - guest->guest_instance_id()), + weak_ptr_factory_.GetWeakPtr(), guest_instance_id), false /* allowed_by_default */); } @@ -1561,8 +1586,12 @@ if (!guest) return; - if (!allow) - guest->Destroy(true); + if (!allow) { + std::unique_ptr<GuestViewBase> owned_guest = + GuestViewManager::FromBrowserContext(browser_context()) + ->TransferOwnership(guest); + owned_guest.reset(); + } } void WebViewGuest::OnFullscreenPermissionDecided(
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.h b/extensions/browser/guest_view/web_view/web_view_guest.h index 23bf32f..741fd09 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.h +++ b/extensions/browser/guest_view/web_view/web_view_guest.h
@@ -36,10 +36,12 @@ // a particular <webview>. class WebViewGuest : public guest_view::GuestView<WebViewGuest> { public: + ~WebViewGuest() override; WebViewGuest(const WebViewGuest&) = delete; WebViewGuest& operator=(const WebViewGuest&) = delete; - static GuestViewBase* Create(content::WebContents* owner_web_contents); + static std::unique_ptr<GuestViewBase> Create( + content::WebContents* owner_web_contents); // Cleans up state when this GuestView is being destroyed. // Note that this cannot be done in the destructor since a GuestView could // potentially be created and destroyed in JavaScript before getting a @@ -146,8 +148,6 @@ private: explicit WebViewGuest(content::WebContents* owner_web_contents); - ~WebViewGuest() override; - void ClearCodeCache(base::Time remove_since, uint32_t removal_mask, base::OnceClosure callback); @@ -169,7 +169,8 @@ base::OnceCallback<void(bool)> callback); // GuestViewBase implementation. - void CreateWebContents(const base::Value::Dict& create_params, + void CreateWebContents(std::unique_ptr<GuestViewBase> owned_this, + const base::Value::Dict& create_params, WebContentsCreatedCallback callback) final; void DidAttachToEmbedder() final; void DidInitialize(const base::Value::Dict& create_params) final; @@ -183,7 +184,6 @@ bool ZoomPropagatesFromEmbedderToGuest() const final; const char* GetAPINamespace() const final; int GetTaskPrefix() const final; - void GuestDestroyed() final; void GuestReady() final; void GuestSizeChangedDueToAutoSize(const gfx::Size& old_size, const gfx::Size& new_size) final; @@ -192,7 +192,6 @@ bool IsAutoSizeSupported() const final; void SignalWhenReady(base::OnceClosure callback) final; void WillAttachToEmbedder() final; - void WillDestroy() final; // WebContentsDelegate implementation. void CloseContents(content::WebContents* source) final; @@ -269,6 +268,7 @@ void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) final; void RenderFrameHostChanged(content::RenderFrameHost* old_host, content::RenderFrameHost* new_host) final; + void WebContentsDestroyed() final; // Informs the embedder of a frame name change. void ReportFrameNameChange(const std::string& name); @@ -283,10 +283,9 @@ ui::PageTransition transition_type, bool force_navigation); - void RequestNewWindowPermission( - WindowOpenDisposition disposition, - const gfx::Rect& initial_bounds, - content::WebContents* new_contents); + void RequestNewWindowPermission(WindowOpenDisposition disposition, + const gfx::Rect& initial_bounds, + std::unique_ptr<WebViewGuest> new_guest); // Requests resolution of a potentially relative URL. GURL ResolveURL(const std::string& src); @@ -299,7 +298,7 @@ void CreateNewGuestWebViewWindow(const content::OpenURLParams& params); void NewGuestWebViewCallback(const content::OpenURLParams& params, - content::WebContents* guest_web_contents); + std::unique_ptr<GuestViewBase> guest); bool HandleKeyboardShortcuts(const content::NativeWebKeyboardEvent& event);
diff --git a/infra/config/generated/builders/ci/Mac ASan 64 Builder/properties.json b/infra/config/generated/builders/ci/Mac ASan 64 Builder/properties.json index df35ab91..9fcae60 100644 --- a/infra/config/generated/builders/ci/Mac ASan 64 Builder/properties.json +++ b/infra/config/generated/builders/ci/Mac ASan 64 Builder/properties.json
@@ -78,11 +78,10 @@ ] } }, - "$build/goma": { - "debug": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/ci/mac-arm64-rel/properties.json b/infra/config/generated/builders/ci/mac-arm64-rel/properties.json index 6b491fe..fae2b2b 100644 --- a/infra/config/generated/builders/ci/mac-arm64-rel/properties.json +++ b/infra/config/generated/builders/ci/mac-arm64-rel/properties.json
@@ -118,10 +118,10 @@ ] } }, - "$build/goma": { - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/subprojects/chromium/ci/chromium.mac.star b/infra/config/subprojects/chromium/ci/chromium.mac.star index 8e9bf3c..9c5322de1 100644 --- a/infra/config/subprojects/chromium/ci/chromium.mac.star +++ b/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -161,6 +161,9 @@ short_name = "bld", ), os = os.MAC_DEFAULT, + goma_backend = None, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star index c1ff466..eb40734 100644 --- a/infra/config/subprojects/chromium/ci/chromium.memory.star +++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -6,7 +6,7 @@ load("//lib/args.star", "args") load("//lib/branches.star", "branches") load("//lib/builder_config.star", "builder_config") -load("//lib/builders.star", "goma", "os", "reclient", "sheriff_rotations", "xcode") +load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "xcode") load("//lib/ci.star", "ci") load("//lib/consoles.star", "consoles") @@ -406,15 +406,11 @@ category = "mac", short_name = "bld", ), - goma_debug = True, # TODO(hinoka): Remove this after debugging. - goma_jobs = None, cores = None, # Swapping between 8 and 24 os = os.MAC_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 2, ), - reclient_instance = None, - goma_backend = goma.backend.RBE_PROD, ) linux_memory_builder(
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 6748a39c..b00d355 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1635,6 +1635,12 @@ <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACKING_TITLE" desc="Title for Price Tracking Notifications settings menu row."> Tracking Price </message> + <message name="IDS_IOS_TRACKING_PRICE_HEADER_TEXT" desc="Text for Tracking Price header."> + Manage how you receive price drop alerts for products you track + </message> + <message name="IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE" desc="Title for Tracking Price mobile notifications row."> + Mobile Notifications + </message> <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing enhanced protection mode."> Faster, proactive protection against dangerous websites, downloads, and extensions. Warns you about password breaches. Requires browsing data to be sent to Google. </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACKING_PRICE_HEADER_TEXT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACKING_PRICE_HEADER_TEXT.png.sha1 new file mode 100644 index 0000000..59af31b --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACKING_PRICE_HEADER_TEXT.png.sha1
@@ -0,0 +1 @@ +ea6e2fd5f4a9ce1818ff8f7a4338af0f4f5dc97b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE.png.sha1 new file mode 100644 index 0000000..59af31b --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE.png.sha1
@@ -0,0 +1 @@ +ea6e2fd5f4a9ce1818ff8f7a4338af0f4f5dc97b \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb index 1d54c48..9791745 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
@@ -52,6 +52,7 @@ <translation id="3988789688219830639">Google Chrome does not have access to your photos or videos. Enable access in iOS Settings > Privacy > Photos.</translation> <translation id="4099578267706723511">Help make Chrome better by sending usage statistics and crash reports to Google.</translation> <translation id="417201473131094001">Not supported on Chrome Canary</translation> +<translation id="4192781968753717021">This password was found in a data breach. Google Password Manager recommends changing your password now.</translation> <translation id="4233521129555661685"><ph name="USER_EMAIL1" /> was using Chrome and left bookmarks, passwords and other settings on this device.</translation> <translation id="424864128008805179">Sign out of Chrome?</translation> <translation id="4249068189593983585">Chrome tip. For more tab options, touch and hold the Show Tabs button in the toolbar, which is at the bottom or top of your screen.</translation> @@ -83,6 +84,7 @@ <translation id="6238746320622508509">Let Chrome lock your incognito tabs.</translation> <translation id="6412673304250309937">Checks URLs with a list of unsafe sites stored in Chrome. If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Safe Browsing.</translation> <translation id="6427126399757991875">Your organisation is setting up Chrome…</translation> +<translation id="651403856614361404">This password was found in a data breach. Chrome recommends changing your password now.</translation> <translation id="6600954340915313787">Copied to Chrome</translation> <translation id="6634107063912726160">When you sign out, Chrome won't sync any new data to your Google Account. Data previously synced stays in the account.</translation> <translation id="6648150602980899529">You are signing in with an account managed by <ph name="DOMAIN" /> and giving its administrator control over your Chrome data. Your data will become permanently tied to this account. Signing out of Chrome will delete your data from this device, but it will remain stored in your Google Account.</translation> @@ -126,6 +128,7 @@ <translation id="8736550665979974340">Stay safe with Google Chrome</translation> <translation id="8772179140489533211">Shows prompts to sign in to Chrome.</translation> <translation id="8788269841521769222">You won't need to remember this password. It will be saved to Google Password Manager for <ph name="EMAIL" /></translation> +<translation id="8897749957032330183">Passwords are saved to Google Password Manager on this device.</translation> <translation id="8969290730818637510">When on: <ph name="BEGIN_INDENT" /> • Help make Chrome better for people who use it the way that you do.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb index 21f40c2..62206f3c77 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -52,6 +52,7 @@ <translation id="3988789688219830639">Google Chrome ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดการเข้าถึงได้ในการตั้งค่า iOS > ความเป็นส่วนตัว > รูปภาพ</translation> <translation id="4099578267706723511">ช่วยให้ Chrome ทำงานได้ดีขึ้นโดยส่งสถิติการใช้งานและรายงานข้อขัดข้องให้กับ Google</translation> <translation id="417201473131094001">ไม่รองรับใน Chrome Canary</translation> +<translation id="4192781968753717021">ระบบพบว่ารหัสผ่านนี้มีการรั่วไหลจากการละเมิดข้อมูล Google เครื่องมือจัดการรหัสผ่านแนะนำให้เปลี่ยนรหัสผ่านทันที</translation> <translation id="4233521129555661685"><ph name="USER_EMAIL1" /> ได้ใช้ Chrome และเก็บบุ๊กมาร์ก รหัสผ่าน รวมถึงการตั้งค่าอื่นๆ ไว้ในอุปกรณ์นี้</translation> <translation id="424864128008805179">ต้องการออกจากระบบ Chrome ไหม</translation> <translation id="4249068189593983585">เคล็ดลับสำหรับ Chrome ถ้าต้องการดูตัวเลือกแท็บเพิ่มเติม ให้แตะปุ่ม "แสดงแท็บ" ค้างไว้ในแถบเครื่องมือ ซึ่งอยู่ที่ด้านล่างหรือด้านบนของหน้าจอ</translation> @@ -83,6 +84,7 @@ <translation id="6238746320622508509">ให้ Chrome ล็อกแท็บที่ไม่ระบุตัวตน</translation> <translation id="6412673304250309937">ตรวจสอบ URL กับรายการเว็บไซต์ที่ไม่ปลอดภัยซึ่งจัดเก็บไว้ใน Chrome หากเว็บไซต์พยายามขโมยรหัสผ่าน หรือคุณดาวน์โหลดไฟล์ที่เป็นอันตราย Chrome อาจส่ง URL รวมถึงเนื้อหาบางส่วนในหน้าไปยัง Google Safe Browsing ด้วย</translation> <translation id="6427126399757991875">องค์กรของคุณกำลังตั้งค่า Chrome...</translation> +<translation id="651403856614361404">ระบบพบว่ารหัสผ่านนี้มีการรั่วไหลจากการละเมิดข้อมูล Chrome แนะนำให้เปลี่ยนรหัสผ่านทันที</translation> <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation> <translation id="6634107063912726160">Chrome จะไม่ซิงค์ข้อมูลใหม่กับบัญชี Google ของคุณเมื่อออกจากระบบ แต่ข้อมูลที่ซิงค์ไว้ก่อนหน้านี้จะยังอยู่ในบัญชี</translation> <translation id="6648150602980899529">คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่จัดการโดย <ph name="DOMAIN" /> และทำให้ผู้ดูแลระบบของโดเมนควบคุมข้อมูล Chrome ของคุณได้ ข้อมูลของคุณจะโยงกับบัญชีนี้อย่างถาวร การออกจากระบบ Chrome จะลบข้อมูลของคุณจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังจัดเก็บอยู่ในบัญชี Google</translation> @@ -126,6 +128,7 @@ <translation id="8736550665979974340">ปลอดภัยเสมอด้วย Google Chrome</translation> <translation id="8772179140489533211">แสดงข้อความแจ้งให้ลงชื่อเข้าใช้ Chrome</translation> <translation id="8788269841521769222">คุณไม่จำเป็นต้องจำรหัสผ่านนี้ เพราะระบบจะบันทึกไว้ในเครื่องมือจัดการรหัสผ่านของ Google สำหรับ <ph name="EMAIL" /></translation> +<translation id="8897749957032330183">รหัสผ่านจะบันทึกอยู่ใน Google เครื่องมือจัดการรหัสผ่านบนอุปกรณ์นี้</translation> <translation id="8969290730818637510">เมื่อเปิดไว้ จะมีประโยชน์ดังนี้ <ph name="BEGIN_INDENT" /> • ช่วยปรับปรุง Chrome ให้ดีขึ้นสำหรับผู้ที่ใช้งานแบบคุณ<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb index bcd7ef7..7d2bcd4 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb
@@ -52,6 +52,7 @@ <translation id="3988789688219830639">Google Chrome rasm va videolaringizni ko‘ra olmayapti. “Sozlamalar > Maxfiylik > Rasmlar” oynasida ruxsat bering.</translation> <translation id="4099578267706723511">Google’ga foydalanish statistikasi va ishdan chiqish hisobotlarini jo‘natish orqali Chrome’ning takomillashtirishga yordam bering</translation> <translation id="417201473131094001">Chrome Canary nashrida ishlamaydi</translation> +<translation id="4192781968753717021">Bu parol oshkor qilinganligi aniqlandi. Google Parollar menejeri bu parolni hoziroq almashtirishni tavsiya etadi.</translation> <translation id="4233521129555661685"><ph name="USER_EMAIL1" /> Chrome ishlatardi va bu qurilmada uning bukmarklar, parollar va boshqa sozlamalari qolgan.</translation> <translation id="424864128008805179">Chrome hisobidan chiqmoqchimisiz?</translation> <translation id="4249068189593983585">Chrome maslahati. Ko‘proq varaqlarni tanlash uchun ekranning quyi yoki yuqorisida joylashgan asboblar panelidan Varaqlarni ko‘rsatish tugmasi ustiga bosib turing.</translation> @@ -83,6 +84,7 @@ <translation id="6238746320622508509">Chrome bilan Inkognito varaqlarni himoyalang.</translation> <translation id="6412673304250309937">URL manzillar Chrome bilgan zararli saytlar roʻyxati orqali tekshiriladi. Agar sayt parolingizni oʻgirlashga urinsa yoki zararli fayl yuklab olsangiz, Chrome ham URL manzillar kabi sahifa elementlarini Saytlarni xavfsiz kezish tizimiga yuborishi mumkin.</translation> <translation id="6427126399757991875">Chrome tashkilotingiz tomonidan sozlanmoqda...</translation> +<translation id="651403856614361404">Bu parol oshkor qilinganligi aniqlandi. Chrome parolingizni hoziroq oʻzgartirishni tavsiya etadi.</translation> <translation id="6600954340915313787">Chrome’ga nusxalandi</translation> <translation id="6634107063912726160">Hisobingizdan chiqsangiz, Chrome yangi maʼlumotlarni Google hisobingizga sinxronlamaydi. Oldin sinxronlangan maʼlumotlar hisobingizda qoladi.</translation> <translation id="6648150602980899529"><ph name="DOMAIN" /> domenida boshqariladigan hisobga kirish bilan siz administratorga Chrome ma’lumotlaringizni boshqarishiga rozilik bildirasiz. Barcha Chrome ma’lumotlaringiz bu hisobga butunlay bog‘langan. Agar hisobdan chiqadigan bo‘lsangiz, bu qurilmadagi barcha ma’lumotlaringiz o‘chib ketadi, lekin Google hisobingizda saqlanib qoladi.</translation> @@ -126,6 +128,7 @@ <translation id="8736550665979974340">Google Chrome bilan himoyalaning</translation> <translation id="8772179140489533211">Chrome orqali kirish oynasi chiqadi.</translation> <translation id="8788269841521769222">Bu parolni eslab qolishingiz shart emas. U Google Parollar menejerida <ph name="EMAIL" /> hisobiga saqlanadi.</translation> +<translation id="8897749957032330183">Parollar shu qurilmadagi Google Parollar menejeriga saqlanadi.</translation> <translation id="8969290730818637510">Yoniq boʻlsa: <ph name="BEGIN_INDENT" /> • Chromeni siz kabi ishlatadigan odamlar uchun yaxshilashga yordam beradi<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 20ab325..ef3bb076 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">የእርስዎ ድርጅት ማንነት የማያሳውቅ ሁነታን ይፈልጋል</translation> <translation id="1323735185997015385">ሰርዝ</translation> <translation id="132683371494960526">የቀድሞ አቃፊውን ለመለወጥ ሁለቴ መታ ያድርጉ።</translation> +<translation id="1335348992705722518">ቅንብሮችን አስተዳድር...</translation> <translation id="1340643665687018190">ምናሌን ዝጋ</translation> <translation id="1358214951266274152">የቀዱትን አገናኝ ይጎብኙ</translation> <translation id="1360432990279830238">ዘግተው ወጥተው ስምረት ይጥፋ?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 83dbaaa..e276db3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">تفرض مؤسستك استخدام "وضع التصفُّح المتخفي".</translation> <translation id="1323735185997015385">حذف</translation> <translation id="132683371494960526">انقر مرّتين لتغيير المجلد الرئيسي.</translation> +<translation id="1335348992705722518">إدارة الإعدادات...</translation> <translation id="1340643665687018190">إغلاق القائمة</translation> <translation id="1358214951266274152">الانتقال إلى الرابط الذي نسخته</translation> <translation id="1360432990279830238">هل تريد تسجيل الخروج وإيقاف المزامنة؟</translation> @@ -385,6 +386,7 @@ <translation id="4187450337729239226">اللصق والبحث</translation> <translation id="4223967053752765281">أوقفت مؤسستك إمكانية تسجيل الدخول. سيظل بإمكانك الاطّلاع على الإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى على هذا الجهاز. وفي حال إجراء أي تغييرات، لن تتم مزامنتها مع حسابك.</translation> <translation id="4233831822770018312">تعديل الأذونات</translation> +<translation id="4236584471598725073">يتم حاليًا تتبُّع السعر</translation> <translation id="4237377247299956313">النقر على <ph name="BEGIN_BOLD" />Default Browser App (تطبيق المتصفِّح التلقائي)<ph name="END_BOLD" /></translation> <translation id="424315890655130736">إدخال عبارة المرور</translation> <translation id="4249955472157341256">الترتيب حسب الأحدث</translation> @@ -813,7 +815,7 @@ <translation id="7603852183842204213">تم حظر النوافذ المنبثقة (<ph name="NUMBER_OF_BLOCKED_POPUPS" />)</translation> <translation id="7607521702806708809">حذف كلمة المرور</translation> <translation id="7638584964844754484">عبارة مرور غير صحيحة</translation> -<translation id="7646263789464975852">القائمة ← الإعدادات ← تأكيد السلامة</translation> +<translation id="7646263789464975852">القائمة ← الإعدادات ← التحقّق من الأمان</translation> <translation id="7646772052135772216">مزامنة كلمات المرور لا تعمل</translation> <translation id="7649070708921625228">مساعدة</translation> <translation id="7658239707568436148">إلغاء</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index 0ca017d..17b7e60 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">আপোনাৰ প্ৰতিষ্ঠানক ইনক’গনিট’ ম’ডৰ আৱশ্যক</translation> <translation id="1323735185997015385">মচক</translation> <translation id="132683371494960526">পেৰেণ্ট ফ’ল্ডাৰ সলনি কৰিবলৈ দুবাৰ টিপক৷</translation> +<translation id="1335348992705722518">ছেটিং পৰিচালনা কৰক...</translation> <translation id="1340643665687018190">মেনু বন্ধ কৰক</translation> <translation id="1358214951266274152">আপুনি প্ৰতিলিপি কৰা লিংকটো খোলক</translation> <translation id="1360432990279830238">ছাইন আউট কৰি ছিংক বন্ধ কৰিবনে?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">পে’ষ্ট কৰক আৰু সন্ধান কৰক</translation> <translation id="4223967053752765281">আপোনাৰ প্ৰতিষ্ঠানে ছাইন ইন কৰাটো অফ কৰিছে। আপুনি তথাপি এই ডিভাইচটোত থকা আপোনাৰ বুকমাৰ্ক, ইতিহাস, পাছৱৰ্ড আৰু অন্য ছেটিং চাব পাৰে। যদি আপুনি সালসলনি কৰে, সেয়া আপোনাৰ একাউণ্টত ছিংক নহ’ব।</translation> <translation id="4233831822770018312">অনুমতি সম্পাদনা কৰক</translation> +<translation id="4236584471598725073">মূল্য ট্ৰেক কৰি থকা হৈছে</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />ডিফ’ল্ট ব্ৰাউজাৰ এপ<ph name="END_BOLD" />ত টিপক</translation> <translation id="424315890655130736">পাছফ্ৰেজ লিখক</translation> <translation id="4249955472157341256">শেহতীয়া অনুসৰি সজাওক</translation> @@ -474,6 +476,7 @@ <translation id="4901778704868714008">ছেভ কৰক...</translation> <translation id="4904877109095351937">পঢ়া হিচাপে চিহ্নিত কৰক</translation> <translation id="4908869848243824489">Googleৰ Discover</translation> +<translation id="4916679969857390442">লেন্স</translation> <translation id="4930714375720679147">অন কৰক</translation> <translation id="4941089862236492464">দুঃখিত, আপোনাৰ বস্তুটো শ্বেয়াৰ কৰাত কিবা সমস্যা হৈছে।</translation> <translation id="4944543191714094452">পৃষ্ঠাখনত বিচাৰক…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index f325bd9..c80665c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Организацията ви изисква да сърфирате в режим „инкогнито“</translation> <translation id="1323735185997015385">Изтриване</translation> <translation id="132683371494960526">Докоснете двукратно, за да промените главната папка.</translation> +<translation id="1335348992705722518">Управление на настройките…</translation> <translation id="1340643665687018190">Затваряне на менюто</translation> <translation id="1358214951266274152">Посещаване на копираната връзка</translation> <translation id="1360432990279830238">Изход и изключване на синхронизирането?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Поставяне и търсене</translation> <translation id="4223967053752765281">Организацията ви изключи функцията за влизане в профил. Пак можете да преглеждате отметките, историята, паролите и другите си настройки на това устройство. В случай че направите промени, те няма да се синхронизират с профила ви.</translation> <translation id="4233831822770018312">Редактиране на разрешенията</translation> +<translation id="4236584471598725073">Цената се проследява</translation> <translation id="4237377247299956313">Докоснете <ph name="BEGIN_BOLD" />Стандартно прилож. за браузър<ph name="END_BOLD" />.</translation> <translation id="424315890655130736">Въвеждане на пропуск</translation> <translation id="4249955472157341256">Сортиране по актуалност</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index b9ab228..d1ff21b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">Enganxa i cerca</translation> <translation id="4223967053752765281">La teva organització ha desactivat l'inici de sessió. Encara pots veure les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració en aquest dispositiu. Si fas canvis, no se sincronitzaran amb el teu compte.</translation> <translation id="4233831822770018312">Edita els permisos</translation> +<translation id="4236584471598725073">Estàs fent un seguiment del preu</translation> <translation id="4237377247299956313">Toca <ph name="BEGIN_BOLD" />Aplicació de navegador predeterminada<ph name="END_BOLD" />.</translation> <translation id="424315890655130736">Introduïu la frase de contrasenya</translation> <translation id="4249955472157341256">Ordena per Més recents</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index 49d0180..fe64f34b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Mae eich sefydliad yn gofyn am y Modd Anhysbys</translation> <translation id="1323735185997015385">Dileu</translation> <translation id="132683371494960526">Tapiwch ddwywaith i newid y ffolder rhiant.</translation> +<translation id="1335348992705722518">Rheoli Gosodiadau…</translation> <translation id="1340643665687018190">Cau'r Ddewislen</translation> <translation id="1358214951266274152">Mynd i Ddolen y Gwnaethoch ei Chopïo</translation> <translation id="1360432990279830238">Allgofnodi a diffodd cysoni?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Gludo a Chwilio</translation> <translation id="4223967053752765281">Mae eich sefydliad wedi diffodd mewngofnodi. Gallwch weld eich nodau tudalen, eich hanes, eich cyfrineiriau a'ch gosodiadau eraill ar y ddyfais hon o hyd. Os byddwch yn gwneud newidiadau, ni fyddant yn cysoni i'ch cyfrif.</translation> <translation id="4233831822770018312">Golygu Caniatadau</translation> +<translation id="4236584471598725073">Yn Dilyn y Pris</translation> <translation id="4237377247299956313">Tapiwch <ph name="BEGIN_BOLD" />Ap Pori Diofyn<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Rhowch Gyfrinymadrodd</translation> <translation id="4249955472157341256">Trefnu yn ôl Diweddaraf</translation> @@ -474,6 +476,7 @@ <translation id="4901778704868714008">Cadw...</translation> <translation id="4904877109095351937">Marcio fel wedi'i Ddarllen</translation> <translation id="4908869848243824489">Darganfod gan Google</translation> +<translation id="4916679969857390442">Lens</translation> <translation id="4930714375720679147">Troi Ymlaen</translation> <translation id="4941089862236492464">Mae'n ddrwg gennym, bu problem wrth rannu eich eitem.</translation> <translation id="4944543191714094452">Chwilio'r Dudalen…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 706d33c..07fff7025 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Din organisation kræver inkognitotilstand</translation> <translation id="1323735185997015385">Slet</translation> <translation id="132683371494960526">Tryk to gange for at ændre den overordnede mappe.</translation> +<translation id="1335348992705722518">Administrer indstillinger...</translation> <translation id="1340643665687018190">Luk menu</translation> <translation id="1358214951266274152">Gå til link, du har kopieret</translation> <translation id="1360432990279830238">Log ud, og deaktiver synkronisering?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Indsæt og søg</translation> <translation id="4223967053752765281">Din organisation har deaktiveret login. Du kan stadig se din historik samt dine bogmærker, adgangskoder og andre indstillinger på din enhed. Hvis du foretager nogen ændringer, bliver de dog ikke synkroniseret med din konto.</translation> <translation id="4233831822770018312">Rediger tilladelser</translation> +<translation id="4236584471598725073">Der holdes øje med prisen</translation> <translation id="4237377247299956313">Tryk på <ph name="BEGIN_BOLD" />Standardbrowserapp<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Angiv adgangssætning</translation> <translation id="4249955472157341256">Sortér efter seneste</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 3d83a24..dcc58f7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">Einfügen und suchen</translation> <translation id="4223967053752765281">Deine Organisation hat die Anmeldung deaktiviert. Du siehst weiterhin deine Lesezeichen, den Verlauf, deine Passwörter und andere Einstellungen auf diesem Gerät. Änderungen werden aber nicht mehr mit deinem Konto synchronisiert.</translation> <translation id="4233831822770018312">Berechtigungen bearbeiten</translation> +<translation id="4236584471598725073">Preis wird beobachtet</translation> <translation id="4237377247299956313">Tippe auf <ph name="BEGIN_BOLD" />Standard-Browser-App<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Passphrase eingeben</translation> <translation id="4249955472157341256">Neueste zuerst</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index e00fb425..9e7b3d90 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -23,6 +23,7 @@ <translation id="1104948393051856124">Accept & Continue</translation> <translation id="110724200315609752">Switch to open window</translation> <translation id="1112015203684611006">Printing failed.</translation> +<translation id="1118569444314402022">Welcome back, <ph name="USER_NAME" /></translation> <translation id="1125564390852150847">Create new tab.</translation> <translation id="1126809382673880764">Does not protect you against dangerous websites, downloads and extensions. You’ll still get Safe Browsing protection, where available, in other Google services, like Gmail and Search.</translation> <translation id="1135212215217513471">Get Chrome for iOS</translation> @@ -63,6 +64,7 @@ <translation id="1377255359165588604">Sync has stopped working.</translation> <translation id="1377321085342047638">Card number</translation> <translation id="1383876407941801731">Search</translation> +<translation id="138618066238211776">Continue as <ph name="USER_NAME" /></translation> <translation id="1400642268715879018">Last 4 Weeks</translation> <translation id="1404330357948037222">You're signed out</translation> <translation id="1407135791313364759">Open all</translation> @@ -176,6 +178,7 @@ <translation id="2421044535038393232">Keep editing</translation> <translation id="2434405374328098816">You already saved a password for '<ph name="USERNAME" />' at <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Show password</translation> +<translation id="2461070143328828326">Password Settings</translation> <translation id="2469960372084740698">Turn off Safe Browsing?</translation> <translation id="2473876017985765807">You already saved a password for <ph name="WEBSITE" /></translation> <translation id="2476359652512522418">Not selected</translation> @@ -330,6 +333,7 @@ <translation id="3709582977625132201">Mark as unread</translation> <translation id="371230970611282515">Predicts and warns you about dangerous events before they happen.</translation> <translation id="37207012422556617">Trending searches</translation> +<translation id="3726360487031500941">Sign in again to your account <ph name="USER_NAME" /></translation> <translation id="3740397331642243698">Opens the inputted URLs in Google Chrome in Incognito.</translation> <translation id="3762232513783804601">Built for your iPad</translation> <translation id="3771033907050503522">Incognito Tabs</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 3cfe374..d086b81 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Tu organización requiere que uses el modo Incógnito</translation> <translation id="1323735185997015385">Eliminar</translation> <translation id="132683371494960526">Toca dos veces para cambiar la carpeta principal.</translation> +<translation id="1335348992705722518">Gestionar configuración...</translation> <translation id="1340643665687018190">Cerrar el menú</translation> <translation id="1358214951266274152">Ir al enlace que has copiado</translation> <translation id="1360432990279830238">¿Cerrar sesión y detener sincronización?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 3113d94..b804d9f6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Teie organisatsioon nõuab inkognito režiimi kasutamist</translation> <translation id="1323735185997015385">Kustuta</translation> <translation id="132683371494960526">Ülemkausta muutmiseks topeltpuudutage.</translation> +<translation id="1335348992705722518">Seadete haldamine …</translation> <translation id="1340643665687018190">Sule menüü</translation> <translation id="1358214951266274152">Külastage kopeeritud linki</translation> <translation id="1360432990279830238">Login välja ja keelan sünkroonimise?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 5f355eda..b17c6b69 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">Itsasi eta bilatu</translation> <translation id="4223967053752765281">Erakundeak saioa hasteko aukera desaktibatu du. Gailuan dituzu oraindik laster-markak, historia, pasahitzak eta bestelako ezarpenak. Aldaketarik eginez gero, ez dira sinkronizatuko kontuarekin.</translation> <translation id="4233831822770018312">Editatu baimenak</translation> +<translation id="4236584471598725073">Prezioaren jarraipena egiten ari zara</translation> <translation id="4237377247299956313">Sakatu <ph name="BEGIN_BOLD" />Arakatzaile lehenetsia<ph name="END_BOLD" />.</translation> <translation id="424315890655130736">Idatzi pasaesaldia</translation> <translation id="4249955472157341256">Ordenatu berrienetatik zaharrenetara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index eab590f..ee17ea59 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">سازمانتان استفاده از «حالت ناشناس» را الزامی کرده است</translation> <translation id="1323735185997015385">حذف</translation> <translation id="132683371494960526">برای تغییر پوشه والد دو ضربه سریع بزنید.</translation> +<translation id="1335348992705722518">مدیریت تنظیمات…</translation> <translation id="1340643665687018190">بستن منو</translation> <translation id="1358214951266274152">رفتن به پیوندی که کپی کردید</translation> <translation id="1360432990279830238">از سیستم خارج و همگامسازی خاموش شود؟</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">جایگذاری و جستجو</translation> <translation id="4223967053752765281">سازمانتان ورود به سیستم را خاموش کرده است. همچنان میتوانید نشانکها، سابقه، گذرواژهها، و دیگر تنظیماتتان را در این دستگاه ببینید. اگر تغییری ایجاد کنید، با حسابتان همگامسازی نمیشود.</translation> <translation id="4233831822770018312">ویرایش اجازهها</translation> +<translation id="4236584471598725073">پیگیری قیمت</translation> <translation id="4237377247299956313">روی <ph name="BEGIN_BOLD" />برنامه مرور پیشفرض<ph name="END_BOLD" /> ضربه بزنید</translation> <translation id="424315890655130736">گذرعبارت را وارد کنید</translation> <translation id="4249955472157341256">مرتبسازی براساس جدیدترین</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 86d21a7..60682a9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -383,6 +383,7 @@ <translation id="4187450337729239226">Liitä ja hae</translation> <translation id="4223967053752765281">Organisaatiosi on laittanut sisäänkirjautumisen pois päältä. Voit edelleen nähdä kirjanmerkit, historian, salasanat ja muut asetukset tällä laitteella. Jos teet muutoksia, niitä ei synkronoida tilillesi.</translation> <translation id="4233831822770018312">Muokkaa lupia</translation> +<translation id="4236584471598725073">Hintaa seurataan</translation> <translation id="4237377247299956313">Valitse <ph name="BEGIN_BOLD" />Oletusselainsovellus<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Anna tunnuslause</translation> <translation id="4249955472157341256">Lajittele viimeisimmät ensimmäisiksi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index dcbb429a..1225220 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">I-paste at Maghanap</translation> <translation id="4223967053752765281">Na-off ng iyong organisasyon ang pag-sign in. Makikita mo pa rin ang iyong mga bookmark, history, password, at iba pang setting sa device na ito. Kung gagawa ka ng mga pagbabago, hindi masi-sync ang mga ito sa iyong account.</translation> <translation id="4233831822770018312">I-edit ang Mga Pahintulot</translation> +<translation id="4236584471598725073">Sinusubaybayan ang Presyo</translation> <translation id="4237377247299956313">I-tap ang <ph name="BEGIN_BOLD" />Default na Browser App<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Ilagay ang Passphrase</translation> <translation id="4249955472157341256">Pagbukud-bukurin ayon sa Pinakabago</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index f0236ef..bcb1540 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">તમારી સંસ્થાને છૂપા મોડની જરૂર છે</translation> <translation id="1323735185997015385">ડિલીટ કરો</translation> <translation id="132683371494960526">મૂળ ફોલ્ડર બદલવા માટે બે વાર ટૅપ કરો.</translation> +<translation id="1335348992705722518">સેટિંગને મેનેજ કરો...</translation> <translation id="1340643665687018190">મેનૂ બંધ કરો</translation> <translation id="1358214951266274152">તમે કૉપિ કરેલી લિંકની મુલાકાત લો</translation> <translation id="1360432990279830238">સાઇન આઉટ કરી સિંકનો વિકલ્પ બંધ કરવો છે?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">પેસ્ટ કરો અને શોધો</translation> <translation id="4223967053752765281">તમારી સંસ્થાએ સાઇન ઇન કરવાનું બંધ કર્યું છે. તમે હજુ પણ આ ડિવાઇસ પરના તમારા બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને અન્ય સેટિંગ જોઈ શકો છો. જો તમે ફેરફારો કરશો, તો તે તમારા એકાઉન્ટ સાથે સિંક કરવામાં આવશે નહીં.</translation> <translation id="4233831822770018312">ફેરફાર કરવાની પરવાનગીઓ</translation> +<translation id="4236584471598725073">કિંમત ટ્રૅક કરી રહ્યાં છીએ</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />ડિફૉલ્ટ બ્રાઉઝર ઍપ<ph name="END_BOLD" /> પર ટૅપ કરો</translation> <translation id="424315890655130736">પાસફ્રેઝ દાખલ કરો</translation> <translation id="4249955472157341256">નવીનતમ મુજબ સૉર્ટ કરો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 5f0290e..17023e3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">आपके संगठन के मुताबिक, गुप्त मोड इस्तेमाल करना ज़रूरी है</translation> <translation id="1323735185997015385">मिटाएं</translation> <translation id="132683371494960526">मूल फ़ोल्डर बदलने के लिए दो बार टैप करें.</translation> +<translation id="1335348992705722518">सेटिंग मैनेज करें...</translation> <translation id="1340643665687018190">मेन्यू बंद करें</translation> <translation id="1358214951266274152">जो लिंक आपने कॉपी किया है उस पर जाएं</translation> <translation id="1360432990279830238">साइन आउट करें और सिंक बंद करें?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">चिपकाएं और खोजें</translation> <translation id="4223967053752765281">आपके संगठन ने साइन इन करने की सुविधा बंद कर दी है. इस डिवाइस पर आपके सभी बुकमार्क, इतिहास, पासवर्ड, और अन्य सेटिंग अब भी देखी जा सकती हैं. अगर इनमें कोई बदलाव किया जाता है, तो उसे आपके खाते में सिंक नहीं किया जाएगा.</translation> <translation id="4233831822770018312">अनुमतियों में बदलाव करें</translation> +<translation id="4236584471598725073">कीमत ट्रैक करने की सुविधा</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन<ph name="END_BOLD" /> पर टैप करें</translation> <translation id="424315890655130736">पासफ़्रेज़ डालें</translation> <translation id="4249955472157341256">'सबसे नए' के मुताबिक क्रम से लगाएं</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index abb1838..26a0d1c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Szervezete megköveteli az inkognitó mód használatát</translation> <translation id="1323735185997015385">Törlés</translation> <translation id="132683371494960526">Koppintson duplán a szülőmappa módosításához.</translation> +<translation id="1335348992705722518">Beállítások kezelése…</translation> <translation id="1340643665687018190">Menü bezárása</translation> <translation id="1358214951266274152">A vágólapra másolt link megnyitása</translation> <translation id="1360432990279830238">Kijelentkezik, és kikapcsolja a szinkronizálást?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 43189dc..3f6806d29 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">La tua organizzazione richiede la modalità in incognito</translation> <translation id="1323735185997015385">Elimina</translation> <translation id="132683371494960526">Tocca due volte per cambiare la cartella principale.</translation> +<translation id="1335348992705722518">Gestisci impostazioni…</translation> <translation id="1340643665687018190">Chiudi menu</translation> <translation id="1358214951266274152">Visita il link che hai copiato</translation> <translation id="1360432990279830238">Uscire e disattivare la sincronizzazione?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index ccebe58c..4122c3f4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">מצב אנונימי נדרש על ידי הארגון שלך</translation> <translation id="1323735185997015385">מחיקה</translation> <translation id="132683371494960526">יש להקיש פעמיים כדי לשנות את תיקיית האב.</translation> +<translation id="1335348992705722518">ניהול ההגדרות...</translation> <translation id="1340643665687018190">סגירת התפריט</translation> <translation id="1358214951266274152">מעבר לקישור שהעתקת</translation> <translation id="1360432990279830238">לצאת ולהשבית את הסנכרון?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">הדבקה וחיפוש</translation> <translation id="4223967053752765281">הכניסה הושבתה על ידי הארגון שלך. יש לך עדיין אפשרות לראות את הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות במכשיר הזה. שינויים שיתבצעו על ידך לא יסונכרנו בחשבון שלך.</translation> <translation id="4233831822770018312">עריכת ההרשאות</translation> +<translation id="4236584471598725073">המחיר נמצא במעקב</translation> <translation id="4237377247299956313">מקישים על <ph name="BEGIN_BOLD" />אפליקציית הדפדפן שמוגדרת כברירת מחדל<ph name="END_BOLD" />.</translation> <translation id="424315890655130736">הזנת ביטוי סיסמה</translation> <translation id="4249955472157341256">מיון לפי 'האחרון'</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 0124f161..d247ff16 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">조직에서 시크릿 모드 사용을 요구함</translation> <translation id="1323735185997015385">삭제</translation> <translation id="132683371494960526">상위 폴더를 변경하려면 두 번 탭하세요.</translation> +<translation id="1335348992705722518">설정 관리…</translation> <translation id="1340643665687018190">메뉴 닫기</translation> <translation id="1358214951266274152">복사한 링크 방문</translation> <translation id="1360432990279830238">로그아웃하고 동기화를 사용 중지하시겠습니까?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">붙여넣어 검색하기</translation> <translation id="4223967053752765281">조직에서 로그인을 사용 중지했습니다. 북마크, 방문 기록, 비밀번호, 기타 설정은 이 기기에서 계속 확인할 수 있습니다. 변경할 경우 변경사항이 내 계정에 동기화되지는 않습니다.</translation> <translation id="4233831822770018312">권한 수정</translation> +<translation id="4236584471598725073">가격 추적 중</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />Default Browser App(기본 브라우저 앱)<ph name="END_BOLD" />을 탭합니다.</translation> <translation id="424315890655130736">암호 입력</translation> <translation id="4249955472157341256">최신순 정렬</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 4bfc330..a8f1935 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Organizacija reikalauja naudoti inkognito režimą</translation> <translation id="1323735185997015385">Ištrinti</translation> <translation id="132683371494960526">Dukart palieskite, kad pakeistumėte viršaplankį.</translation> +<translation id="1335348992705722518">Tvarkyti nustatymus...</translation> <translation id="1340643665687018190">Uždaryti meniu</translation> <translation id="1358214951266274152">Atidaryti nukopijuotą nuorodą</translation> <translation id="1360432990279830238">Atsijungti ir išjungti sinchronizavimą?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Įklijuoti ir ieškoti</translation> <translation id="4223967053752765281">Organizacija išjungė prisijungimą. Vis tiek galėsite peržiūrėti žymes, istoriją, slaptažodžius ir kitus nustatymus šiame įrenginyje. Jei atliksite pakeitimų, jie nebus sinchronizuojami su jūsų paskyra.</translation> <translation id="4233831822770018312">Redaguoti leidimus</translation> +<translation id="4236584471598725073">Kainos stebėjimas</translation> <translation id="4237377247299956313">Palieskite <ph name="BEGIN_BOLD" />Numatytoji naršyklės programa<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Slaptafrazės įvedimas</translation> <translation id="4249955472157341256">Rūšiuoti pagal naujausią</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 1815cb83..3966a41 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Танай байгууллага Нууцлалын горимыг шаардаж байна</translation> <translation id="1323735185997015385">Устгах</translation> <translation id="132683371494960526">Эцэг эхийн фолдерийг өөрчлөхийн тулд хоёр товшино уу.</translation> +<translation id="1335348992705722518">Тохиргоог удирдах...</translation> <translation id="1340643665687018190">Хаах цэс</translation> <translation id="1358214951266274152">Хуулсан холбоосондоо зочлох</translation> <translation id="1360432990279830238">Гараад синк хийхийг унтраах уу?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index fca8b1a2..b5b6989c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">ကူးထည့်ပြီး ရှာရန်</translation> <translation id="4223967053752765281">လက်မှတ်ထိုးဝင်ခြင်းကို သင့်အဖွဲ့အစည်းက ပိတ်ထားသည်။ ဤစက်ပေါ်တွင် သင့်လိပ်စာ၊ မှတ်တမ်း၊ စကားဝှက်နှင့် အခြားဆက်တင်များကို ကြည့်နိုင်ပါသေးသည်။ အပြောင်းအလဲများ ပြုလုပ်ပါက ၎င်းတို့ကို သင်၏အကောင့်နှင့် စင့်ခ်လုပ်မည်မဟုတ်ပါ။</translation> <translation id="4233831822770018312">ခွင့်ပြုချက်များ ပြင်ဆင်ခြင်း</translation> +<translation id="4236584471598725073">ဈေးနှုန်း စောင့်ကြည့်ခြင်း</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />မူရင်း ဘရောင်ဇာအက်ပ်<ph name="END_BOLD" /> ကို တို့ပါ</translation> <translation id="424315890655130736">စကားဝှက်ကိုထည့်ပါ</translation> <translation id="4249955472157341256">နောက်ဆုံးရရှိမှုအလိုက် စီရန်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index 7d4f553..0e8099597 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">Plakken en zoeken</translation> <translation id="4223967053752765281">Je organisatie heeft inloggen uitgezet. Je bookmarks, geschiedenis, wachtwoorden en andere instellingen blijven zichtbaar op dit apparaat. Als je wijzigingen aanbrengt, worden deze niet gesynchroniseerd met je account.</translation> <translation id="4233831822770018312">Rechten bewerken</translation> +<translation id="4236584471598725073">Prijs wordt gevolgd</translation> <translation id="4237377247299956313">Tik op <ph name="BEGIN_BOLD" />Standaard browser-app<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Wachtwoordzin opgeven</translation> <translation id="4249955472157341256">Sorteren op nieuwste</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 1db66b5..18c74b9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Twoja organizacja wymaga trybu incognito</translation> <translation id="1323735185997015385">Usuń</translation> <translation id="132683371494960526">Kliknij dwukrotnie, by zmienić folder nadrzędny.</translation> +<translation id="1335348992705722518">Zarządzaj ustawieniami…</translation> <translation id="1340643665687018190">Zamknij menu</translation> <translation id="1358214951266274152">Otwórz skopiowany link</translation> <translation id="1360432990279830238">Wylogować i wyłączyć synchronizację?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Wklej i wyszukaj</translation> <translation id="4223967053752765281">Twoja organizacja wyłączyła logowanie się. Nadal masz dostęp do swoich zakładek, historii, haseł i innych ustawień na tym urządzeniu. Jeśli wprowadzisz zmiany, nie zostaną one zsynchronizowane na Twoim koncie.</translation> <translation id="4233831822770018312">Edytuj uprawnienia</translation> +<translation id="4236584471598725073">Monitoruję cenę</translation> <translation id="4237377247299956313">Kliknij <ph name="BEGIN_BOLD" />Domyślna przeglądarka<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Wpisz hasło</translation> <translation id="4249955472157341256">Sortuj od najnowszego</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index a4b4472..94b0f4c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">Inserează și caută</translation> <translation id="4223967053752765281">Organizația a dezactivat conectarea. Poți vedea în continuare marcajele, istoricul, parolele și alte setări pe acest dispozitiv. Dacă faci modificări, ele nu se vor sincroniza cu contul.</translation> <translation id="4233831822770018312">Editează permisiunile</translation> +<translation id="4236584471598725073">Se urmărește prețul</translation> <translation id="4237377247299956313">Atinge <ph name="BEGIN_BOLD" />Aplicația browser prestabilită<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Introdu expresia de acces</translation> <translation id="4249955472157341256">Sortează după cele mai recente</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 022603b..93874fc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -383,6 +383,7 @@ <translation id="4187450337729239226">Вставить из буфера и найти</translation> <translation id="4223967053752765281">В вашей организации вход в браузере отключен. На этом устройстве по-прежнему доступны закладки, история, пароли и другие настройки. Однако изменения не сохраняются в вашем аккаунте.</translation> <translation id="4233831822770018312">Изменение разрешений</translation> +<translation id="4236584471598725073">Отслеживание цен</translation> <translation id="4237377247299956313">Нажмите <ph name="BEGIN_BOLD" />Браузер по умолчанию<ph name="END_BOLD" />.</translation> <translation id="424315890655130736">Введите кодовую фразу</translation> <translation id="4249955472157341256">Сортировать по дате</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index ac681477..ee4a6ddc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">Prilepiť a hľadať</translation> <translation id="4223967053752765281">Vaša organizácia vypla prihlasovanie. Naďalej uvidíte všetky svoje záložky, históriu, heslá a ďalšie nastavenia v tomto zariadení. Ak vykonáte zmeny, nebudú synchronizované do vášho účtu.</translation> <translation id="4233831822770018312">Úprava povolení</translation> +<translation id="4236584471598725073">Cena sa sleduje</translation> <translation id="4237377247299956313">Klepnite na položku <ph name="BEGIN_BOLD" />Predvolená aplikácia prehliadača<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Zadajte prístupovú frázu</translation> <translation id="4249955472157341256">Zoradiť od najnovších</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 2f9edd7..07e63f6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Vaša organizacija zahteva anonimni način.</translation> <translation id="1323735185997015385">Izbriši</translation> <translation id="132683371494960526">Double tap to change the parent folder.</translation> +<translation id="1335348992705722518">Upravljaj nastavitve …</translation> <translation id="1340643665687018190">Close Menu</translation> <translation id="1358214951266274152">Obisk povezave, ki ste jo kopirali</translation> <translation id="1360432990279830238">Odjava in izklop sinhronizacije?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Lepljenje in iskanje</translation> <translation id="4223967053752765281">Organizacija je izklopila prijavo. Še vedno si lahko ogledate zaznamke, zgodovino, gesla in druge nastavitve v tej napravi. Če naredite spremembe, ne bodo sinhronizirane z računom.</translation> <translation id="4233831822770018312">Urejanje dovoljenj</translation> +<translation id="4236584471598725073">Spremljanje cene</translation> <translation id="4237377247299956313">Dotaknite se možnosti za <ph name="BEGIN_BOLD" />privzeto aplikacijo za brskanje<ph name="END_BOLD" />.</translation> <translation id="424315890655130736">Vnos gesla</translation> <translation id="4249955472157341256">Razvrsti glede na najnovejše</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index a2ce51f..893bc82 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -23,6 +23,7 @@ <translation id="1104948393051856124">ยอมรับและดำเนินการต่อ</translation> <translation id="110724200315609752">เปลี่ยนเพื่อเปิดหน้าต่าง</translation> <translation id="1112015203684611006">การพิมพ์ล้มเหลว</translation> +<translation id="1118569444314402022">ยินดีต้อนรับกลับมา <ph name="USER_NAME" /></translation> <translation id="1125564390852150847">สร้างแท็บใหม่</translation> <translation id="1126809382673880764">ไม่ปกป้องคุณจากเว็บไซต์ การดาวน์โหลด และส่วนขยายที่เป็นอันตราย คุณจะยังคงได้รับการปกป้องจาก Google Safe Browsing ในบริการอื่นๆ ของ Google ที่มีฟีเจอร์นี้ เช่น Gmail และ Search</translation> <translation id="1135212215217513471">ดาวน์โหลด Chrome สำหรับ iOS</translation> @@ -63,6 +64,7 @@ <translation id="1377255359165588604">การซิงค์หยุดทำงานแล้ว</translation> <translation id="1377321085342047638">หมายเลขบัตร</translation> <translation id="1383876407941801731">ค้นหา</translation> +<translation id="138618066238211776">ดำเนินการต่อในชื่อ <ph name="USER_NAME" /></translation> <translation id="1400642268715879018">4 สัปดาห์ที่ผ่านมา</translation> <translation id="1404330357948037222">คุณออกจากระบบแล้ว</translation> <translation id="1407135791313364759">เปิดทั้งหมด</translation> @@ -176,6 +178,7 @@ <translation id="2421044535038393232">แก้ไขต่อไป</translation> <translation id="2434405374328098816">คุณบันทึกรหัสผ่านสำหรับ "<ph name="USERNAME" />" ที่ <ph name="WEBSITE" /> ไว้แล้ว</translation> <translation id="2435457462613246316">แสดงรหัสผ่าน</translation> +<translation id="2461070143328828326">การตั้งค่ารหัสผ่าน</translation> <translation id="2469960372084740698">ปิด Google Safe Browsing ใช่ไหม</translation> <translation id="2473876017985765807">คุณบันทึกรหัสผ่านสำหรับ <ph name="WEBSITE" /> ไว้แล้ว</translation> <translation id="2476359652512522418">ไม่ได้เลือก</translation> @@ -330,6 +333,7 @@ <translation id="3709582977625132201">ทำเครื่องหมายว่ายังไม่อ่าน</translation> <translation id="371230970611282515">คาดการณ์และเตือนคุณก่อนเกิดเหตุการณ์อันตราย</translation> <translation id="37207012422556617">การค้นหาที่มาแรง</translation> +<translation id="3726360487031500941">ลงชื่อเข้าใช้บัญชี "<ph name="USER_NAME" />" อีกครั้ง</translation> <translation id="3740397331642243698">เปิด URL ที่ป้อนใน Google Chrome ในโหมดไม่ระบุตัวตน</translation> <translation id="3762232513783804601">สร้างมาเพื่อ iPad ของคุณ</translation> <translation id="3771033907050503522">แท็บที่ไม่ระบุตัวตน</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 94b23e42..d17539f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Kuruluşunuz Gizli modu gerektiriyor</translation> <translation id="1323735185997015385">Sil</translation> <translation id="132683371494960526">Üst klasörü değiştirmek için iki kez dokunun.</translation> +<translation id="1335348992705722518">Ayarları yönet...</translation> <translation id="1340643665687018190">Menüyü Kapat</translation> <translation id="1358214951266274152">Kopyalanan Bağlantıyı Ziyaret Et</translation> <translation id="1360432990279830238">Oturum ve senkronizasyon kapatılsın mı?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Yapıştır ve Ara</translation> <translation id="4223967053752765281">Kuruluşunuz oturum açmayı devre dışı bıraktı. Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızı bu cihazda görmeye devam edebilirsiniz. Değişiklik yaparsanız bu değişiklikler hesabınızla senkronize edilmez.</translation> <translation id="4233831822770018312">İzinleri düzenle</translation> +<translation id="4236584471598725073">Fiyat Takip Ediliyor</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />Varsayılan Tarayıcı Uygulaması<ph name="END_BOLD" />'na dokunun</translation> <translation id="424315890655130736">Parolayı Girin</translation> <translation id="4249955472157341256">En güncel tarihe göre sırala</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 77bac04d..9ba06e5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">Адміністратор організації вимагає використовувати режим анонімного перегляду</translation> <translation id="1323735185997015385">Видалити</translation> <translation id="132683371494960526">Двічі торкніться, щоб змінити батьківську папку.</translation> +<translation id="1335348992705722518">Керувати налаштуваннями…</translation> <translation id="1340643665687018190">Закрити меню</translation> <translation id="1358214951266274152">Перейти за скопійованим посиланням</translation> <translation id="1360432990279830238">Вийти й вимкнути синхронізацію?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">Вставити та здійснити пошук</translation> <translation id="4223967053752765281">Адміністратор вашої організації вимкнув можливість входу. Ви все ще можете переглядати свої закладки, історію, паролі й інші налаштування на цьому пристрої. Якщо ви внесете зміни, вони не синхронізуватимуться з обліковим записом.</translation> <translation id="4233831822770018312">Змінити дозволи</translation> +<translation id="4236584471598725073">Відстеження ціни</translation> <translation id="4237377247299956313">Натисніть <ph name="BEGIN_BOLD" />Веб-переглядач за умовчанням<ph name="END_BOLD" /></translation> <translation id="424315890655130736">Ввести парольну фразу</translation> <translation id="4249955472157341256">Сортувати за категорією "Останні"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index cdd8e2e..61ef4c0b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -384,6 +384,7 @@ <translation id="4187450337729239226">پیسٹ کریں اور تلاش کریں</translation> <translation id="4223967053752765281">آپ کی تنظیم نے سائن ان کو آف کر دیا ہے۔ آپ ابھی بھی اپنے بک مارکس، سرگزشت، پاس ورڈز اور دیگر ترتیبات کو اس آلے پر دیکھ سکتے ہیں۔ اگر آپ تبدیلیاں کرتے ہیں تو وہ آپ کے اکاؤنٹ کے ساتھ مطابقت پذیر نہیں ہوں گی۔</translation> <translation id="4233831822770018312">اجازتوں میں ترمیم کریں</translation> +<translation id="4236584471598725073">قیمت ٹریک کی جا رہی ہے</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />ڈیفالٹ براؤزر ایپ<ph name="END_BOLD" /> پر تھپتھپائیں</translation> <translation id="424315890655130736">پاس فریز درج کریں</translation> <translation id="4249955472157341256">تازہ ترین کے لحاظ سے ترتیب دیں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index ba4afdf7..5354be0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -23,6 +23,7 @@ <translation id="1104948393051856124">Davom etish</translation> <translation id="110724200315609752">Yopilmagan oynalarga oʻtish</translation> <translation id="1112015203684611006">Chop etilmadi.</translation> +<translation id="1118569444314402022">Qaytganingizdan mamnunmiz, <ph name="USER_NAME" /></translation> <translation id="1125564390852150847">Yangi sahifa ochish</translation> <translation id="1126809382673880764">Zararli sayt, yuklanma va kengaytmalardan himoya qila olmaydi. Gmail va Qidiruv kabi Google xizmatlarida Saytlarni xavfsiz kezish himoyasi ostida boʻlasiz.</translation> <translation id="1135212215217513471">iOS uchun Chromeni olish</translation> @@ -63,6 +64,7 @@ <translation id="1377255359165588604">Sinxronlab bo‘lmadi.</translation> <translation id="1377321085342047638">Karta raqami</translation> <translation id="1383876407941801731">Qidiruv</translation> +<translation id="138618066238211776"><ph name="USER_NAME" /> hisobi bilan davom etish</translation> <translation id="1400642268715879018">Oxirgi 4 haftalik</translation> <translation id="1404330357948037222">Hisobingizdan chiqqansiz</translation> <translation id="1407135791313364759">Barchasini ochish</translation> @@ -176,6 +178,7 @@ <translation id="2421044535038393232">Tahrirlashda davom etish</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> saytidagi <ph name="USERNAME" /> paroli allaqachon saqlangan</translation> <translation id="2435457462613246316">Parolni ko‘rsatish</translation> +<translation id="2461070143328828326">Parol sozlamalari</translation> <translation id="2469960372084740698">Saytlarni xavfsiz kezish faolsizlantirilsinmi?</translation> <translation id="2473876017985765807"><ph name="WEBSITE" /> uchun parol allaqachon saqlangan</translation> <translation id="2476359652512522418">Tanlanmagan.</translation> @@ -330,6 +333,7 @@ <translation id="3709582977625132201">Oʻqilmagan deb belgilash</translation> <translation id="371230970611282515">Xavfli tahdidlarni aniqlaydi va sizni ulardan himoya qiladi.</translation> <translation id="37207012422556617">Qidiruv trendlari</translation> +<translation id="3726360487031500941"><ph name="USER_NAME" /> hisobingizga qayta kiring</translation> <translation id="3740397331642243698">Kiritilgan URL manzillar Google Chrome brauzerida Inkognito rejimda ochiladi.</translation> <translation id="3762232513783804601">iPad uchun ishlab chiqilgan</translation> <translation id="3771033907050503522">Inkognito varaqlar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 6f562c3..d72c9481 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -55,6 +55,7 @@ <translation id="1322735045095424339">您的機構要求使用無痕模式</translation> <translation id="1323735185997015385">刪除</translation> <translation id="132683371494960526">扲兩下就可以更改上層資料夾。</translation> +<translation id="1335348992705722518">管理設定…</translation> <translation id="1340643665687018190">關閉選單</translation> <translation id="1358214951266274152">前往您複製的連結</translation> <translation id="1360432990279830238">要登出並停用同步功能嗎?</translation> @@ -383,6 +384,7 @@ <translation id="4187450337729239226">貼上同埋搜尋</translation> <translation id="4223967053752765281">您的機構已關閉登入功能。您仍可在此裝置上查看自己的書籤、記錄、密碼和其他設定,但作出的變更將不會同步到您的帳戶。</translation> <translation id="4233831822770018312">編輯權限</translation> +<translation id="4236584471598725073">正在追蹤價格</translation> <translation id="4237377247299956313">輕按 [預設瀏覽器應用程式]<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation> <translation id="424315890655130736">輸入密碼短語</translation> <translation id="4249955472157341256">按最新項目排序</translation>
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h index 8f996c1..576931b9 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h +++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h
@@ -5,7 +5,6 @@ #ifndef IOS_CHROME_BROWSER_APP_LAUNCHER_APP_LAUNCHER_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_APP_LAUNCHER_APP_LAUNCHER_TAB_HELPER_H_ -#import "ios/chrome/browser/app_launcher/app_launcher_abuse_detector.h" #import "ios/web/public/navigation/web_state_policy_decider.h" #import "ios/web/public/web_state_user_data.h" @@ -23,12 +22,6 @@ ~AppLauncherTabHelper() override; - // Creates a tab helper for `web_state` that uses `abuse_detector` to make - // navigation policy decisions. - static void CreateForWebState(web::WebState* web_state, - AppLauncherAbuseDetector* abuse_detector = - [[AppLauncherAbuseDetector alloc] init]); - // Returns true, if the `url` has a scheme for an external application // (eg. twitter:// , calshow://). static bool IsAppUrl(const GURL& url);
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm index 146f47f..b3e770b9 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm +++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm
@@ -11,6 +11,7 @@ #import "base/strings/sys_string_conversions.h" #import "components/policy/core/browser/url_blocklist_manager.h" #import "components/reading_list/core/reading_list_model.h" +#import "ios/chrome/browser/app_launcher/app_launcher_abuse_detector.h" #import "ios/chrome/browser/app_launcher/app_launcher_tab_helper_delegate.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/chrome_url_util.h" @@ -65,18 +66,6 @@ } // namespace -// static -void AppLauncherTabHelper::CreateForWebState( - web::WebState* web_state, - AppLauncherAbuseDetector* abuse_detector) { - if (FromWebState(web_state)) - return; - - web_state->SetUserData( - UserDataKey(), - base::WrapUnique(new AppLauncherTabHelper(web_state, abuse_detector))); -} - AppLauncherTabHelper::AppLauncherTabHelper( web::WebState* web_state, AppLauncherAbuseDetector* abuse_detector)
diff --git a/ios/chrome/browser/autofill/autofill_java_script_feature_unittest.mm b/ios/chrome/browser/autofill/autofill_java_script_feature_unittest.mm index 6d60e30..23487bf 100644 --- a/ios/chrome/browser/autofill/autofill_java_script_feature_unittest.mm +++ b/ios/chrome/browser/autofill/autofill_java_script_feature_unittest.mm
@@ -201,7 +201,7 @@ @"is_checkable" : @false, @"is_focusable" : @true, @"value" : @"", - @"label" : @"", + @"label" : @"Last Name", @"unique_renderer_id" : @"3" }, @{ @@ -294,7 +294,7 @@ @"is_checkable" : @false, @"is_focusable" : @true, @"value" : @"", - @"label" : @"", + @"label" : @"Last Name", @"unique_renderer_id" : @"3" }, @{
diff --git a/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.h b/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.h index ed0a7ae4..bffd601 100644 --- a/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.h +++ b/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.h
@@ -15,10 +15,6 @@ #import "ios/web/public/web_state_observer.h" #import "ios/web/public/web_state_user_data.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // Price drop data is logged at different stages during the user's session. // These identifiers enable differentiation in the metrics based on when // the price drop data was logged. @@ -39,8 +35,6 @@ public: ~ShoppingPersistedDataTabHelper() override; - static void CreateForWebState(web::WebState* web_state); - // Reduction in price for the offer corresponding to the // ShoppingPersistedDataTabHelper::WebState::URL - if it exists. class PriceDrop { @@ -132,4 +126,5 @@ base::WeakPtrFactory<ShoppingPersistedDataTabHelper> weak_factory_{this}; }; + #endif // IOS_CHROME_BROWSER_COMMERCE_SHOPPING_PERSISTED_DATA_TAB_HELPER_H_
diff --git a/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.mm b/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.mm index deb166f..130a46e 100644 --- a/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.mm +++ b/ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.mm
@@ -79,23 +79,6 @@ ShoppingPersistedDataTabHelper::PriceDrop::~PriceDrop() = default; -void ShoppingPersistedDataTabHelper::CreateForWebState( - web::WebState* web_state) { - if (FromWebState(web_state)) - return; - web_state->SetUserData( - UserDataKey(), - base::WrapUnique(new ShoppingPersistedDataTabHelper(web_state))); - OptimizationGuideService* optimization_guide_service = - OptimizationGuideServiceFactory::GetForBrowserState( - ChromeBrowserState::FromBrowserState(web_state->GetBrowserState())); - if (!optimization_guide_service) - return; - - optimization_guide_service->RegisterOptimizationTypes( - {optimization_guide::proto::PRICE_TRACKING}); -} - const ShoppingPersistedDataTabHelper::PriceDrop* ShoppingPersistedDataTabHelper::GetPriceDrop() { if (!IsPriceAlertsEligible(web_state_->GetBrowserState())) @@ -146,6 +129,16 @@ web::WebState* web_state) : web_state_(web_state) { web_state_->AddObserver(this); + + OptimizationGuideService* optimization_guide_service = + OptimizationGuideServiceFactory::GetForBrowserState( + ChromeBrowserState::FromBrowserState(web_state_->GetBrowserState())); + + if (!optimization_guide_service) + return; + + optimization_guide_service->RegisterOptimizationTypes( + {optimization_guide::proto::PRICE_TRACKING}); } // static
diff --git a/ios/chrome/browser/complex_tasks/ios_content_record_task_id.h b/ios/chrome/browser/complex_tasks/ios_content_record_task_id.h index b8e2c7e..0e0e579 100644 --- a/ios/chrome/browser/complex_tasks/ios_content_record_task_id.h +++ b/ios/chrome/browser/complex_tasks/ios_content_record_task_id.h
@@ -10,10 +10,6 @@ #include <string> #include <vector> -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // Stores Task ID data in a NavigationItem. Task IDs track navigations and // relationships between navigations //
diff --git a/ios/chrome/browser/complex_tasks/ios_task_tab_helper.h b/ios/chrome/browser/complex_tasks/ios_task_tab_helper.h index 09f1f179d..40f20fc 100644 --- a/ios/chrome/browser/complex_tasks/ios_task_tab_helper.h +++ b/ios/chrome/browser/complex_tasks/ios_task_tab_helper.h
@@ -11,10 +11,6 @@ #include "ios/web/public/web_state_observer.h" #import "ios/web/public/web_state_user_data.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // This class tracks Task IDs - navigations and relationships between // navigations. Task IDs have applications in navigation clustering // and assist in grouping together and organizing the user's history. @@ -45,4 +41,5 @@ int prev_item_unique_id_ = -1; WEB_STATE_USER_DATA_KEY_DECL(); }; + #endif // IOS_CHROME_BROWSER_COMPLEX_TASKS_IOS_TASK_TAB_HELPER_H_
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.h b/ios/chrome/browser/download/ar_quick_look_tab_helper.h index 52e1929..8608130 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper.h +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.h
@@ -51,17 +51,11 @@ public web::DownloadTaskObserver, public web::WebStateUserData<ARQuickLookTabHelper> { public: - ARQuickLookTabHelper(web::WebState* web_state); - ARQuickLookTabHelper(const ARQuickLookTabHelper&) = delete; ARQuickLookTabHelper& operator=(const ARQuickLookTabHelper&) = delete; ~ARQuickLookTabHelper() override; - // Creates TabHelper. `delegate` is not retained by this instance. `web_state` - // must not be null. - static void CreateForWebState(web::WebState* web_state); - id<ARQuickLookTabHelperDelegate> delegate() { return delegate_; } void set_delegate(id<ARQuickLookTabHelperDelegate> delegate) { @@ -72,6 +66,10 @@ // ownership of `download_task`. virtual void Download(std::unique_ptr<web::DownloadTask> download_task); + protected: + // Allow subclassing from ARQuickLookTabHelper for testing purposes. + explicit ARQuickLookTabHelper(web::WebState* web_state); + private: friend class web::WebStateUserData<ARQuickLookTabHelper>;
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm index 34b922f..aa11d98b 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
@@ -120,14 +120,6 @@ } } -void ARQuickLookTabHelper::CreateForWebState(web::WebState* web_state) { - DCHECK(web_state); - if (!FromWebState(web_state)) { - web_state->SetUserData(UserDataKey(), - std::make_unique<ARQuickLookTabHelper>(web_state)); - } -} - void ARQuickLookTabHelper::Download( std::unique_ptr<web::DownloadTask> download_task) { DCHECK(download_task);
diff --git a/ios/chrome/browser/download/browser_download_service_unittest.mm b/ios/chrome/browser/download/browser_download_service_unittest.mm index 3d4cf9af8..81dece0 100644 --- a/ios/chrome/browser/download/browser_download_service_unittest.mm +++ b/ios/chrome/browser/download/browser_download_service_unittest.mm
@@ -42,9 +42,11 @@ class StubTabHelper : public TabHelper { public: // Overrides the method from web::WebStateUserData<TabHelper>. - static void CreateForWebState(web::WebState* web_state) { + template <typename... Args> + static void CreateForWebState(web::WebState* web_state, Args&&... args) { web_state->SetUserData(TabHelper::UserDataKey(), - base::WrapUnique(new StubTabHelper(web_state))); + base::WrapUnique(new StubTabHelper( + web_state, std::forward<Args>(args)...))); } // Adds the given task to tasks() lists.
diff --git a/ios/chrome/browser/download/download_manager_tab_helper.h b/ios/chrome/browser/download/download_manager_tab_helper.h index fe6d895..63b505d 100644 --- a/ios/chrome/browser/download/download_manager_tab_helper.h +++ b/ios/chrome/browser/download/download_manager_tab_helper.h
@@ -42,7 +42,7 @@ protected: // Allow subclassing from DownloadManagerTabHelper for testing purposes. - DownloadManagerTabHelper(web::WebState* web_state); + explicit DownloadManagerTabHelper(web::WebState* web_state); private: friend class web::WebStateUserData<DownloadManagerTabHelper>;
diff --git a/ios/chrome/browser/download/pass_kit_tab_helper.h b/ios/chrome/browser/download/pass_kit_tab_helper.h index 08a978c..71d1f2f7 100644 --- a/ios/chrome/browser/download/pass_kit_tab_helper.h +++ b/ios/chrome/browser/download/pass_kit_tab_helper.h
@@ -60,7 +60,7 @@ protected: // Allow subclassing from PassKitTabHelper for testing purposes. - PassKitTabHelper(web::WebState* web_state); + explicit PassKitTabHelper(web::WebState* web_state); private: friend class web::WebStateUserData<PassKitTabHelper>;
diff --git a/ios/chrome/browser/download/safari_download_tab_helper.h b/ios/chrome/browser/download/safari_download_tab_helper.h index c9ba2d3..9bff27d 100644 --- a/ios/chrome/browser/download/safari_download_tab_helper.h +++ b/ios/chrome/browser/download/safari_download_tab_helper.h
@@ -20,13 +20,9 @@ class SafariDownloadTabHelper : public web::WebStateUserData<SafariDownloadTabHelper> { public: - SafariDownloadTabHelper() = default; SafariDownloadTabHelper(const SafariDownloadTabHelper&) = delete; SafariDownloadTabHelper& operator=(const SafariDownloadTabHelper&) = delete; - // Creates TabHelper. `web_state` must not be null. - static void CreateForWebState(web::WebState* web_state); - id<SafariDownloadTabHelperDelegate> delegate() { return delegate_; } // `delegate` is not retained by this instance. @@ -42,6 +38,9 @@ private: friend class web::WebStateUserData<SafariDownloadTabHelper>; + + explicit SafariDownloadTabHelper(web::WebState* web_state); + __weak id<SafariDownloadTabHelperDelegate> delegate_ = nil; WEB_STATE_USER_DATA_KEY_DECL();
diff --git a/ios/chrome/browser/download/safari_download_tab_helper.mm b/ios/chrome/browser/download/safari_download_tab_helper.mm index 8661f98..924ca8c 100644 --- a/ios/chrome/browser/download/safari_download_tab_helper.mm +++ b/ios/chrome/browser/download/safari_download_tab_helper.mm
@@ -12,14 +12,6 @@ #error "This file requires ARC support." #endif -void SafariDownloadTabHelper::CreateForWebState(web::WebState* web_state) { - DCHECK(web_state); - if (!FromWebState(web_state)) { - web_state->SetUserData(UserDataKey(), - std::make_unique<SafariDownloadTabHelper>()); - } -} - void SafariDownloadTabHelper::DownloadMobileConfig( std::unique_ptr<web::DownloadTask> task) { NSURL* url = net::NSURLWithGURL(task->GetOriginalUrl()); @@ -32,4 +24,6 @@ [delegate_ presentCalendarAlertFromURL:url]; } +SafariDownloadTabHelper::SafariDownloadTabHelper(web::WebState* web_state) {} + WEB_STATE_USER_DATA_KEY_IMPL(SafariDownloadTabHelper)
diff --git a/ios/chrome/browser/download/vcard_tab_helper.h b/ios/chrome/browser/download/vcard_tab_helper.h index 9fca7dd..6f83b59c 100644 --- a/ios/chrome/browser/download/vcard_tab_helper.h +++ b/ios/chrome/browser/download/vcard_tab_helper.h
@@ -24,8 +24,6 @@ class VcardTabHelper : public web::DownloadTaskObserver, public web::WebStateUserData<VcardTabHelper> { public: - explicit VcardTabHelper(web::WebState* web_state); - VcardTabHelper(const VcardTabHelper&) = delete; VcardTabHelper& operator=(const VcardTabHelper&) = delete; @@ -42,6 +40,10 @@ // delegate to open the Vcard when the download is complete. virtual void Download(std::unique_ptr<web::DownloadTask> task); + protected: + // Allow subclassing from VcardTabHelper for testing purposes. + explicit VcardTabHelper(web::WebState* web_state); + private: friend class web::WebStateUserData<VcardTabHelper>;
diff --git a/ios/chrome/browser/open_in/open_in_tab_helper.h b/ios/chrome/browser/open_in/open_in_tab_helper.h index 639e96f..7ee8aced 100644 --- a/ios/chrome/browser/open_in/open_in_tab_helper.h +++ b/ios/chrome/browser/open_in/open_in_tab_helper.h
@@ -82,10 +82,6 @@ ~OpenInTabHelper() override; - // Creates OpenInTabHelper and attaches to `web_state`. `web_state` must not - // be null. - static void CreateForWebState(web::WebState* web_state); - // Sets the OpenInTabHelper delegate. `delegate` will be in charge of enabling // the openIn view. `delegate` is not retained by TabHelper. void SetDelegate(id<OpenInTabHelperDelegate> delegate); @@ -93,7 +89,7 @@ private: friend class web::WebStateUserData<OpenInTabHelper>; - OpenInTabHelper(web::WebState* web_state); + explicit OpenInTabHelper(web::WebState* web_state); // Handles exportable files and shows open in button if content mime type is // PDF.
diff --git a/ios/chrome/browser/open_in/open_in_tab_helper.mm b/ios/chrome/browser/open_in/open_in_tab_helper.mm index 1e296c3..31f67e4 100644 --- a/ios/chrome/browser/open_in/open_in_tab_helper.mm +++ b/ios/chrome/browser/open_in/open_in_tab_helper.mm
@@ -53,15 +53,6 @@ } // namespace content_type -// static -void OpenInTabHelper::CreateForWebState(web::WebState* web_state) { - DCHECK(web_state); - if (!FromWebState(web_state)) { - web_state->SetUserData(UserDataKey(), - base::WrapUnique(new OpenInTabHelper(web_state))); - } -} - void OpenInTabHelper::SetDelegate(id<OpenInTabHelperDelegate> delegate) { delegate_ = delegate; }
diff --git a/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.h b/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.h index 6ae8f78..2adc64b 100644 --- a/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.h +++ b/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.h
@@ -58,10 +58,6 @@ OptimizationGuideTabHelper& operator=(const OptimizationGuideTabHelper&) = delete; - // Creates OptimizationGuideTabHelper and attaches to `web_state`. `web_state` - // must not be null. - static void CreateForWebState(web::WebState* web_state); - private: friend class web::WebStateUserData<OptimizationGuideTabHelper>;
diff --git a/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.mm b/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.mm index 5b00bd2..1e51b54 100644 --- a/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.mm +++ b/ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.mm
@@ -37,16 +37,6 @@ set_navigation_url(url); } -// static -void OptimizationGuideTabHelper::CreateForWebState(web::WebState* web_state) { - DCHECK(web_state); - if (!FromWebState(web_state)) { - web_state->SetUserData( - UserDataKey(), - base::WrapUnique(new OptimizationGuideTabHelper(web_state))); - } -} - OptimizationGuideTabHelper::OptimizationGuideTabHelper(web::WebState* web_state) : optimization_guide_service_( OptimizationGuideServiceFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.h b/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.h index b18b716..8632373 100644 --- a/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.h +++ b/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.h
@@ -22,10 +22,6 @@ OptimizationGuideValidationTabHelper& operator=( const OptimizationGuideValidationTabHelper&) = delete; - // Creates OptimizationGuideValidationTabHelper and attaches to `web_state`. - // `web_state` must not be null. - static void CreateForWebState(web::WebState* web_state); - private: friend class web::WebStateUserData<OptimizationGuideValidationTabHelper>;
diff --git a/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.mm b/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.mm index d3ea1398..a692a22 100644 --- a/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.mm +++ b/ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.mm
@@ -19,32 +19,21 @@ #error "This file requires ARC support." #endif -// static -void OptimizationGuideValidationTabHelper::CreateForWebState( - web::WebState* web_state) { - if (!FromWebState(web_state)) { - web_state->SetUserData( - UserDataKey(), - base::WrapUnique(new OptimizationGuideValidationTabHelper(web_state))); - if (auto* optimization_guide_service = - OptimizationGuideServiceFactory::GetForBrowserState( - ChromeBrowserState::FromBrowserState( - web_state->GetBrowserState()))) { - optimization_guide_service->RegisterOptimizationTypes( - {optimization_guide::proto::METADATA_FETCH_VALIDATION, - optimization_guide::proto::BLOOM_FILTER_VALIDATION}); - } - } -} - OptimizationGuideValidationTabHelper::OptimizationGuideValidationTabHelper( web::WebState* web_state) { - if (!base::FeatureList::IsEnabled( + if (base::FeatureList::IsEnabled( optimization_guide::features::kOptimizationGuideMetadataValidation)) { - return; + web_state->AddObserver(this); } - web_state->AddObserver(this); + if (OptimizationGuideService* optimization_guide_service = + OptimizationGuideServiceFactory::GetForBrowserState( + ChromeBrowserState::FromBrowserState( + web_state->GetBrowserState()))) { + optimization_guide_service->RegisterOptimizationTypes( + {optimization_guide::proto::METADATA_FETCH_VALIDATION, + optimization_guide::proto::BLOOM_FILTER_VALIDATION}); + } } OptimizationGuideValidationTabHelper::~OptimizationGuideValidationTabHelper() {
diff --git a/ios/chrome/browser/policy/policy_app_interface.h b/ios/chrome/browser/policy/policy_app_interface.h index d125578..9e70a55d 100644 --- a/ios/chrome/browser/policy/policy_app_interface.h +++ b/ios/chrome/browser/policy/policy_app_interface.h
@@ -22,7 +22,7 @@ + (void)clearPolicies; // Clear the policies from all providers. -+ (void)clearAllPoliciesInMemory; ++ (void)clearAllPoliciesInNSUserDefault; // Returns YES if the given `URL` is blocked by the URLBlocklist and // URLAllowlist policies. @@ -35,14 +35,17 @@ + (void)setUserCloudPolicyDataWithDomain:(NSString*)domain; // Removes the whole directory where the device management token file is stored. -+ (void)clearDMTokenDirectory; +// Returns YES if succeeded. It is waiting for the disk operation to be +// finished before returning the value. ++ (BOOL)clearDMTokenDirectory [[nodiscard]]; // Returns YES if the cloud policy client is registered. + (BOOL)isCloudPolicyClientRegistered; // Removes the whole directory where the Chrome Browser Cloud Management (CBCM) -// stores data. -+ (void)clearCloudPolicyDirectory; +// stores data. Returns YES if succeeded. It is waiting for the disk operation +// to be finished before returning the value. ++ (BOOL)clearCloudPolicyDirectory [[nodiscard]]; // Returns YES if there is user policy data in the current BrowserState. + (BOOL)hasUserPolicyDataInCurrentBrowserState;
diff --git a/ios/chrome/browser/policy/policy_app_interface.mm b/ios/chrome/browser/policy/policy_app_interface.mm index e57adff..7f58f24 100644 --- a/ios/chrome/browser/policy/policy_app_interface.mm +++ b/ios/chrome/browser/policy/policy_app_interface.mm
@@ -12,6 +12,7 @@ #import "base/path_service.h" #import "base/strings/sys_string_conversions.h" #import "base/task/thread_pool.h" +#import "base/test/ios/wait_util.h" #import "base/threading/scoped_blocking_call.h" #import "base/values.h" #import "components/policy/core/browser/browser_policy_connector.h" @@ -127,7 +128,7 @@ GetTestPlatformPolicyProvider()->UpdateChromePolicy(values); } -+ (void)clearAllPoliciesInMemory { ++ (void)clearAllPoliciesInNSUserDefault { [[NSUserDefaults standardUserDefaults] removeObjectForKey:kPolicyLoaderIOSConfigurationKey]; } @@ -169,16 +170,25 @@ store->set_policy_data_for_testing(std::move(policy_data)); } -+ (void)clearDMTokenDirectory { - base::FilePath app_data_dir_path; - base::PathService::Get(base::DIR_APP_DATA, &app_data_dir_path); - base::FilePath dm_token_dir_path = app_data_dir_path.Append(kDmTokenBaseDir); ++ (BOOL)clearDMTokenDirectory { + base::FilePath appDataDirPath; + base::PathService::Get(base::DIR_APP_DATA, &appDataDirPath); + base::FilePath dmTokenDirPath = appDataDirPath.Append(kDmTokenBaseDir); - base::ThreadPool::PostTask( + __block BOOL didComplete = NO; + base::ThreadPool::PostTaskAndReply( FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, base::BindOnce(^{ - base::DeletePathRecursively(dm_token_dir_path); + base::DeletePathRecursively(dmTokenDirPath); + }), + base::BindOnce(^{ + didComplete = YES; })); + + return base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForFileOperationTimeout, ^{ + return didComplete; + }); } + (BOOL)isCloudPolicyClientRegistered { @@ -190,16 +200,25 @@ ->is_registered(); } -+ (void)clearCloudPolicyDirectory { - base::FilePath user_data_dir; - base::PathService::Get(ios::DIR_USER_DATA, &user_data_dir); - base::FilePath policy_dir = user_data_dir.Append(kPolicyDir); ++ (BOOL)clearCloudPolicyDirectory { + base::FilePath userDataDir; + base::PathService::Get(ios::DIR_USER_DATA, &userDataDir); + base::FilePath policyDir = userDataDir.Append(kPolicyDir); - base::ThreadPool::PostTask( + __block BOOL didComplete = NO; + base::ThreadPool::PostTaskAndReply( FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, base::BindOnce(^{ - base::DeletePathRecursively(policy_dir); + base::DeletePathRecursively(policyDir); + }), + base::BindOnce(^{ + didComplete = YES; })); + + return base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForFileOperationTimeout, ^{ + return didComplete; + }); } + (BOOL)hasUserPolicyDataInCurrentBrowserState {
diff --git a/ios/chrome/browser/policy/reporting/report_scheduler_ios.h b/ios/chrome/browser/policy/reporting/report_scheduler_ios.h index 6d957da..88d1dbd 100644 --- a/ios/chrome/browser/policy/reporting/report_scheduler_ios.h +++ b/ios/chrome/browser/policy/reporting/report_scheduler_ios.h
@@ -7,10 +7,6 @@ #include "components/enterprise/browser/reporting/report_scheduler.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace enterprise_reporting { // Desktop implementation of the ReportScheduler delegate.
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm index 5ce8325..7ceb064 100644 --- a/ios/chrome/browser/tabs/tab_helper_util.mm +++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -22,6 +22,7 @@ #import "components/safe_browsing/core/common/features.h" #import "components/safe_browsing/ios/browser/safe_browsing_url_allow_list.h" #import "components/ukm/ios/ukm_url_recorder.h" +#import "ios/chrome/browser/app_launcher/app_launcher_abuse_detector.h" #import "ios/chrome/browser/app_launcher/app_launcher_tab_helper.h" #import "ios/chrome/browser/autofill/autofill_tab_helper.h" #import "ios/chrome/browser/autofill/form_suggestion_tab_helper.h" @@ -132,7 +133,8 @@ commerce::CommerceTabHelper::CreateForWebState( web_state, is_off_the_record, commerce::ShoppingServiceFactory::GetForBrowserState(browser_state)); - AppLauncherTabHelper::CreateForWebState(web_state); + AppLauncherTabHelper::CreateForWebState( + web_state, [[AppLauncherAbuseDetector alloc] init]); security_interstitials::IOSBlockingPageTabHelper::CreateForWebState( web_state); password_manager::WellKnownChangePasswordTabHelper::CreateForWebState(
diff --git a/ios/chrome/browser/ui/first_run/enterprise_loading_screen_egtest.mm b/ios/chrome/browser/ui/first_run/enterprise_loading_screen_egtest.mm index e011355c..c9cc63d 100644 --- a/ios/chrome/browser/ui/first_run/enterprise_loading_screen_egtest.mm +++ b/ios/chrome/browser/ui/first_run/enterprise_loading_screen_egtest.mm
@@ -47,20 +47,25 @@ GREYAssertTrue(_policyTestServer->Start(), @"Policy test server did not start."); - [PolicyAppInterface clearAllPoliciesInMemory]; - [PolicyAppInterface clearDMTokenDirectory]; - [PolicyAppInterface clearCloudPolicyDirectory]; + [self clearPolicies]; } - (void)tearDown { - [PolicyAppInterface clearAllPoliciesInMemory]; - [PolicyAppInterface clearDMTokenDirectory]; - [PolicyAppInterface clearCloudPolicyDirectory]; + [self clearPolicies]; [super tearDown]; } #pragma mark - Helpers +// Removes all policies stored in memory. +- (void)clearPolicies { + [PolicyAppInterface clearAllPoliciesInNSUserDefault]; + GREYAssertTrue([PolicyAppInterface clearDMTokenDirectory], + @"DM token directory not cleared."); + GREYAssertTrue([PolicyAppInterface clearCloudPolicyDirectory], + @"Cloud policy directory not cleared."); +} + // Waits and verify that the enterprise loading screen is not displayed. - (void)verifyLoadingScreenIsDismissed { GREYCondition* loadingScreenDismissed = [GREYCondition
diff --git a/ios/chrome/browser/ui/first_run/interruptible_chrome_coordinator.h b/ios/chrome/browser/ui/first_run/interruptible_chrome_coordinator.h index 02c8485..1671062 100644 --- a/ios/chrome/browser/ui/first_run/interruptible_chrome_coordinator.h +++ b/ios/chrome/browser/ui/first_run/interruptible_chrome_coordinator.h
@@ -9,10 +9,6 @@ #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // Interface for a ChromeCoordinator that can be interrupted without following // the conventional flow. @interface InterruptibleChromeCoordinator : ChromeCoordinator
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.h b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.h index cf1e7b4..f07525ac 100644 --- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.h +++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.h
@@ -27,14 +27,6 @@ - (instancetype)init NS_UNAVAILABLE; -// Stops the coordinator and dismisses the Incognito interstitial with -// `completion` as a completion. -- (void)stopWithCompletion:(ProceduralBlock)completion; - -// Starts the coordinator and shows the Incognito interstitial with `completion` -// as a completion. -- (void)startWithCompletion:(ProceduralBlock)completion; - @end #endif // IOS_CHROME_BROWSER_UI_INCOGNITO_INTERSTITIAL_INCOGNITO_INTERSTITIAL_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm index 5db4ae30..1eb68c3 100644 --- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm +++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm
@@ -33,7 +33,7 @@ @implementation IncognitoInterstitialCoordinator -- (void)startWithCompletion:(ProceduralBlock)completion { +- (void)start { self.incognitoInterstitialViewController = [[IncognitoInterstitialViewController alloc] init]; self.incognitoInterstitialViewController.delegate = self; @@ -46,7 +46,7 @@ [self.baseViewController presentViewController:self.incognitoInterstitialViewController animated:YES - completion:completion]; + completion:nil]; // The default recorded action is "Cancel". // This value is changed right before the "Open in Chrome Incognito" or @@ -54,27 +54,15 @@ self.incognitoInterstitialAction = IncognitoInterstitialActions::kCancel; } -- (void)stopWithCompletion:(ProceduralBlock)completion { - __weak __typeof(self) weakSelf = self; - [self.incognitoInterstitialViewController - dismissViewControllerAnimated:YES - completion:^{ - weakSelf.incognitoInterstitialViewController = nil; - completion(); - }]; +- (void)stop { + [self.incognitoInterstitialViewController dismissViewControllerAnimated:YES + completion:nil]; + self.incognitoInterstitialViewController = nil; UMA_HISTOGRAM_ENUMERATION(kIncognitoInterstitialActionsHistogram, self.incognitoInterstitialAction); } -- (void)start { - [self startWithCompletion:nil]; -} - -- (void)stop { - [self stopWithCompletion:nil]; -} - #pragma mark - IncognitoInterstitialViewControllerDelegate - (void)didTapPrimaryActionButton {
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm index 838b1484..c448601 100644 --- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm +++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm
@@ -90,14 +90,16 @@ RevampedIncognitoView* revampedIncognitoView = [[RevampedIncognitoView alloc] initWithFrame:CGRectZero showTopIncognitoImageAndTitle:NO - stackViewHorizontalMargin:0]; + stackViewHorizontalMargin:0 + stackViewMaxWidth:CGFLOAT_MAX]; revampedIncognitoView.URLLoaderDelegate = self.URLLoaderDelegate; incognitoView = revampedIncognitoView; } else { IncognitoView* revampedIncognitoView = [[IncognitoView alloc] initWithFrame:CGRectZero showTopIncognitoImageAndTitle:NO - stackViewHorizontalMargin:0]; + stackViewHorizontalMargin:0 + stackViewMaxWidth:CGFLOAT_MAX]; revampedIncognitoView.URLLoaderDelegate = self.URLLoaderDelegate; incognitoView = revampedIncognitoView; }
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm index 4a1f594..8f2d995 100644 --- a/ios/chrome/browser/ui/main/scene_controller.mm +++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -640,8 +640,7 @@ // Assumes the Incognito interstitial coordinator is currently not instantiated. // Runs `completion` once the Incognito interstitial is presented. - (void)showIncognitoInterstitialWithUrlLoadParams: - (const UrlLoadParams&)urlLoadParams - completion:(ProceduralBlock)completion { + (const UrlLoadParams&)urlLoadParams { DCHECK(self.incognitoInterstitialCoordinator == nil); self.incognitoInterstitialCoordinator = [[IncognitoInterstitialCoordinator alloc] @@ -650,7 +649,7 @@ self.incognitoInterstitialCoordinator.delegate = self; self.incognitoInterstitialCoordinator.tabOpener = self; self.incognitoInterstitialCoordinator.urlLoadParams = urlLoadParams; - [self.incognitoInterstitialCoordinator startWithCompletion:completion]; + [self.incognitoInterstitialCoordinator start]; } // A sink for appState:didTransitionFromInitStage: and @@ -2293,8 +2292,8 @@ __weak SceneController* weakSelf = self; void (^dismissModalsCompletion)() = ^{ if (targetMode == ApplicationModeForTabOpening::UNDETERMINED) { - [weakSelf showIncognitoInterstitialWithUrlLoadParams:copyOfUrlLoadParams - completion:completion]; + [weakSelf showIncognitoInterstitialWithUrlLoadParams:copyOfUrlLoadParams]; + completion(); } else { [weakSelf openSelectedTabInMode:targetMode withUrlLoadParams:copyOfUrlLoadParams @@ -2884,8 +2883,9 @@ // bookmarks or the recent tabs view. [self interruptSigninCoordinatorAnimated:animated completion:completion]; } else if (self.incognitoInterstitialCoordinator) { - [self.incognitoInterstitialCoordinator stopWithCompletion:completion]; + [self.incognitoInterstitialCoordinator stop]; self.incognitoInterstitialCoordinator = nil; + completion(); } else { completion(); }
diff --git a/ios/chrome/browser/ui/ntp/incognito_view.h b/ios/chrome/browser/ui/ntp/incognito_view.h index 536981a..4306293 100644 --- a/ios/chrome/browser/ui/ntp/incognito_view.h +++ b/ios/chrome/browser/ui/ntp/incognito_view.h
@@ -19,14 +19,18 @@ // content. // Value `stackViewHorizontalMargin` is used to customize horizontal margins // on leading and trailing ends of the main stack view. +// Value `stackViewMaxWidth` is used to enforce a maximum width for +// the main stack view. - (instancetype)initWithFrame:(CGRect)frame showTopIncognitoImageAndTitle:(BOOL)showTopIncognitoImageAndTitle stackViewHorizontalMargin:(CGFloat)stackViewHorizontalMargin + stackViewMaxWidth:(CGFloat)stackViewMaxWidth NS_DESIGNATED_INITIALIZER; // Calls the designated initializer with `frame` as frame. -// Sets `showTopIncognitoImageAndTitle` to `YES` -// and `stackViewHorizontalMargin` to `kStackViewHorizontalMargin`. +// Sets `showTopIncognitoImageAndTitle` to `YES`, +// `stackViewHorizontalMargin` to `kStackViewHorizontalMargin` and +// `stackViewMaxWidth` to `kStackViewMaxWidth`. - (instancetype)initWithFrame:(CGRect)frame; - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/ntp/incognito_view.mm b/ios/chrome/browser/ui/ntp/incognito_view.mm index 1cac48e6..8fdd25b5 100644 --- a/ios/chrome/browser/ui/ntp/incognito_view.mm +++ b/ios/chrome/browser/ui/ntp/incognito_view.mm
@@ -151,12 +151,14 @@ - (instancetype)initWithFrame:(CGRect)frame { return [self initWithFrame:frame showTopIncognitoImageAndTitle:YES - stackViewHorizontalMargin:kStackViewHorizontalMargin]; + stackViewHorizontalMargin:kStackViewHorizontalMargin + stackViewMaxWidth:kStackViewMaxWidth]; } - (instancetype)initWithFrame:(CGRect)frame showTopIncognitoImageAndTitle:(BOOL)showTopIncognitoImageAndTitle - stackViewHorizontalMargin:(CGFloat)stackViewHorizontalMargin { + stackViewHorizontalMargin:(CGFloat)stackViewHorizontalMargin + stackViewMaxWidth:(CGFloat)stackViewMaxWidth { self = [super initWithFrame:frame]; if (self) { _dragDropHandler = [[URLDragDropHandler alloc] init]; @@ -270,7 +272,7 @@ // Ensure that the stackview width is constrained. [_stackView.widthAnchor - constraintLessThanOrEqualToConstant:kStackViewMaxWidth], + constraintLessThanOrEqualToConstant:stackViewMaxWidth], // Activate the height constraints. _bottomToolbarMarginHeight,
diff --git a/ios/chrome/browser/ui/ntp/revamped_incognito_view.h b/ios/chrome/browser/ui/ntp/revamped_incognito_view.h index 6c0271a..8c435df7 100644 --- a/ios/chrome/browser/ui/ntp/revamped_incognito_view.h +++ b/ios/chrome/browser/ui/ntp/revamped_incognito_view.h
@@ -17,14 +17,20 @@ // Set `showTopIncognitoImageAndTitle` to `YES` to have the top Incognito // header (with a big icon and title) added at the top of the scroll view // content. +// Value `stackViewHorizontalMargin` is used to customize horizontal margins +// on leading and trailing ends of the main stack view. +// Value `stackViewMaxWidth` is used to enforce a maximum width for +// the main stack view. - (instancetype)initWithFrame:(CGRect)frame showTopIncognitoImageAndTitle:(BOOL)showTopIncognitoImageAndTitle stackViewHorizontalMargin:(CGFloat)stackViewHorizontalMargin + stackViewMaxWidth:(CGFloat)stackViewMaxWidth NS_DESIGNATED_INITIALIZER; // Calls the designated initializer with `frame` as frame. -// Sets `showTopIncognitoImageAndTitle` to `YES` -// and `stackViewHorizontalMargin` to `kStackViewHorizontalMargin`. +// Sets `showTopIncognitoImageAndTitle` to `YES`, +// `stackViewHorizontalMargin` to `kStackViewHorizontalMargin` and +// `stackViewMaxWidth` to `kStackViewMaxWidth`. - (instancetype)initWithFrame:(CGRect)frame; - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/ntp/revamped_incognito_view.mm b/ios/chrome/browser/ui/ntp/revamped_incognito_view.mm index 819b2941..9868b79 100644 --- a/ios/chrome/browser/ui/ntp/revamped_incognito_view.mm +++ b/ios/chrome/browser/ui/ntp/revamped_incognito_view.mm
@@ -185,12 +185,14 @@ - (instancetype)initWithFrame:(CGRect)frame { return [self initWithFrame:frame showTopIncognitoImageAndTitle:YES - stackViewHorizontalMargin:kStackViewHorizontalMargin]; + stackViewHorizontalMargin:kStackViewHorizontalMargin + stackViewMaxWidth:kStackViewMaxWidth]; } - (instancetype)initWithFrame:(CGRect)frame showTopIncognitoImageAndTitle:(BOOL)showTopIncognitoImageAndTitle - stackViewHorizontalMargin:(CGFloat)stackViewHorizontalMargin { + stackViewHorizontalMargin:(CGFloat)stackViewHorizontalMargin + stackViewMaxWidth:(CGFloat)stackViewMaxWidth { self = [super initWithFrame:frame]; if (self) { _dragDropHandler = [[URLDragDropHandler alloc] init]; @@ -276,7 +278,7 @@ // Ensure that the stackview width is constrained. [self.stackView.widthAnchor - constraintLessThanOrEqualToConstant:kStackViewMaxWidth], + constraintLessThanOrEqualToConstant:stackViewMaxWidth], // Set a minimum top margin and make the bottom guide twice as tall as the // top guide.
diff --git a/ios/chrome/browser/ui/promos_manager/BUILD.gn b/ios/chrome/browser/ui/promos_manager/BUILD.gn index 6bbfcca0..d5d5edeb 100644 --- a/ios/chrome/browser/ui/promos_manager/BUILD.gn +++ b/ios/chrome/browser/ui/promos_manager/BUILD.gn
@@ -15,6 +15,7 @@ ] frameworks = [ "UIKit.framework" ] public_deps = [ + "//ios/chrome/browser/ui/commands", "//ios/chrome/common/ui/confirmation_alert", "//ios/chrome/common/ui/promo_style:promo_style", ] @@ -60,7 +61,9 @@ "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser", "//ios/chrome/browser/application_context", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/promos_manager:constants", + "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/post_restore_signin", "//ios/chrome/browser/ui/post_restore_signin:features", "//ios/chrome/common/ui/confirmation_alert",
diff --git a/ios/chrome/browser/ui/promos_manager/promo_protocol.h b/ios/chrome/browser/ui/promos_manager/promo_protocol.h index a9362fa..a67ef0f1 100644 --- a/ios/chrome/browser/ui/promos_manager/promo_protocol.h +++ b/ios/chrome/browser/ui/promos_manager/promo_protocol.h
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/promos_manager/constants.h" #import "ios/chrome/browser/promos_manager/impression_limit.h" +#import "ios/chrome/browser/ui/commands/promos_manager_commands.h" // PromoProtocol defines the minimum set of data required to create a // Promo maintained by the PromosManager. A promo object must have a @@ -17,15 +18,19 @@ // its display behavior. @protocol PromoProtocol <NSObject> +@required + +// Which promos_manager::Promo the object is uniquely associated with. +- (promos_manager::Promo)identifier; + @optional // The promo-specific impression limits. - (NSArray<ImpressionLimit*>*)impressionLimits; -@required - -// Which promos_manager::Promo the object is uniquely associated with. -- (promos_manager::Promo)identifier; +// If implemented, a PromosManagerCommands handler will be provided to the +// class. +@property(nonatomic, weak) id<PromosManagerCommands> handler; @end
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm index ae47b5b..e6b1d96b 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm
@@ -12,6 +12,9 @@ #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" #import "ios/chrome/browser/application_context/application_context.h" +#import "ios/chrome/browser/main/browser.h" +#import "ios/chrome/browser/ui/commands/command_dispatcher.h" +#import "ios/chrome/browser/ui/commands/promos_manager_commands.h" #import "ios/chrome/browser/ui/post_restore_signin/features.h" #import "ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h" #import "ios/chrome/browser/ui/promos_manager/bannered_promo_view_provider.h" @@ -100,15 +103,24 @@ bannered_provider_it == _banneredViewProviderPromos.end() || alert_provider_it == _alertProviderPromos.end()); + id<PromosManagerCommands> promosManagerCommandsHandler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), PromosManagerCommands); + if (handler_it != _displayHandlerPromos.end()) { id<StandardPromoDisplayHandler> handler = handler_it->second; + if ([handler respondsToSelector:@selector(setHandler:)]) + handler.handler = promosManagerCommandsHandler; + [handler handleDisplay]; [self.mediator recordImpression:handler.identifier]; } else if (provider_it != _viewProviderPromos.end()) { id<StandardPromoViewProvider> provider = provider_it->second; + if ([provider respondsToSelector:@selector(setHandler:)]) + provider.handler = promosManagerCommandsHandler; + ConfirmationAlertViewController* promoViewController = [provider viewController]; promoViewController.presentationController.delegate = self; @@ -124,6 +136,9 @@ id<BanneredPromoViewProvider> banneredProvider = bannered_provider_it->second; + if ([banneredProvider respondsToSelector:@selector(setHandler:)]) + banneredProvider.handler = promosManagerCommandsHandler; + PromoStyleViewController* promoViewController = [banneredProvider viewController]; @@ -139,6 +154,9 @@ } else if (alert_provider_it != _alertProviderPromos.end()) { id<StandardPromoAlertProvider> alertProvider = alert_provider_it->second; + if ([alertProvider respondsToSelector:@selector(setHandler:)]) + alertProvider.handler = promosManagerCommandsHandler; + DCHECK([alertProvider.title length] != 0); DCHECK([alertProvider.message length] != 0); // The "Default Action" should always be implemented by feature
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm index b048a56..2d8b2cb 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm
@@ -632,8 +632,8 @@ forSectionWithIdentifier:sectionID]; for (TableViewItem<ReadingListListItem>* item in items) { item.type = ItemTypeItem; - [self.dataSource fetchFaviconForItem:item]; [model addItem:item toSectionWithIdentifier:sectionID]; + [self.dataSource fetchFaviconForItem:item]; } }
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm index ae5a955..15313a43 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -526,16 +526,22 @@ // Needs to be called inside a performBatchUpdates block. - (void)removeSessionSections { NSMutableIndexSet* indexesToBeDeleted = [NSMutableIndexSet indexSet]; + NSMutableIndexSet* sectionIdentifiersToBeDeleted = + [NSMutableIndexSet indexSet]; for (NSInteger index = 0; index < [self.tableViewModel numberOfSections]; index++) { NSInteger sectionIdentifier = [self.tableViewModel sectionIdentifierForSectionIndex:index]; if (sectionIdentifier >= kFirstSessionSectionIdentifier) { - [self.tableViewModel removeSectionWithIdentifier:sectionIdentifier]; + [sectionIdentifiersToBeDeleted addIndex:sectionIdentifier]; [indexesToBeDeleted addIndex:index]; } } + [sectionIdentifiersToBeDeleted + enumerateIndexesUsingBlock:^(NSUInteger sectionIdentifier, BOOL* stop) { + [self.tableViewModel removeSectionWithIdentifier:sectionIdentifier]; + }]; [self.tableView deleteSections:indexesToBeDeleted withRowAnimation:UITableViewRowAnimationNone]; }
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm index 90ead6a..d649aca 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -361,6 +361,12 @@ [PasswordSettingsAppInterface passwordStoreResultsCount]; } +// Taps on the "Settings" option to show the submenu. +void OpenSettingsSubmenu() { + [[EarlGrey selectElementWithMatcher:ToolbarSettingsSubmenuButton()] + performAction:grey_tap()]; +} + // Tap Edit in any settings view. void TapEdit() { [[EarlGrey selectElementWithMatcher:NavigationBarEditButton()] @@ -1062,6 +1068,88 @@ performAction:grey_tap()]; } +// Check that stored entries are shown no matter what the preference for saving +// passwords is. +- (void)testStoredEntriesAlwaysShown { + SaveExamplePasswordForm(); + + OpenPasswordManager(); + + // Toggle the "Save Passwords" control off and back on and check that stored + // items are still present. + BOOL isSwitchEnabled = + [PasswordSettingsAppInterface isCredentialsServiceEnabled]; + BOOL kExpectedState[] = {isSwitchEnabled, !isSwitchEnabled}; + for (BOOL expected_state : kExpectedState) { + OpenSettingsSubmenu(); + + // Toggle the switch. It is located near the top, so if not interactable, + // try scrolling up. + [[EarlGrey + selectElementWithMatcher: + grey_allOf(chrome_test_util::TableViewSwitchCell( + kPasswordSettingsSavePasswordSwitchTableViewId, + expected_state), + grey_sufficientlyVisible(), nil)] + performAction:TurnTableViewSwitchOn(!expected_state)]; + + // Check that the switch has been modified. + [EarlGrey selectElementWithMatcher: + grey_allOf(chrome_test_util::TableViewSwitchCell( + kPasswordSettingsSavePasswordSwitchTableViewId, + !expected_state), + grey_sufficientlyVisible(), nil)]; + + // Close settings submenu. + [[EarlGrey + selectElementWithMatcher:grey_allOf(SettingsDoneButton(), + grey_sufficientlyVisible(), nil)] + performAction:grey_tap()]; + + // Check the stored items. Scroll down if needed. + [GetInteractionForPasswordEntry(@"example.com, concrete username") + assertWithMatcher:grey_notNil()]; + } + + [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] + performAction:grey_tap()]; +} + +// Check that toggling the switch for the "save passwords" preference changes +// the settings. +- (void)testPrefToggle { + OpenPasswordManager(); + OpenSettingsSubmenu(); + // Toggle the "Save Passwords" control off and back on and check the + // preferences. + constexpr BOOL kExpectedState[] = {YES, NO}; + for (BOOL expected_initial_state : kExpectedState) { + [[EarlGrey selectElementWithMatcher: + chrome_test_util::TableViewSwitchCell( + kPasswordSettingsSavePasswordSwitchTableViewId, + expected_initial_state)] + performAction:TurnTableViewSwitchOn(!expected_initial_state)]; + const bool expected_final_state = !expected_initial_state; + GREYAssertEqual(expected_final_state, + [PasswordSettingsAppInterface isCredentialsServiceEnabled], + @"State of the UI toggle differs from real preferences."); + } + + // "Done" to close settings submenu. + [[EarlGrey + selectElementWithMatcher:grey_allOf(SettingsDoneButton(), + grey_sufficientlyVisible(), nil)] + performAction:grey_tap()]; + // "Back" to go to root settings menu. + [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()] + performAction:grey_tap()]; + // "Done" to close out. + [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] + performAction:grey_tap()]; +} + // Checks that deleting a password from the list view works. - (void)testDeletionInListView { // Save a password to be deleted later. @@ -2163,9 +2251,7 @@ - (void)testOpenPasswordSettingsSubmenu { OpenPasswordManager(); - - [[EarlGrey selectElementWithMatcher:ToolbarSettingsSubmenuButton()] - performAction:grey_tap()]; + OpenSettingsSubmenu(); [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kPasswordsSettingsTableViewId)]
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn index b30b62a..cfa003d 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn
@@ -18,8 +18,11 @@ ":password_settings_ui", "//components/keyed_service/core", "//components/password_manager/core/browser", + "//components/password_manager/core/common", + "//components/prefs", "//components/strings", "//ios/chrome/app/strings", + "//ios/chrome/browser/browser_state", "//ios/chrome/browser/main:public", "//ios/chrome/browser/passwords:store_factory", "//ios/chrome/browser/ui/commands",
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm index 0d465eac..2d96b564e 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm
@@ -8,6 +8,7 @@ #import "components/keyed_service/core/service_access_type.h" #import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/ui/commands/application_commands.h" @@ -135,7 +136,9 @@ self.mediator = [[PasswordSettingsMediator alloc] initWithReauthenticationModule:self.reauthModule savedPasswordsPresenter:_savedPasswordsPresenter.get() - exportHandler:self]; + exportHandler:self + prefService:self.browser->GetBrowserState() + ->GetPrefs()]; self.dispatcher = static_cast<id<ApplicationCommands>>( self.browser->GetCommandDispatcher()); @@ -151,6 +154,7 @@ delegate:self]; self.mediator.consumer = self.passwordSettingsViewController; + self.passwordSettingsViewController.delegate = self.mediator; [self.baseViewController presentViewController:self.settingsNavigationController
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_delegate.h b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_delegate.h index f72150c7..9e9b50e 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_delegate.h +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_delegate.h
@@ -10,7 +10,7 @@ @protocol PasswordSettingsDelegate // Indicates whether or not "Offer to Save Passwords" is set to enabled. -- (void)savedPasswordSwitchDidChange:(BOOL)isEnabled; +- (void)savedPasswordSwitchDidChange:(BOOL)enabled; @end
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h index c313f289..0668050 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h
@@ -10,11 +10,12 @@ #import "components/password_manager/core/browser/ui/saved_passwords_presenter.h" #import "ios/chrome/browser/ui/settings/password/password_settings/password_export_handler.h" #import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_consumer.h" +#import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_delegate.h" @protocol ReauthenticationProtocol; // Mediator for the Password Settings screen. -@interface PasswordSettingsMediator : NSObject +@interface PasswordSettingsMediator : NSObject <PasswordSettingsDelegate> @property(nonatomic, weak) id<PasswordSettingsConsumer> consumer; @@ -30,6 +31,7 @@ (raw_ptr<password_manager::SavedPasswordsPresenter>) passwordPresenter exportHandler:(id<PasswordExportHandler>)exportHandler + prefService:(raw_ptr<PrefService>)prefService NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm index e2be69b0..c9a5c9a 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
@@ -7,15 +7,22 @@ #import "base/containers/cxx20_erase_vector.h" #import "base/memory/raw_ptr.h" #import "components/password_manager/core/browser/ui/credential_ui_entry.h" +#import "components/password_manager/core/common/password_manager_pref_names.h" +#import "components/prefs/pref_service.h" #import "ios/chrome/browser/ui/settings/password/password_exporter.h" #import "ios/chrome/browser/ui/settings/password/saved_passwords_presenter_observer.h" +#import "ios/chrome/browser/ui/settings/utils/observable_boolean.h" +#import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_protocol.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -@interface PasswordSettingsMediator () <PasswordExporterDelegate, +using password_manager::prefs::kCredentialsEnableService; + +@interface PasswordSettingsMediator () <BooleanObserver, + PasswordExporterDelegate, SavedPasswordsPresenterObserver> { // A helper object for passing data about saved passwords from a finished // password store request to the PasswordManagerViewController. @@ -24,6 +31,13 @@ // Service which gives us a view on users' saved passwords. raw_ptr<password_manager::SavedPasswordsPresenter> _savedPasswordsPresenter; + + // Allows reading and writing user preferences. + raw_ptr<PrefService> _prefService; + + // The observable boolean that binds to the password manager setting state. + // Saved passwords are only on if the password manager is enabled. + PrefBackedBoolean* _passwordManagerEnabled; } // Helper object which maintains state about the "Export Passwords..." flow, and @@ -48,7 +62,8 @@ savedPasswordsPresenter: (raw_ptr<password_manager::SavedPasswordsPresenter>) passwordPresenter - exportHandler:(id<PasswordExportHandler>)exportHandler { + exportHandler:(id<PasswordExportHandler>)exportHandler + prefService:(raw_ptr<PrefService>)prefService { self = [super init]; if (self) { _passwordExporter = @@ -60,6 +75,11 @@ self, _savedPasswordsPresenter); _savedPasswordsPresenter->Init(); _exportHandler = exportHandler; + _prefService = prefService; + _passwordManagerEnabled = [[PrefBackedBoolean alloc] + initWithPrefService:_prefService + prefName:kCredentialsEnableService]; + _passwordManagerEnabled.observer = self; } return self; } @@ -72,10 +92,13 @@ self.exporterIsReady = self.passwordExporter.exportState == ExportState::IDLE; [self savedPasswordsDidChanged:_savedPasswordsPresenter->GetSavedPasswords()]; - // TODO(crbug.com/1335156): Replace placeholder data with actual data piped - // from observing pref and enterprise policy. - [self.consumer setSavePasswordsEnabled:YES]; - [self.consumer setManagedByPolicy:NO]; + [self.consumer setSavePasswordsEnabled:_passwordManagerEnabled.value]; + + // TODO(crbug.com/1082827): In addition to setting this value here, we should + // observe for changes (i.e., if policy changes while the screen is open) and + // push that to the consumer. + [self.consumer setManagedByPolicy:_prefService->IsManagedPreference( + kCredentialsEnableService)]; } - (void)userDidStartExportFlow { @@ -128,12 +151,27 @@ [self pushExportStateToConsumerAndUpdate]; } +#pragma mark - PasswordSettingsDelegate + +- (void)savedPasswordSwitchDidChange:(BOOL)enabled { + _passwordManagerEnabled.value = enabled; +} + +#pragma mark - SavedPasswordsPresenterObserver + - (void)savedPasswordsDidChanged: (password_manager::SavedPasswordsPresenter::SavedPasswordsView)passwords { self.hasSavedPasswords = !passwords.empty(); [self pushExportStateToConsumerAndUpdate]; } +#pragma mark - BooleanObserver + +- (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean { + DCHECK(observableBoolean == _passwordManagerEnabled); + [self.consumer setSavePasswordsEnabled:observableBoolean.value]; +} + #pragma mark - Private // Pushes the current state of the exporter to the consumer and updates its
diff --git a/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn b/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn index 814ac70..68d720c 100644 --- a/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn +++ b/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn
@@ -19,6 +19,7 @@ "//ios/chrome/browser/ui/icons:settings_icons", "//ios/chrome/browser/ui/icons:symbols", "//ios/chrome/browser/ui/list_model", + "//ios/chrome/browser/ui/settings/price_notifications/tracking_price", "//ios/chrome/browser/ui/table_view:utils", "//ios/chrome/browser/ui/table_view/cells", "//ios/chrome/common/ui/colors",
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn new file mode 100644 index 0000000..eadb5535 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn
@@ -0,0 +1,47 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("tracking_price") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "tracking_price_mediator.h", + "tracking_price_mediator.mm", + ] + deps = [ + ":constants", + ":tracking_price_ui", + "//ios/chrome/app/strings", + "//ios/chrome/browser/ui/list_model", + "//ios/chrome/browser/ui/table_view:utils", + "//ios/chrome/browser/ui/table_view/cells", + "//ui/base", + ] +} + +source_set("tracking_price_ui") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "tracking_price_consumer.h", + "tracking_price_view_controller.h", + "tracking_price_view_controller.mm", + "tracking_price_view_controller_delegate.h", + ] + deps = [ + ":constants", + "//base", + "//ios/chrome/app/strings", + "//ios/chrome/browser/ui/settings:settings_root", + "//ios/chrome/browser/ui/table_view", + "//ios/chrome/browser/ui/table_view:utils", + "//ui/base", + ] +} + +source_set("constants") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "tracking_price_constants.h", + "tracking_price_constants.mm", + ] +}
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.h b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.h new file mode 100644 index 0000000..4edbc4f --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.h
@@ -0,0 +1,16 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// The accessibility identifier of the Tracking Price setting table view. +extern NSString* const kTrackingPriceTableViewId; + +// The accessibility identifier of the Tracking Price mobile notifications cell. +extern NSString* const kSettingsTrackingPriceMobileNotificationsCellId; + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.mm b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.mm new file mode 100644 index 0000000..3ea1376 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.mm
@@ -0,0 +1,14 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kTrackingPriceTableViewId = @"kTrackingPriceTableViewId"; + +NSString* const kSettingsTrackingPriceMobileNotificationsCellId = + @"kSettingsTrackingPriceMobileNotificationsCellId";
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_consumer.h b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_consumer.h new file mode 100644 index 0000000..f26830d --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_consumer.h
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_CONSUMER_H_ + +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/ui/table_view/chrome_table_view_consumer.h" + +@class TableViewHeaderFooterItem; +@class TableViewItem; + +// Consumer protocol for Tracking Price settings menu. +@protocol TrackingPriceConsumer <ChromeTableViewConsumer> + +// Initializes `mobileNotificationItem`. +- (void)setMobileNotificationItem:(TableViewItem*)mobileNotificationItem; + +// Initializes `trackPriceHeaderItem`. +- (void)setTrackPriceHeaderItem: + (TableViewHeaderFooterItem*)trackPriceHeaderItem; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.h b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.h new file mode 100644 index 0000000..daa41b2 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.h
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_MEDIATOR_H_ + +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller_delegate.h" + +@protocol TrackingPriceConsumer; + +// Mediator for the Tracking Price. +@interface TrackingPriceMediator + : NSObject <TrackingPriceViewControllerDelegate> + +// View controller. +@property(nonatomic, weak) id<TrackingPriceConsumer> consumer; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.mm b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.mm new file mode 100644 index 0000000..b32b5d2 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.mm
@@ -0,0 +1,88 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_mediator.h" + +#import "base/mac/foundation_util.h" +#import "base/notreached.h" +#import "ios/chrome/browser/ui/list_model/list_model.h" +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.h" +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_consumer.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_switch_item.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +// List of items. +typedef NS_ENUM(NSInteger, ItemType) { + ItemTypeMobileNotifications = kItemTypeEnumZero, + ItemTypeTrackPriceHeader, +}; + +@interface TrackingPriceMediator () + +// Mobile notification item. +@property(nonatomic, strong) TableViewSwitchItem* mobileNotificationItem; +// Header item. +@property(nonatomic, strong) + TableViewLinkHeaderFooterItem* trackPriceHeaderItem; + +@end + +@implementation TrackingPriceMediator + +#pragma mark - Properties + +- (TableViewSwitchItem*)mobileNotificationItem { + if (!_mobileNotificationItem) { + _mobileNotificationItem = + [[TableViewSwitchItem alloc] initWithType:ItemTypeMobileNotifications]; + _mobileNotificationItem.text = l10n_util::GetNSString( + IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE); + _mobileNotificationItem.accessibilityIdentifier = + kSettingsTrackingPriceMobileNotificationsCellId; + } + + return _mobileNotificationItem; +} + +- (TableViewLinkHeaderFooterItem*)trackPriceHeaderItem { + if (!_trackPriceHeaderItem) { + _trackPriceHeaderItem = [[TableViewLinkHeaderFooterItem alloc] + initWithType:ItemTypeTrackPriceHeader]; + _trackPriceHeaderItem.text = + l10n_util::GetNSString(IDS_IOS_TRACKING_PRICE_HEADER_TEXT); + } + + return _trackPriceHeaderItem; +} + +- (void)setConsumer:(id<TrackingPriceConsumer>)consumer { + if (_consumer == consumer) + return; + _consumer = consumer; + [_consumer setMobileNotificationItem:self.mobileNotificationItem]; + [_consumer setTrackPriceHeaderItem:self.trackPriceHeaderItem]; +} + +#pragma mark - TrackingPriceViewControllerDelegate + +- (void)toggleSwitchItem:(TableViewItem*)item withValue:(BOOL)value { + ItemType type = static_cast<ItemType>(item.type); + switch (type) { + case ItemTypeMobileNotifications: + self.mobileNotificationItem.on = value; + break; + default: + // Not a switch. + NOTREACHED(); + break; + } +} + +@end
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.h b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.h new file mode 100644 index 0000000..45524e8 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.h
@@ -0,0 +1,41 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_VIEW_CONTROLLER_H_ + +#import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" + +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_consumer.h" +#import "ios/chrome/browser/ui/settings/settings_controller_protocol.h" + +@class TrackingPriceViewController; +@protocol TrackingPriceViewControllerDelegate; + +// Delegate for presentation events related to +// TrackingPriceViewController. +@protocol TrackingPriceViewControllerPresentationDelegate + +// Called when the view controller is removed from its parent. +- (void)trackingPriceViewControllerDidRemove: + (TrackingPriceViewController*)controller; + +@end + +// View controller for tracking price settings. +@interface TrackingPriceViewController + : SettingsRootTableViewController <SettingsControllerProtocol, + TrackingPriceConsumer> + +// Presentation delegate. +@property(nonatomic, weak) id<TrackingPriceViewControllerPresentationDelegate> + presentationDelegate; + +// Delegate for view controller to send responses to model. +@property(nonatomic, weak) id<TrackingPriceViewControllerDelegate> + modelDelegate; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.mm b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.mm new file mode 100644 index 0000000..b4d9012 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.mm
@@ -0,0 +1,113 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller.h" + +#import "base/check.h" +#import "base/mac/foundation_util.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_constants.h" +#import "ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller_delegate.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_switch_cell.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_text_header_footer_item.h" +#import "ios/chrome/browser/ui/table_view/table_view_utils.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +typedef NS_ENUM(NSInteger, SectionIdentifier) { + SectionIdentifierTrackingPriceContent = kSectionIdentifierEnumZero, +}; + +} // namespace + +@interface TrackingPriceViewController () + +// Mobile notification table view item received by mediator. +@property(nonatomic, strong) TableViewItem* mobileNotificationItem; +// Tracking price header received by mediator. +@property(nonatomic, strong) TableViewHeaderFooterItem* trackPriceHeaderItem; + +@end + +@implementation TrackingPriceViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = + l10n_util::GetNSString(IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACKING_TITLE); + self.tableView.accessibilityIdentifier = kTrackingPriceTableViewId; + [self loadModel]; +} + +#pragma mark - SettingsControllerProtocol + +- (void)reportDismissalUserAction { + base::RecordAction( + base::UserMetricsAction("MobileTrackingPriceSettingsClose")); +} + +- (void)reportBackUserAction { + base::RecordAction( + base::UserMetricsAction("MobileTrackingPriceSettingsBack")); +} + +#pragma mark - ChromeTableViewController + +- (void)loadModel { + [super loadModel]; + + TableViewModel* model = self.tableViewModel; + [model addSectionWithIdentifier:SectionIdentifierTrackingPriceContent]; + [model addItem:self.mobileNotificationItem + toSectionWithIdentifier:SectionIdentifierTrackingPriceContent]; + [model setHeader:self.trackPriceHeaderItem + forSectionWithIdentifier:SectionIdentifierTrackingPriceContent]; +} + +#pragma mark - UIViewController + +- (void)didMoveToParentViewController:(UIViewController*)parent { + [super didMoveToParentViewController:parent]; + if (!parent) { + [self.presentationDelegate trackingPriceViewControllerDidRemove:self]; + } +} + +#pragma mark - Private + +// Called when switch is toggled. +- (void)switchAction:(UISwitch*)sender { + NSIndexPath* indexPath = + [self.tableViewModel indexPathForItemType:sender.tag]; + DCHECK(indexPath); + TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath]; + [self.modelDelegate toggleSwitchItem:item withValue:sender.isOn]; +} + +#pragma mark - UITableViewDataSource + +- (UITableViewCell*)tableView:(UITableView*)tableView + cellForRowAtIndexPath:(NSIndexPath*)indexPath { + UITableViewCell* cell = [super tableView:tableView + cellForRowAtIndexPath:indexPath]; + if ([cell isKindOfClass:[TableViewSwitchCell class]]) { + TableViewSwitchCell* switchCell = + base::mac::ObjCCastStrict<TableViewSwitchCell>(cell); + [switchCell.switchView addTarget:self + action:@selector(switchAction:) + forControlEvents:UIControlEventValueChanged]; + TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath]; + switchCell.switchView.tag = item.type; + } + return cell; +} + +@end
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller_delegate.h b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller_delegate.h new file mode 100644 index 0000000..55b7206 --- /dev/null +++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/tracking_price_view_controller_delegate.h
@@ -0,0 +1,19 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_VIEW_CONTROLLER_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_VIEW_CONTROLLER_DELEGATE_H_ + +@class TableViewItem; + +// Delegate for TrackingPriceViewController instance, to manage +// the model. +@protocol TrackingPriceViewControllerDelegate <NSObject> + +// Sends switch toggle response to the model so that it can be updated. +- (void)toggleSwitchItem:(TableViewItem*)item withValue:(BOOL)value; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRICE_NOTIFICATIONS_TRACKING_PRICE_TRACKING_PRICE_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm index bd48feb..51dc01d3 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -323,15 +323,16 @@ } // Types JavaScript into Omnibox and verify that an alert is displayed. -// TODO(crbug.com/1359286): Disabled due to flakiness. Re-enabled when fixed. -- (void)DISABLED_testTypeJavaScriptIntoOmnibox { +- (void)testTypeJavaScriptIntoOmnibox { [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo")]; - [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:alert('Hello');\n"]; + [ChromeEarlGreyUI + focusOmniboxAndType:@"javascript:alert('JS Alert Text');\n"]; ConditionBlock condition = ^{ NSError* error = nil; - [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Hello")] + [[EarlGrey + selectElementWithMatcher:grey_accessibilityLabel(@"JS Alert Text")] assertWithMatcher:grey_sufficientlyVisible() error:&error]; return error == nil;
diff --git a/ios/net/cookies/system_cookie_store_unittest_template.h b/ios/net/cookies/system_cookie_store_unittest_template.h index c9cf01b7..ffce656 100644 --- a/ios/net/cookies/system_cookie_store_unittest_template.h +++ b/ios/net/cookies/system_cookie_store_unittest_template.h
@@ -9,7 +9,6 @@ #import <Foundation/Foundation.h> - #include "base/bind.h" #include "base/callback.h" #include "base/memory/ptr_util.h" @@ -21,10 +20,6 @@ #include "testing/platform_test.h" #include "url/gurl.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - using base::test::ios::WaitUntilConditionOrTimeout; using base::test::ios::kWaitForCookiesTimeout;
diff --git a/ios/web/annotations/annotations_text_manager.h b/ios/web/annotations/annotations_text_manager.h index 026a8b7..f30b4a8 100644 --- a/ios/web/annotations/annotations_text_manager.h +++ b/ios/web/annotations/annotations_text_manager.h
@@ -25,12 +25,8 @@ class AnnotationsTextManager : public WebStateUserData<AnnotationsTextManager>, public WebStateObserver { public: - explicit AnnotationsTextManager(WebState* web_state); ~AnnotationsTextManager() override; - // WebStateUserData methods: - static void CreateForWebState(WebState* web_state); - // Observers registered after web page is loaded will miss some notifications. void AddObserver(AnnotationsTextObserver* observer); void RemoveObserver(AnnotationsTextObserver* observer); @@ -69,6 +65,8 @@ private: friend class WebStateUserData<AnnotationsTextManager>; + explicit AnnotationsTextManager(WebState* web_state); + void StartExtractingText(); AnnotationsJavaScriptFeature* GetJSFeature();
diff --git a/ios/web/annotations/annotations_text_manager.mm b/ios/web/annotations/annotations_text_manager.mm index 45ffd11c..f091cb3b 100644 --- a/ios/web/annotations/annotations_text_manager.mm +++ b/ios/web/annotations/annotations_text_manager.mm
@@ -30,15 +30,6 @@ web_state_ = nullptr; } -// static -void AnnotationsTextManager::CreateForWebState(WebState* web_state) { - DCHECK(web_state); - if (!FromWebState(web_state)) { - web_state->SetUserData(UserDataKey(), - std::make_unique<AnnotationsTextManager>(web_state)); - } -} - void AnnotationsTextManager::AddObserver(AnnotationsTextObserver* observer) { observers_.AddObserver(observer); }
diff --git a/ios/web/public/test/fakes/crw_fake_web_state_policy_decider.h b/ios/web/public/test/fakes/crw_fake_web_state_policy_decider.h index 6560b25..f838b30 100644 --- a/ios/web/public/test/fakes/crw_fake_web_state_policy_decider.h +++ b/ios/web/public/test/fakes/crw_fake_web_state_policy_decider.h
@@ -7,10 +7,6 @@ #import "ios/web/public/navigation/web_state_policy_decider_bridge.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @class NSURLRequest; @class NSURLResponse;
diff --git a/net/BUILD.gn b/net/BUILD.gn index dabdb28..b08944b 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -4158,6 +4158,7 @@ "extras/sqlite/sqlite_persistent_cookie_store_unittest.cc", "filter/filter_source_stream_unittest.cc", "filter/gzip_source_stream_unittest.cc", + "first_party_sets/first_party_sets_context_config_unittest.cc", "first_party_sets/public_sets_unittest.cc", "http/alternative_service_unittest.cc", "http/bidirectional_stream_unittest.cc",
diff --git a/net/dns/address_sorter_posix_unittest.cc b/net/dns/address_sorter_posix_unittest.cc index c895e88f..164c931 100644 --- a/net/dns/address_sorter_posix_unittest.cc +++ b/net/dns/address_sorter_posix_unittest.cc
@@ -87,10 +87,32 @@ NOTIMPLEMENTED(); return ERR_NOT_IMPLEMENTED; } + int ConnectUsingDefaultNetwork(const IPEndPoint& address) override { NOTIMPLEMENTED(); return ERR_NOT_IMPLEMENTED; } + + int ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override { + NOTIMPLEMENTED(); + return ERR_NOT_IMPLEMENTED; + } + + int ConnectUsingNetworkAsync(handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) override { + NOTIMPLEMENTED(); + return ERR_NOT_IMPLEMENTED; + } + + int ConnectUsingDefaultNetworkAsync( + const IPEndPoint& address, + CompletionOnceCallback callback) override { + NOTIMPLEMENTED(); + return ERR_NOT_IMPLEMENTED; + } + handles::NetworkHandle GetBoundNetwork() const override { return handles::kInvalidNetworkHandle; }
diff --git a/net/first_party_sets/first_party_sets_context_config.cc b/net/first_party_sets/first_party_sets_context_config.cc index ba0ea81..913bfab 100644 --- a/net/first_party_sets/first_party_sets_context_config.cc +++ b/net/first_party_sets/first_party_sets_context_config.cc
@@ -27,4 +27,23 @@ return customizations_ == other.customizations_; } +absl::optional<absl::optional<FirstPartySetEntry>> +FirstPartySetsContextConfig::FindOverride(const SchemefulSite& site) const { + if (const auto it = customizations_.find(site); it != customizations_.end()) { + return it->second; + } + return absl::nullopt; +} + +void FirstPartySetsContextConfig::IngestAliases( + base::flat_map<SchemefulSite, SchemefulSite> aliases) { + for (const auto& [alias, canonical] : aliases) { + absl::optional<absl::optional<FirstPartySetEntry>> result = + FindOverride(canonical); + DCHECK(result.has_value()); + bool inserted = customizations_.emplace(alias, result.value()).second; + DCHECK(inserted); + } +} + } // namespace net
diff --git a/net/first_party_sets/first_party_sets_context_config.h b/net/first_party_sets/first_party_sets_context_config.h index 0401a393..5a312e6 100644 --- a/net/first_party_sets/first_party_sets_context_config.h +++ b/net/first_party_sets/first_party_sets_context_config.h
@@ -31,6 +31,23 @@ bool operator==(const FirstPartySetsContextConfig& other) const; + bool empty() const { return customizations_.empty(); } + + // Finds an override for the given site, in this context. Returns: + // - nullopt if no override was found. + // - optional(nullopt) if an override was found, and it's a deletion. + // - optional(optional(entry)) if an override was found, and it's a + // modification/addition. + absl::optional<absl::optional<FirstPartySetEntry>> FindOverride( + const SchemefulSite& site) const; + + // Modifies this config such that `aliases` are taken into account. + // + // This method requires that no override exists in this config for any key in + // `aliases`; and that an override exists in this config for every value in + // `aliases`. + void IngestAliases(base::flat_map<SchemefulSite, SchemefulSite> aliases); + const OverrideSets& customizations() const { return customizations_; } private:
diff --git a/net/first_party_sets/first_party_sets_context_config_unittest.cc b/net/first_party_sets/first_party_sets_context_config_unittest.cc new file mode 100644 index 0000000..3fee885 --- /dev/null +++ b/net/first_party_sets/first_party_sets_context_config_unittest.cc
@@ -0,0 +1,63 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/first_party_sets/first_party_sets_context_config.h" + +#include "net/base/schemeful_site.h" +#include "net/first_party_sets/first_party_set_entry.h" +#include "net/first_party_sets/first_party_sets_context_config.h" +#include "testing/gmock/include/gmock/gmock-matchers.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" + +using ::testing::Optional; + +namespace net { + +TEST(FirstPartySetsContextConfigTest, FindOverride_empty) { + EXPECT_EQ(FirstPartySetsContextConfig().FindOverride( + SchemefulSite(GURL("https://example.test"))), + absl::nullopt); +} + +TEST(FirstPartySetsContextConfigTest, FindOverride_irrelevant) { + SchemefulSite example(GURL("https://example.test")); + FirstPartySetEntry entry(example, SiteType::kPrimary, absl::nullopt); + SchemefulSite foo(GURL("https://foo.test")); + + EXPECT_EQ(FirstPartySetsContextConfig({{example, entry}}).FindOverride(foo), + absl::nullopt); +} + +TEST(FirstPartySetsContextConfigTest, FindOverride_deletion) { + SchemefulSite example(GURL("https://example.test")); + + EXPECT_THAT(FirstPartySetsContextConfig({{example, absl::nullopt}}) + .FindOverride(example), + Optional(absl::nullopt)); +} + +TEST(FirstPartySetsContextConfigTest, FindOverride_modification) { + SchemefulSite example(GURL("https://example.test")); + FirstPartySetEntry entry(example, SiteType::kPrimary, absl::nullopt); + + EXPECT_THAT( + FirstPartySetsContextConfig({{example, entry}}).FindOverride(example), + Optional(Optional(entry))); +} + +TEST(FirstPartySetsContextConfigTest, IngestAliases) { + SchemefulSite example(GURL("https://example.test")); + SchemefulSite example_cctld(GURL("https://example.cctld")); + FirstPartySetEntry entry(example, SiteType::kPrimary, absl::nullopt); + + FirstPartySetsContextConfig config({{example, entry}}); + config.IngestAliases({{example_cctld, example}}); + + EXPECT_THAT(config.FindOverride(example_cctld), Optional(Optional(entry))); +} + +} // namespace net
diff --git a/net/first_party_sets/public_sets.cc b/net/first_party_sets/public_sets.cc index 3a40109..da0e057 100644 --- a/net/first_party_sets/public_sets.cc +++ b/net/first_party_sets/public_sets.cc
@@ -6,7 +6,6 @@ #include <tuple> -#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "net/base/schemeful_site.h" @@ -62,7 +61,17 @@ PublicSets::PublicSets( base::flat_map<SchemefulSite, FirstPartySetEntry> entries, base::flat_map<SchemefulSite, SchemefulSite> aliases) - : entries_(std::move(entries)), aliases_(std::move(aliases)) {} + : PublicSets(std::move(entries), + std::move(aliases), + FirstPartySetsContextConfig()) {} + +PublicSets::PublicSets( + base::flat_map<SchemefulSite, FirstPartySetEntry> entries, + base::flat_map<SchemefulSite, SchemefulSite> aliases, + FirstPartySetsContextConfig manual_config) + : entries_(std::move(entries)), + aliases_(std::move(aliases)), + manual_config_(std::move(manual_config)) {} PublicSets::PublicSets(PublicSets&&) = default; PublicSets& PublicSets::operator=(PublicSets&&) = default; @@ -70,8 +79,8 @@ PublicSets::~PublicSets() = default; bool PublicSets::operator==(const PublicSets& other) const { - return std::tie(entries_, aliases_) == - std::tie(other.entries_, other.aliases_); + return std::tie(entries_, aliases_, manual_config_) == + std::tie(other.entries_, other.aliases_, other.manual_config_); } bool PublicSets::operator!=(const PublicSets& other) const { @@ -79,24 +88,29 @@ } PublicSets PublicSets::Clone() const { - return PublicSets(entries_, aliases_); + return PublicSets(entries_, aliases_, manual_config_.Clone()); } absl::optional<FirstPartySetEntry> PublicSets::FindEntry( const SchemefulSite& site, const FirstPartySetsContextConfig* fps_context_config) const { - SchemefulSite normalized_site = NormalizeScheme(site); + const SchemefulSite normalized_site = NormalizeScheme(site); // Check if `normalized_site` can be found in the customizations first. - // If not, fall back to look up in `entries_`. if (fps_context_config) { - if (const auto config_it = - fps_context_config->customizations().find(normalized_site); - config_it != fps_context_config->customizations().end()) { - return config_it->second; + if (const auto entry = fps_context_config->FindOverride(normalized_site); + entry.has_value()) { + return entry.value(); } } + // Now see if it's in the manual config (with or without a manual alias). + if (const auto manual_entry = manual_config_.FindOverride(normalized_site); + manual_entry.has_value()) { + return manual_entry.value(); + } + + // Finally, look up in `entries_`, applying an alias if applicable. const auto canonical_it = aliases_.find(normalized_site); const SchemefulSite& canonical_site = canonical_it == aliases_.end() ? normalized_site : canonical_it->second; @@ -121,76 +135,16 @@ return sites_to_entries; } -base::flat_set<SchemefulSite> PublicSets::FindIntersection( - const SchemefulSite& manual_primary, - const base::flat_map<SchemefulSite, FirstPartySetEntry>& manual_entries) - const { - std::vector<SchemefulSite> intersection; - for (const std::pair<SchemefulSite, FirstPartySetEntry>& - public_site_and_entry : entries_) { - const SchemefulSite& public_site = public_site_and_entry.first; - const SchemefulSite& public_primary = - public_site_and_entry.second.primary(); - bool is_affected_by_local_set = - public_site == manual_primary || public_primary == manual_primary || - base::ranges::any_of( - manual_entries, - [&](const std::pair<SchemefulSite, FirstPartySetEntry>& - manual_site_and_entry) { - const SchemefulSite& manual_site = manual_site_and_entry.first; - return manual_site == public_site || - manual_site == public_primary; - }); - if (is_affected_by_local_set) { - intersection.push_back(public_site_and_entry.first); - } - }; - - return intersection; -} - -base::flat_set<SchemefulSite> PublicSets::FindSingletons() const { - std::vector<SchemefulSite> primaries_with_members; - for (const auto& [site, entry] : entries_) { - if (site != entry.primary()) - primaries_with_members.push_back(entry.primary()); - } - std::vector<SchemefulSite> singletons; - for (const auto& [site, entry] : entries_) { - if (site == entry.primary() && - !base::Contains(primaries_with_members, site)) { - singletons.push_back(site); - } - } - - return singletons; -} - void PublicSets::ApplyManuallySpecifiedSet( const SchemefulSite& manual_primary, const base::flat_map<SchemefulSite, FirstPartySetEntry>& manual_entries, const base::flat_map<SchemefulSite, SchemefulSite>& manual_aliases) { - base::flat_set<SchemefulSite> intersection = - FindIntersection(manual_primary, manual_entries); - for (const auto& site : intersection) { - entries_.erase(site); - } - - base::flat_set<SchemefulSite> singletons = FindSingletons(); - for (const auto& singleton : singletons) { - entries_.erase(singleton); - } - - base::ranges::copy(manual_entries, std::inserter(entries_, entries_.end())); - - // Finally, remove any aliases for public sites that were affected (deleted), - // and add any aliases defined in the local set. - base::EraseIf( - aliases_, [&](const std::pair<SchemefulSite, SchemefulSite>& alias) { - return intersection.contains(alias.second) || - singletons.contains(alias.second); - }); - aliases_.insert(manual_aliases.begin(), manual_aliases.end()); + DCHECK(manual_config_.empty()); + // We handle the manually-specified set the same way as we handle + // replacement enterprise policy sets. + manual_config_ = ComputeConfig( + /*replacement_sets=*/{manual_entries}, /*normalized_additions=*/{}); + manual_config_.IngestAliases(std::move(manual_aliases)); } FirstPartySetsContextConfig PublicSets::ComputeConfig( @@ -289,6 +243,14 @@ DCHECK(inserted); } + // For every public alias that would now refer to a site in the overlay, which + // is not already contained in the overlay, we explicitly ignore that alias. + for (const auto& [alias, site] : aliases_) { + if (site_to_entry.contains(site) && !site_to_entry.contains(alias)) { + site_to_entry.emplace(alias, absl::nullopt); + } + } + return FirstPartySetsContextConfig(std::move(site_to_entry)); }
diff --git a/net/first_party_sets/public_sets.h b/net/first_party_sets/public_sets.h index 215d6da..73c2b25d 100644 --- a/net/first_party_sets/public_sets.h +++ b/net/first_party_sets/public_sets.h
@@ -10,12 +10,11 @@ #include "net/base/net_export.h" #include "net/base/schemeful_site.h" #include "net/first_party_sets/first_party_set_entry.h" +#include "net/first_party_sets/first_party_sets_context_config.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace net { -class FirstPartySetsContextConfig; - // This class holds all of the info associated with the public First-Party // Sets, after they've been parsed. This is suitable for plumbing from the // browser process to the network service, or for answering queries. @@ -24,6 +23,9 @@ PublicSets(); PublicSets(base::flat_map<SchemefulSite, FirstPartySetEntry> entries, base::flat_map<SchemefulSite, SchemefulSite> aliases); + PublicSets(base::flat_map<SchemefulSite, FirstPartySetEntry> entries, + base::flat_map<SchemefulSite, SchemefulSite> aliases, + FirstPartySetsContextConfig manual_config); PublicSets(PublicSets&&); PublicSets& operator=(PublicSets&&); @@ -33,13 +35,16 @@ bool operator==(const PublicSets& other) const; bool operator!=(const PublicSets& other) const; + // The accessors below should only be used by mojo plumbing. const base::flat_map<SchemefulSite, FirstPartySetEntry>& entries() const { return entries_; } - const base::flat_map<SchemefulSite, SchemefulSite>& aliases() const { return aliases_; } + const FirstPartySetsContextConfig& manual_config() const { + return manual_config_; + } // Creates a clone of this instance. PublicSets Clone() const; @@ -80,27 +85,17 @@ const base::flat_map<SchemefulSite, SchemefulSite>& manual_aliases); private: - // Finds the intersection between the underlying entries and the given - // manually-specified set. - // - // The returned collection also includes any sites in the underlying entries - // whose primary was in the intersection. - base::flat_set<SchemefulSite> FindIntersection( - const SchemefulSite& manual_primary, - const base::flat_map<SchemefulSite, FirstPartySetEntry>& manual_entries) - const; - - // Finds singleton sets in the underlying entries, which are sets that consist - // of only a single site. - base::flat_set<SchemefulSite> FindSingletons() const; - - // Represents the mapping of site -> entry, where keys are sites within sets, - // and values are entries of the sets. + // Represents the mapping of site -> entry, where keys are sites within + // sets, and values are entries of the sets. base::flat_map<SchemefulSite, FirstPartySetEntry> entries_; // The site aliases. Used to normalize a given SchemefulSite into its // canonical representative, before looking it up in `entries_`. base::flat_map<SchemefulSite, SchemefulSite> aliases_; + + // Stores the customizations induced by the manually-specified set. May be + // empty if no switch was provided. + FirstPartySetsContextConfig manual_config_; }; NET_EXPORT std::ostream& operator<<(std::ostream& os, const PublicSets& ps);
diff --git a/net/socket/datagram_client_socket.h b/net/socket/datagram_client_socket.h index 0f61967..ee21b719 100644 --- a/net/socket/datagram_client_socket.h +++ b/net/socket/datagram_client_socket.h
@@ -23,6 +23,7 @@ // Initialize this socket as a client socket to server at |address|. // Returns a network error code. + // TODO(liza): Remove this method once consumers have been updated. virtual int Connect(const IPEndPoint& address) = 0; // Binds this socket to |network| and initializes socket as a client socket @@ -30,13 +31,37 @@ // received via |network|. This call will fail if |network| has disconnected. // Communication using this socket will fail if |network| disconnects. // Returns a net error code. + // TODO(liza): Remove this method once consumers have been updated. virtual int ConnectUsingNetwork(handles::NetworkHandle network, const IPEndPoint& address) = 0; // Same as ConnectUsingNetwork, except that the current default network is // used. Returns a net error code. + // TODO(liza): Remove this method once consumers have been updated. virtual int ConnectUsingDefaultNetwork(const IPEndPoint& address) = 0; + // Same as Connect, but it can run asynchronously or synchronously. Returns a + // network error code. + // TODO(liza): Rename this to Connect once consumers have been updated. + virtual int ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) = 0; + + // Same as ConnectUsingNetwork, but it can run asynchronously or + // synchronously. Returns a network error code. + // TODO(liza): Rename this to ConnectUsingNetwork once consumers have been + // updated. + virtual int ConnectUsingNetworkAsync(handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) = 0; + + // Same as ConnectUsConnectUsingDefaultNetworkingNetwork, but it can run + // asynchronously or synchronously. Returns a network error code. + // TODO(liza): Rename this to ConnectUsingDefaultNetwork once consumers have + // been updated. + virtual int ConnectUsingDefaultNetworkAsync( + const IPEndPoint& address, + CompletionOnceCallback callback) = 0; + // Returns the network that either ConnectUsingNetwork() or // ConnectUsingDefaultNetwork() bound this socket to. Returns // handles::kInvalidNetworkHandle if not explicitly bound via
diff --git a/net/socket/fuzzed_datagram_client_socket.cc b/net/socket/fuzzed_datagram_client_socket.cc index 846f0ff..3cd45f44 100644 --- a/net/socket/fuzzed_datagram_client_socket.cc +++ b/net/socket/fuzzed_datagram_client_socket.cc
@@ -62,6 +62,34 @@ return ERR_NOT_IMPLEMENTED; } +int FuzzedDatagramClientSocket::ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) { + CHECK(!connected_); + int rv = Connect(address); + DCHECK_NE(rv, ERR_IO_PENDING); + if (data_provider_->ConsumeBool()) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), rv)); + return ERR_IO_PENDING; + } + return rv; +} + +int FuzzedDatagramClientSocket::ConnectUsingNetworkAsync( + handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) { + CHECK(!connected_); + return ERR_NOT_IMPLEMENTED; +} + +int FuzzedDatagramClientSocket::ConnectUsingDefaultNetworkAsync( + const IPEndPoint& address, + CompletionOnceCallback callback) { + CHECK(!connected_); + return ERR_NOT_IMPLEMENTED; +} + handles::NetworkHandle FuzzedDatagramClientSocket::GetBoundNetwork() const { return handles::kInvalidNetworkHandle; }
diff --git a/net/socket/fuzzed_datagram_client_socket.h b/net/socket/fuzzed_datagram_client_socket.h index 36d923e..0daf24d 100644 --- a/net/socket/fuzzed_datagram_client_socket.h +++ b/net/socket/fuzzed_datagram_client_socket.h
@@ -41,6 +41,13 @@ int ConnectUsingNetwork(handles::NetworkHandle network, const IPEndPoint& address) override; int ConnectUsingDefaultNetwork(const IPEndPoint& address) override; + int ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override; + int ConnectUsingNetworkAsync(handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) override; + int ConnectUsingDefaultNetworkAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override; handles::NetworkHandle GetBoundNetwork() const override; void ApplySocketTag(const SocketTag& tag) override;
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index fc36ac4b..a96d841 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -1613,6 +1613,7 @@ int MockUDPClientSocket::Connect(const IPEndPoint& address) { if (!data_) return ERR_UNEXPECTED; + DCHECK_NE(data_->connect_data().result, ERR_IO_PENDING); connected_ = true; peer_addr_ = address; return data_->connect_data().result; @@ -1623,6 +1624,7 @@ DCHECK(!connected_); if (!data_) return ERR_UNEXPECTED; + DCHECK_NE(data_->connect_data().result, ERR_IO_PENDING); network_ = network; connected_ = true; peer_addr_ = address; @@ -1633,12 +1635,68 @@ DCHECK(!connected_); if (!data_) return ERR_UNEXPECTED; + DCHECK_NE(data_->connect_data().result, ERR_IO_PENDING); network_ = kDefaultNetworkForTests; connected_ = true; peer_addr_ = address; return data_->connect_data().result; } +int MockUDPClientSocket::ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) { + DCHECK(callback); + if (!data_) { + return ERR_UNEXPECTED; + } + connected_ = true; + peer_addr_ = address; + int result = data_->connect_data().result; + IoMode mode = data_->connect_data().mode; + if (mode == SYNCHRONOUS) { + return result; + } + RunCallbackAsync(std::move(callback), result); + return ERR_IO_PENDING; +} + +int MockUDPClientSocket::ConnectUsingNetworkAsync( + handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) { + DCHECK(callback); + DCHECK(!connected_); + if (!data_) + return ERR_UNEXPECTED; + network_ = network; + connected_ = true; + peer_addr_ = address; + int result = data_->connect_data().result; + IoMode mode = data_->connect_data().mode; + if (mode == SYNCHRONOUS) { + return result; + } + RunCallbackAsync(std::move(callback), result); + return ERR_IO_PENDING; +} + +int MockUDPClientSocket::ConnectUsingDefaultNetworkAsync( + const IPEndPoint& address, + CompletionOnceCallback callback) { + DCHECK(!connected_); + if (!data_) + return ERR_UNEXPECTED; + network_ = kDefaultNetworkForTests; + connected_ = true; + peer_addr_ = address; + int result = data_->connect_data().result; + IoMode mode = data_->connect_data().mode; + if (mode == SYNCHRONOUS) { + return result; + } + RunCallbackAsync(std::move(callback), result); + return ERR_IO_PENDING; +} + handles::NetworkHandle MockUDPClientSocket::GetBoundNetwork() const { return network_; }
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index fb8c9655..27103f8f 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -987,6 +987,13 @@ int ConnectUsingNetwork(handles::NetworkHandle network, const IPEndPoint& address) override; int ConnectUsingDefaultNetwork(const IPEndPoint& address) override; + int ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override; + int ConnectUsingNetworkAsync(handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) override; + int ConnectUsingDefaultNetworkAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override; handles::NetworkHandle GetBoundNetwork() const override; void ApplySocketTag(const SocketTag& tag) override; void SetMsgConfirm(bool confirm) override {}
diff --git a/net/socket/udp_client_socket.cc b/net/socket/udp_client_socket.cc index 5b512922..9da4f0f36d 100644 --- a/net/socket/udp_client_socket.cc +++ b/net/socket/udp_client_socket.cc
@@ -4,6 +4,8 @@ #include "net/socket/udp_client_socket.h" +#include "base/task/single_thread_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "net/base/net_errors.h" #include "net/base/network_change_notifier.h" @@ -75,6 +77,26 @@ return socket_.Connect(address); } +int UDPClientSocket::ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) { + DCHECK(callback); + return Connect(address); +} + +int UDPClientSocket::ConnectUsingNetworkAsync(handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) { + DCHECK(callback); + return ConnectUsingNetwork(network, address); +} + +int UDPClientSocket::ConnectUsingDefaultNetworkAsync( + const IPEndPoint& address, + CompletionOnceCallback callback) { + DCHECK(callback); + return ConnectUsingDefaultNetwork(address); +} + handles::NetworkHandle UDPClientSocket::GetBoundNetwork() const { return network_; }
diff --git a/net/socket/udp_client_socket.h b/net/socket/udp_client_socket.h index 4d2bdcc..8b1e6ea3 100644 --- a/net/socket/udp_client_socket.h +++ b/net/socket/udp_client_socket.h
@@ -39,6 +39,14 @@ int ConnectUsingNetwork(handles::NetworkHandle network, const IPEndPoint& address) override; int ConnectUsingDefaultNetwork(const IPEndPoint& address) override; + int ConnectAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override; + int ConnectUsingNetworkAsync(handles::NetworkHandle network, + const IPEndPoint& address, + CompletionOnceCallback callback) override; + int ConnectUsingDefaultNetworkAsync(const IPEndPoint& address, + CompletionOnceCallback callback) override; + handles::NetworkHandle GetBoundNetwork() const override; void ApplySocketTag(const SocketTag& tag) override; int Read(IOBuffer* buf,
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc index d06f4fc..8ac99fed 100644 --- a/net/socket/udp_socket_unittest.cc +++ b/net/socket/udp_socket_unittest.cc
@@ -155,7 +155,7 @@ // Run unit test for a connection test. // |use_nonblocking_io| is used to switch between overlapped and non-blocking // IO on Windows. It has no effect in other ports. - void ConnectTest(bool use_nonblocking_io); + void ConnectTest(bool use_nonblocking_io, bool use_async); protected: static const int kMaxRead = 1024; @@ -172,7 +172,7 @@ std::move(callback).Run(); } -void UDPSocketTest::ConnectTest(bool use_nonblocking_io) { +void UDPSocketTest::ConnectTest(bool use_nonblocking_io, bool use_async) { std::string simple_message("hello world!"); RecordingNetLogObserver net_log_observer; // Setup the server to listen. @@ -192,8 +192,19 @@ if (use_nonblocking_io) client->UseNonBlockingIO(); - EXPECT_THAT(client->Connect(server_address), IsOk()); - + if (!use_async) { + EXPECT_THAT(client->Connect(server_address), IsOk()); + } else { + TestCompletionCallback callback; + int rv = client->ConnectAsync(server_address, callback.callback()); + if (rv != OK) { + ASSERT_EQ(rv, ERR_IO_PENDING); + rv = callback.WaitForResult(); + EXPECT_EQ(rv, OK); + } else { + EXPECT_EQ(rv, OK); + } + } // Client sends to the server. EXPECT_EQ(simple_message.length(), static_cast<size_t>(WriteSocket(client.get(), simple_message))); @@ -280,12 +291,15 @@ TEST_F(UDPSocketTest, Connect) { // The variable |use_nonblocking_io| has no effect in non-Windows ports. - ConnectTest(false); + // Run ConnectTest once with sync connect and once with async connect + ConnectTest(false, false); + ConnectTest(false, true); } #if BUILDFLAG(IS_WIN) TEST_F(UDPSocketTest, ConnectNonBlocking) { - ConnectTest(true); + ConnectTest(true, false); + ConnectTest(true, true); } #endif @@ -846,6 +860,63 @@ #endif // BUILDFLAG(IS_ANDROID) } +TEST_F(UDPSocketTest, ConnectUsingNetworkAsync) { + // The specific value of this address doesn't really matter, and no + // server needs to be running here. The test only needs to call + // ConnectUsingNetwork() and won't send any datagrams. + const IPEndPoint fake_server_address(IPAddress::IPv4Localhost(), 8080); + const handles::NetworkHandle wrong_network_handle = 65536; + TestCompletionCallback callback; +#if BUILDFLAG(IS_ANDROID) + NetworkChangeNotifierFactoryAndroid ncn_factory; + NetworkChangeNotifier::DisableForTest ncn_disable_for_test; + std::unique_ptr<NetworkChangeNotifier> ncn(ncn_factory.CreateInstance()); + if (!NetworkChangeNotifier::AreNetworkHandlesSupported()) + GTEST_SKIP() << "Network handles are required to test BindToNetwork."; + + { + // Connecting using a not existing network should fail but not report + // ERR_NOT_IMPLEMENTED when network handles are supported. + UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, + NetLogSource()); + int rv = socket.ConnectUsingNetworkAsync( + wrong_network_handle, fake_server_address, callback.callback()); + + if (rv == ERR_IO_PENDING) { + rv = callback.WaitForResult(); + } + EXPECT_NE(ERR_NOT_IMPLEMENTED, rv); + EXPECT_NE(OK, rv); + EXPECT_NE(NetworkChangeNotifier::GetDefaultNetwork(), + socket.GetBoundNetwork()); + } + + { + // Connecting using an existing network should succeed when + // NetworkChangeNotifier returns a valid default network. + UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, + NetLogSource()); + TestCompletionCallback callback; + const handles::NetworkHandle network_handle = + NetworkChangeNotifier::GetDefaultNetwork(); + if (network_handle != handles::kInvalidNetworkHandle) { + int rv = socket.ConnectUsingNetworkAsync( + network_handle, fake_server_address, callback.callback()); + if (rv == ERR_IO_PENDING) { + rv = callback.WaitForResult(); + } + EXPECT_EQ(OK, rv); + EXPECT_EQ(network_handle, socket.GetBoundNetwork()); + } + } +#else + UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, NetLogSource()); + EXPECT_EQ(ERR_NOT_IMPLEMENTED, socket.ConnectUsingNetworkAsync( + wrong_network_handle, fake_server_address, + callback.callback())); +#endif // BUILDFLAG(IS_ANDROID) +} + } // namespace #if BUILDFLAG(IS_WIN) @@ -1418,7 +1489,7 @@ android::RadioActivityTracker::GetInstance().OverrideRadioTypeForTesting( base::android::RadioConnectionType::kCell); - ConnectTest(/*use_nonblocking_io=*/false); + ConnectTest(/*use_nonblocking_io=*/false, false); // Check the write is recorded as a possible radio wake-up trigger. histograms.ExpectTotalCount(
diff --git a/services/network/proxy_auto_config_library_unittest.cc b/services/network/proxy_auto_config_library_unittest.cc index 40877b6..8324dad 100644 --- a/services/network/proxy_auto_config_library_unittest.cc +++ b/services/network/proxy_auto_config_library_unittest.cc
@@ -148,6 +148,23 @@ ADD_FAILURE() << "Called ConnectUsingDefaultNetwork()"; return net::ERR_UNEXPECTED; } + int ConnectAsync(const net::IPEndPoint& address, + net::CompletionOnceCallback callback) override { + ADD_FAILURE() << "Called ConnectAsync()"; + return net::ERR_UNEXPECTED; + } + int ConnectUsingNetworkAsync(net::handles::NetworkHandle network, + const net::IPEndPoint& address, + net::CompletionOnceCallback callback) override { + ADD_FAILURE() << "Called ConnectUsingNetworkAsync()"; + return net::ERR_UNEXPECTED; + } + int ConnectUsingDefaultNetworkAsync( + const net::IPEndPoint& address, + net::CompletionOnceCallback callback) override { + ADD_FAILURE() << "Called ConnectUsingDefaultNetworkAsync()"; + return net::ERR_UNEXPECTED; + } net::handles::NetworkHandle GetBoundNetwork() const override { ADD_FAILURE() << "Called GetBoundNetwork()"; return network_;
diff --git a/services/network/public/cpp/first_party_sets_mojom_traits.cc b/services/network/public/cpp/first_party_sets_mojom_traits.cc index 3f77af8..be500e7 100644 --- a/services/network/public/cpp/first_party_sets_mojom_traits.cc +++ b/services/network/public/cpp/first_party_sets_mojom_traits.cc
@@ -155,7 +155,12 @@ if (!public_sets.ReadAliases(&aliases)) return false; - *out_public_sets = net::PublicSets(entries, aliases); + net::FirstPartySetsContextConfig manual_config; + if (!public_sets.ReadManualConfig(&manual_config)) + return false; + + *out_public_sets = + net::PublicSets(entries, aliases, std::move(manual_config)); return true; }
diff --git a/services/network/public/cpp/first_party_sets_mojom_traits.h b/services/network/public/cpp/first_party_sets_mojom_traits.h index 25516f6b..f154e3b 100644 --- a/services/network/public/cpp/first_party_sets_mojom_traits.h +++ b/services/network/public/cpp/first_party_sets_mojom_traits.h
@@ -119,6 +119,11 @@ return p.aliases(); } + static const net::FirstPartySetsContextConfig& manual_config( + const net::PublicSets& p) { + return p.manual_config(); + } + static bool Read(network::mojom::PublicFirstPartySetsDataView public_sets, net::PublicSets* out_public_sets); };
diff --git a/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc b/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc index 34740b3..52ad066 100644 --- a/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc +++ b/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc
@@ -124,7 +124,10 @@ net::SchemefulSite b_cctld(GURL("https://b.cctld")); net::SchemefulSite c(GURL("https://c.test")); + net::FirstPartySetsContextConfig manual_config({{c, absl::nullopt}}); + const net::PublicSets original( + /*entries=*/ { {a, net::FirstPartySetEntry(a, net::SiteType::kPrimary, absl::nullopt)}, @@ -132,7 +135,7 @@ {c, net::FirstPartySetEntry(a, net::SiteType::kService, absl::nullopt)}, }, - {{b_cctld, b}}); + /*aliases=*/{{b_cctld, b}}, manual_config.Clone()); net::PublicSets round_tripped; @@ -143,6 +146,7 @@ EXPECT_EQ(original, round_tripped); EXPECT_FALSE(round_tripped.entries().empty()); EXPECT_FALSE(round_tripped.aliases().empty()); + EXPECT_EQ(round_tripped.manual_config(), manual_config); } TEST(FirstPartySetsTraitsTest, RoundTrips_FirstPartySetsContextConfig) {
diff --git a/services/network/public/mojom/first_party_sets.mojom b/services/network/public/mojom/first_party_sets.mojom index 87cd990..1520e3a 100644 --- a/services/network/public/mojom/first_party_sets.mojom +++ b/services/network/public/mojom/first_party_sets.mojom
@@ -54,16 +54,6 @@ }; // This struct must match the class fields defined in -// //net/first_party_sets/public_sets.h. -struct PublicFirstPartySets { - // The mapping from site to FPS entry. - map<SchemefulSite, FirstPartySetEntry> sets; - - // The mapping from site alias to canonical site. - map<SchemefulSite, SchemefulSite> aliases; -}; - -// This struct must match the class fields defined in // //net/first_party_sets/first_party_sets_context_config.h. struct FirstPartySetsContextConfig { // This map must be computed against the public First-Party Sets, where the @@ -73,3 +63,17 @@ // from the existing First-Party Sets, for the given context. map<SchemefulSite, FirstPartySetEntry?> customizations; }; + +// This struct must match the class fields defined in +// //net/first_party_sets/public_sets.h. +struct PublicFirstPartySets { + // The mapping from site to FPS entry. + map<SchemefulSite, FirstPartySetEntry> sets; + + // The mapping from site alias to canonical site. + map<SchemefulSite, SchemefulSite> aliases; + + // The config induced by the manually-supplied set. + FirstPartySetsContextConfig manual_config; +}; +
diff --git a/services/service_manager/public/cpp/binder_registry.h b/services/service_manager/public/cpp/binder_registry.h index 0b5ab81..08bc5f9 100644 --- a/services/service_manager/public/cpp/binder_registry.h +++ b/services/service_manager/public/cpp/binder_registry.h
@@ -20,6 +20,7 @@ namespace service_manager { +// (DEPRECATED) Prefer mojo::BinderMap instead. template <typename... BinderArgs> class BinderRegistryWithArgs { public:
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 02a7c28..3d2be3f 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -6712,6 +6712,28 @@ ] } ], + "NoCentralWebCacheLimitControl": [ + { + "platforms": [ + "android", + "android_weblayer", + "android_webview", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NoCentralWebCacheLimitControl" + ] + } + ] + } + ], "NoDiscardableMemoryForGpuDecodePath": [ { "platforms": [ @@ -9752,25 +9774,6 @@ ] } ], - "SyncTrustedVaultRedoDeviceRegistration": [ - { - "platforms": [ - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SyncTrustedVaultRedoDeviceRegistration" - ] - } - ] - } - ], "SyncTrustedVaultVerifyDeviceRegistration": [ { "platforms": [
diff --git a/third_party/blink/common/interest_group/auction_config.cc b/third_party/blink/common/interest_group/auction_config.cc index 16e0a84..4f213a0 100644 --- a/third_party/blink/common/interest_group/auction_config.cc +++ b/third_party/blink/common/interest_group/auction_config.cc
@@ -6,6 +6,34 @@ namespace blink { +DirectFromSellerSignalsSubresource::DirectFromSellerSignalsSubresource() = + default; +DirectFromSellerSignalsSubresource::DirectFromSellerSignalsSubresource( + const DirectFromSellerSignalsSubresource&) = default; +DirectFromSellerSignalsSubresource::DirectFromSellerSignalsSubresource( + DirectFromSellerSignalsSubresource&&) = default; +DirectFromSellerSignalsSubresource::~DirectFromSellerSignalsSubresource() = + default; + +DirectFromSellerSignalsSubresource& +DirectFromSellerSignalsSubresource::operator=( + const DirectFromSellerSignalsSubresource&) = default; +DirectFromSellerSignalsSubresource& +DirectFromSellerSignalsSubresource::operator=( + DirectFromSellerSignalsSubresource&&) = default; + +DirectFromSellerSignals::DirectFromSellerSignals() = default; +DirectFromSellerSignals::DirectFromSellerSignals( + const DirectFromSellerSignals&) = default; +DirectFromSellerSignals::DirectFromSellerSignals(DirectFromSellerSignals&&) = + default; +DirectFromSellerSignals::~DirectFromSellerSignals() = default; + +DirectFromSellerSignals& DirectFromSellerSignals::operator=( + const DirectFromSellerSignals&) = default; +DirectFromSellerSignals& DirectFromSellerSignals::operator=( + DirectFromSellerSignals&&) = default; + AuctionConfig::NonSharedParams::NonSharedParams() = default; AuctionConfig::NonSharedParams::NonSharedParams(const NonSharedParams&) = default;
diff --git a/third_party/blink/common/interest_group/auction_config_mojom_traits.cc b/third_party/blink/common/interest_group/auction_config_mojom_traits.cc index bfd27636..e59ae5e 100644 --- a/third_party/blink/common/interest_group/auction_config_mojom_traits.cc +++ b/third_party/blink/common/interest_group/auction_config_mojom_traits.cc
@@ -7,9 +7,11 @@ #include <string> #include "base/containers/flat_map.h" +#include "base/strings/escape.h" #include "base/strings/string_util.h" #include "base/time/time.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/common/interest_group/auction_config.h" #include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom.h" #include "url/gurl.h" @@ -41,6 +43,31 @@ } // namespace +bool StructTraits<blink::mojom::DirectFromSellerSignalsSubresourceDataView, + blink::DirectFromSellerSignalsSubresource>:: + Read(blink::mojom::DirectFromSellerSignalsSubresourceDataView data, + blink::DirectFromSellerSignalsSubresource* out) { + if (!data.ReadBundleUrl(&out->bundle_url) || !data.ReadToken(&out->token)) { + return false; + } + + return true; +} + +bool StructTraits<blink::mojom::DirectFromSellerSignalsDataView, + blink::DirectFromSellerSignals>:: + Read(blink::mojom::DirectFromSellerSignalsDataView data, + blink::DirectFromSellerSignals* out) { + if (!data.ReadPrefix(&out->prefix) || + !data.ReadPerBuyerSignals(&out->per_buyer_signals) || + !data.ReadSellerSignals(&out->seller_signals) || + !data.ReadAuctionSignals(&out->auction_signals)) { + return false; + } + + return true; +} + bool StructTraits<blink::mojom::AuctionAdConfigNonSharedParamsDataView, blink::AuctionConfig::NonSharedParams>:: Read(blink::mojom::AuctionAdConfigNonSharedParamsDataView data, @@ -97,6 +124,7 @@ !data.ReadDecisionLogicUrl(&out->decision_logic_url) || !data.ReadTrustedScoringSignalsUrl(&out->trusted_scoring_signals_url) || !data.ReadAuctionAdConfigNonSharedParams(&out->non_shared_params) || + !data.ReadDirectFromSellerSignals(&out->direct_from_seller_signals) || !data.ReadPerBuyerExperimentGroupIds( &out->per_buyer_experiment_group_ids)) { return false; @@ -124,6 +152,47 @@ return false; } + absl::optional<blink::DirectFromSellerSignals> direct_from_seller_signals = + out->direct_from_seller_signals; + if (direct_from_seller_signals) { + const GURL& prefix = direct_from_seller_signals->prefix; + // The prefix can't have a query because the browser process appends its own + // query suffix. + if (prefix.has_query()) + return false; + // NOTE: uuid-in-package isn't supported, since it doesn't support CORS. + if (!IsHttpsAndMatchesOrigin(prefix, out->seller)) + return false; + base::flat_set<url::Origin> interest_group_buyers( + out->non_shared_params.interest_group_buyers + ? *out->non_shared_params.interest_group_buyers + : std::vector<url::Origin>()); + for (const auto& [buyer_origin, bundle_url] : + direct_from_seller_signals->per_buyer_signals) { + // The renderer shouldn't provide bundles for origins that aren't buyers + // in this auction -- there would be no worklet to receive them. + if (interest_group_buyers.count(buyer_origin) < 1) + return false; + // All DirectFromSellerSignals must come from the seller. + if (!IsHttpsAndMatchesOrigin(bundle_url.bundle_url, out->seller)) + return false; + } + if (direct_from_seller_signals->seller_signals && + !IsHttpsAndMatchesOrigin( + direct_from_seller_signals->seller_signals->bundle_url, + out->seller)) { + // All DirectFromSellerSignals must come from the seller. + return false; + } + if (direct_from_seller_signals->auction_signals && + !IsHttpsAndMatchesOrigin( + direct_from_seller_signals->auction_signals->bundle_url, + out->seller)) { + // All DirectFromSellerSignals must come from the seller. + return false; + } + } + return true; }
diff --git a/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc b/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc index 9e4fe8c..95c87f5 100644 --- a/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc +++ b/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc
@@ -5,10 +5,12 @@ #include "third_party/blink/public/common/interest_group/auction_config_mojom_traits.h" #include <string> +#include <tuple> #include <vector> #include "base/containers/flat_map.h" #include "base/time/time.h" +#include "base/unguessable_token.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -19,6 +21,19 @@ namespace blink { +bool operator==(const DirectFromSellerSignalsSubresource& a, + const DirectFromSellerSignalsSubresource& b) { + return std::tie(a.bundle_url, a.token) == std::tie(b.bundle_url, b.token); +} + +bool operator==(const DirectFromSellerSignals& a, + const DirectFromSellerSignals& b) { + return std::tie(a.prefix, a.per_buyer_signals, a.seller_signals, + a.auction_signals) == std::tie(b.prefix, b.per_buyer_signals, + b.seller_signals, + b.auction_signals); +} + bool operator==(const AuctionConfig& a, const AuctionConfig& b); bool operator==(const AuctionConfig::NonSharedParams& a, @@ -37,17 +52,28 @@ bool operator==(const AuctionConfig& a, const AuctionConfig& b) { return std::tie(a.seller, a.decision_logic_url, a.trusted_scoring_signals_url, - a.non_shared_params, a.seller_experiment_group_id, - a.all_buyer_experiment_group_id, + a.non_shared_params, a.direct_from_seller_signals, + a.seller_experiment_group_id, a.all_buyer_experiment_group_id, a.per_buyer_experiment_group_ids) == std::tie(b.seller, b.decision_logic_url, b.trusted_scoring_signals_url, - b.non_shared_params, b.seller_experiment_group_id, - b.all_buyer_experiment_group_id, + b.non_shared_params, b.direct_from_seller_signals, + b.seller_experiment_group_id, b.all_buyer_experiment_group_id, b.per_buyer_experiment_group_ids); } namespace { +constexpr char kSellerOriginStr[] = "https://seller.test"; + +// Cases for direct_from_seller_signals test parameterization. + +constexpr char kPerBuyerSignals[] = "per-buyer-signals"; +constexpr char kSellerSignals[] = "seller-signals"; +constexpr char kAuctionSignals[] = "auction-signals"; + +constexpr char kBundleUrl[] = "bundle-url"; +constexpr char kPrefix[] = "prefix"; + // Creates a minimal valid AuctionConfig, with a seller and the passed in // decision logic URL. Seller is derived from `decision_logic_url`. AuctionConfig CreateBasicConfig( @@ -61,13 +87,14 @@ // Creates an AuctionConfig with all fields except `component_auctions` // populated. AuctionConfig CreateFullConfig() { + const url::Origin seller = url::Origin::Create(GURL(kSellerOriginStr)); AuctionConfig auction_config = CreateBasicConfig(); auction_config.trusted_scoring_signals_url = GURL("https://seller.test/bar"); auction_config.seller_experiment_group_id = 1; auction_config.all_buyer_experiment_group_id = 2; - url::Origin buyer = url::Origin::Create(GURL("https://buyer.test")); + const url::Origin buyer = url::Origin::Create(GURL("https://buyer.test")); auction_config.per_buyer_experiment_group_ids[buyer] = 3; AuctionConfig::NonSharedParams& non_shared_params = @@ -90,6 +117,35 @@ non_shared_params.all_buyers_priority_signals = { {"goats", -1.5}, {"for", 5}, {"sale", 0}}; + DirectFromSellerSignalsSubresource + direct_from_seller_signals_per_buyer_signals_buyer; + direct_from_seller_signals_per_buyer_signals_buyer.bundle_url = + GURL("https://seller.test/bundle"); + direct_from_seller_signals_per_buyer_signals_buyer.token = + base::UnguessableToken::Create(); + + DirectFromSellerSignalsSubresource direct_from_seller_seller_signals; + direct_from_seller_seller_signals.bundle_url = + GURL("https://seller.test/bundle"); + direct_from_seller_seller_signals.token = base::UnguessableToken::Create(); + + DirectFromSellerSignalsSubresource direct_from_seller_auction_signals; + direct_from_seller_auction_signals.bundle_url = + GURL("https://seller.test/bundle"); + direct_from_seller_auction_signals.token = base::UnguessableToken::Create(); + + DirectFromSellerSignals direct_from_seller_signals; + direct_from_seller_signals.prefix = GURL("https://seller.test/json"); + direct_from_seller_signals.per_buyer_signals.insert( + {buyer, std::move(direct_from_seller_signals_per_buyer_signals_buyer)}); + direct_from_seller_signals.seller_signals = + std::move(direct_from_seller_seller_signals); + direct_from_seller_signals.auction_signals = + std::move(direct_from_seller_auction_signals); + + auction_config.direct_from_seller_signals = + std::move(direct_from_seller_signals); + return auction_config; } @@ -226,7 +282,7 @@ EXPECT_TRUE(SerializeAndDeserialize(auction_config)); } -TEST(AuctionConfigMojomTraitsTest, ComponentAuctionSuccessMutipleFull) { +TEST(AuctionConfigMojomTraitsTest, ComponentAuctionSuccessMultipleFull) { AuctionConfig auction_config = CreateFullConfig(); auction_config.non_shared_params.component_auctions.emplace_back( CreateFullConfig()); @@ -235,6 +291,109 @@ EXPECT_TRUE(SerializeAndDeserialize(auction_config)); } +TEST(AuctionConfigMojomTraitsTest, + DirectFromSellerSignalsPrefixWithQueryString) { + AuctionConfig auction_config = CreateFullConfig(); + auction_config.direct_from_seller_signals->prefix = + GURL("https://seller.test/json?queryPart"); + EXPECT_FALSE(SerializeAndDeserialize(auction_config)); +} + +TEST(AuctionConfigMojomTraitsTest, DirectFromSellerSignalsBuyerNotPresent) { + AuctionConfig auction_config = CreateFullConfig(); + DirectFromSellerSignalsSubresource& buyer2_subresource = + auction_config.direct_from_seller_signals + ->per_buyer_signals[url::Origin::Create(GURL("https://buyer2.test"))]; + buyer2_subresource.bundle_url = GURL("https://seller.test/bundle"); + buyer2_subresource.token = base::UnguessableToken::Create(); + EXPECT_FALSE(SerializeAndDeserialize(auction_config)); +} + +TEST(AuctionConfigMojomTraitsTest, + DirectFromSellerSignalsNoDirectFromSellerSignals) { + AuctionConfig auction_config = CreateFullConfig(); + auction_config.direct_from_seller_signals = absl::nullopt; + EXPECT_TRUE(SerializeAndDeserialize(auction_config)); +} + +TEST(AuctionConfigMojomTraitsTest, DirectFromSellerSignalsNoPerBuyerSignals) { + AuctionConfig auction_config = CreateFullConfig(); + auction_config.direct_from_seller_signals->per_buyer_signals.clear(); + EXPECT_TRUE(SerializeAndDeserialize(auction_config)); +} + +TEST(AuctionConfigMojomTraitsTest, DirectFromSellerSignalsNoSellerSignals) { + AuctionConfig auction_config = CreateFullConfig(); + auction_config.direct_from_seller_signals->seller_signals = absl::nullopt; + EXPECT_TRUE(SerializeAndDeserialize(auction_config)); +} + +TEST(AuctionConfigMojomTraitsTest, DirectFromSellerSignalsNoAuctionSignals) { + AuctionConfig auction_config = CreateFullConfig(); + auction_config.direct_from_seller_signals->auction_signals = absl::nullopt; + EXPECT_TRUE(SerializeAndDeserialize(auction_config)); +} + +class AuctionConfigMojomTraitsDirectFromSellerSignalsTest + : public ::testing::TestWithParam<std::tuple<const char*, const char*>> { + public: + GURL& GetMutableURL(AuctionConfig& auction_config) const { + const std::string which_path = WhichPath(); + if (which_path == kPrefix) { + return auction_config.direct_from_seller_signals->prefix; + } else { + EXPECT_EQ(which_path, kBundleUrl); + const std::string which_bundle = WhichBundle(); + if (which_bundle == kPerBuyerSignals) { + return auction_config.direct_from_seller_signals->per_buyer_signals + .at(url::Origin::Create(GURL("https://buyer.test"))) + .bundle_url; + } else if (which_bundle == kSellerSignals) { + return auction_config.direct_from_seller_signals->seller_signals + ->bundle_url; + } else { + EXPECT_EQ(which_bundle, kAuctionSignals); + return auction_config.direct_from_seller_signals->auction_signals + ->bundle_url; + } + } + } + + std::string GetURLPath() const { + const std::string which_path = WhichPath(); + if (which_path == kBundleUrl) { + return "/bundle"; + } else { + EXPECT_EQ(which_path, kPrefix); + return "/json"; + } + } + + private: + std::string WhichBundle() const { return std::get<0>(GetParam()); } + std::string WhichPath() const { return std::get<1>(GetParam()); } +}; + +TEST_P(AuctionConfigMojomTraitsDirectFromSellerSignalsTest, NotHttps) { + AuctionConfig auction_config = CreateFullConfig(); + GetMutableURL(auction_config) = GURL("http://seller.test" + GetURLPath()); + EXPECT_FALSE(SerializeAndDeserialize(auction_config)); +} + +TEST_P(AuctionConfigMojomTraitsDirectFromSellerSignalsTest, WrongOrigin) { + AuctionConfig auction_config = CreateFullConfig(); + GetMutableURL(auction_config) = GURL("https://seller2.test" + GetURLPath()); + EXPECT_FALSE(SerializeAndDeserialize(auction_config)); +} + +INSTANTIATE_TEST_SUITE_P(All, + AuctionConfigMojomTraitsDirectFromSellerSignalsTest, + ::testing::Combine(::testing::Values(kPerBuyerSignals, + kSellerSignals, + kAuctionSignals), + ::testing::Values(kBundleUrl, + kPrefix))); + } // namespace } // namespace blink
diff --git a/third_party/blink/common/messaging/cloneable_message.cc b/third_party/blink/common/messaging/cloneable_message.cc index abbaeb3..10a1d16 100644 --- a/third_party/blink/common/messaging/cloneable_message.cc +++ b/third_party/blink/common/messaging/cloneable_message.cc
@@ -67,6 +67,7 @@ clone.file_system_access_tokens.push_back(std::move(cloned_token)); token = source_token.Unbind(); } + clone.sender_agent_cluster_id = sender_agent_cluster_id; return clone; }
diff --git a/third_party/blink/common/messaging/cloneable_message_mojom_traits.cc b/third_party/blink/common/messaging/cloneable_message_mojom_traits.cc index 8b23444d..dd1ebda 100644 --- a/third_party/blink/common/messaging/cloneable_message_mojom_traits.cc +++ b/third_party/blink/common/messaging/cloneable_message_mojom_traits.cc
@@ -20,9 +20,9 @@ Read(blink::mojom::CloneableMessage::DataView data, blink::CloneableMessage* out) { mojo_base::BigBufferView message_view; - absl::optional<base::UnguessableToken> locked_agent_cluster_id; + base::UnguessableToken sender_agent_cluster_id; if (!data.ReadEncodedMessage(&message_view) || !data.ReadBlobs(&out->blobs) || - !data.ReadLockedAgentClusterId(&locked_agent_cluster_id) || + !data.ReadSenderAgentClusterId(&sender_agent_cluster_id) || !data.ReadSenderOrigin(&out->sender_origin) || !data.ReadFileSystemAccessTokens(&out->file_system_access_tokens)) { return false; @@ -35,7 +35,8 @@ out->stack_trace_debugger_id_first = data.stack_trace_debugger_id_first(); out->stack_trace_debugger_id_second = data.stack_trace_debugger_id_second(); out->stack_trace_should_pause = data.stack_trace_should_pause(); - out->locked_agent_cluster_id = locked_agent_cluster_id; + out->sender_agent_cluster_id = sender_agent_cluster_id; + out->locked_to_sender_agent_cluster = data.locked_to_sender_agent_cluster(); return true; }
diff --git a/third_party/blink/common/messaging/web_message_port.cc b/third_party/blink/common/messaging/web_message_port.cc index 9636278..7368c07 100644 --- a/third_party/blink/common/messaging/web_message_port.cc +++ b/third_party/blink/common/messaging/web_message_port.cc
@@ -124,6 +124,15 @@ return port; } +const base::UnguessableToken& WebMessagePort::GetEmbedderAgentClusterID() { + // This is creating a single agent cluster ID that would represent the + // embedder in MessagePort IPCs. While we could create a new ID on each call, + // providing a consistent one saves RNG work and could be useful in the future + // if we'd want to consistently identify messages from the embedder. + static const auto agent_cluster_id = base::UnguessableToken::Create(); + return agent_cluster_id; +} + WebMessagePort::WebMessagePort(MessagePortDescriptor&& port) : port_(std::move(port)), is_closed_(false), is_transferable_(true) { DCHECK(port_.IsValid()); @@ -157,6 +166,10 @@ transferable_message.ports = blink::MessagePortChannel::CreateFromHandles(std::move(ports)); + // Get the embedder assigned cluster ID, as these messages originate from the + // embedder. + transferable_message.sender_agent_cluster_id = GetEmbedderAgentClusterID(); + // TODO(chrisha): Notify the instrumentation delegate of a message being sent! // Send via Mojo. The message should never be malformed so should always be
diff --git a/third_party/blink/public/common/interest_group/auction_config.h b/third_party/blink/public/common/interest_group/auction_config.h index 4f6edc9..b619251 100644 --- a/third_party/blink/public/common/interest_group/auction_config.h +++ b/third_party/blink/public/common/interest_group/auction_config.h
@@ -13,13 +13,50 @@ #include "base/containers/flat_map.h" #include "base/time/time.h" +#include "base/unguessable_token.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/common/common_export.h" #include "url/gurl.h" #include "url/origin.h" namespace blink { +// Refers to a resource in a subresource bundle. Valid only as long as the +// <script type="webbundle"> tag that owns the subresource exists. +struct BLINK_COMMON_EXPORT DirectFromSellerSignalsSubresource { + DirectFromSellerSignalsSubresource(); + DirectFromSellerSignalsSubresource(const DirectFromSellerSignalsSubresource&); + DirectFromSellerSignalsSubresource(DirectFromSellerSignalsSubresource&&); + ~DirectFromSellerSignalsSubresource(); + + DirectFromSellerSignalsSubresource& operator=( + const DirectFromSellerSignalsSubresource&); + DirectFromSellerSignalsSubresource& operator=( + DirectFromSellerSignalsSubresource&&); + + GURL bundle_url; + base::UnguessableToken token; +}; + +// The set of directFromSellerSignals for a particular auction or component +// auction. +struct BLINK_COMMON_EXPORT DirectFromSellerSignals { + DirectFromSellerSignals(); + DirectFromSellerSignals(const DirectFromSellerSignals&); + DirectFromSellerSignals(DirectFromSellerSignals&&); + ~DirectFromSellerSignals(); + + DirectFromSellerSignals& operator=(const DirectFromSellerSignals&); + DirectFromSellerSignals& operator=(DirectFromSellerSignals&&); + + GURL prefix; + base::flat_map<url::Origin, DirectFromSellerSignalsSubresource> + per_buyer_signals; + absl::optional<DirectFromSellerSignalsSubresource> seller_signals; + absl::optional<DirectFromSellerSignalsSubresource> auction_signals; +}; + // AuctionConfig class used by FLEDGE auctions. Typemapped to // blink::mojom::AuctionAdConfig, primarily so the typemap can include validity // checks on the origins of the provided URLs. Not called blink::AuctionConfig @@ -111,6 +148,10 @@ // Other parameters are grouped in a struct that is passed to SellerWorklets. NonSharedParams non_shared_params; + // Subresource bundle URLs that when fetched should yield a JSON + // direct_from_seller_signals responses for the seller and buyers. + absl::optional<DirectFromSellerSignals> direct_from_seller_signals; + // Identifier for an experiment group, used when getting trusted // signals (and as part of AuctionConfig given to worklets). absl::optional<uint16_t> seller_experiment_group_id;
diff --git a/third_party/blink/public/common/interest_group/auction_config_mojom_traits.h b/third_party/blink/public/common/interest_group/auction_config_mojom_traits.h index 0d7c07a..0f51b00 100644 --- a/third_party/blink/public/common/interest_group/auction_config_mojom_traits.h +++ b/third_party/blink/public/common/interest_group/auction_config_mojom_traits.h
@@ -8,18 +8,78 @@ #include <string> #include <vector> +#include "base/containers/flat_map.h" #include "base/time/time.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/common/interest_group/auction_config.h" -#include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom-forward.h" -#include "url/gurl.h" -#include "url/origin.h" +#include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom-shared.h" + +class GURL; + +namespace url { + +class Origin; + +} // namespace url + +namespace base { + +class UnguessableToken; + +} // namespace base namespace mojo { template <> struct BLINK_COMMON_EXPORT + StructTraits<blink::mojom::DirectFromSellerSignalsSubresourceDataView, + blink::DirectFromSellerSignalsSubresource> { + static const GURL& bundle_url( + const blink::DirectFromSellerSignalsSubresource& params) { + return params.bundle_url; + } + + static const base::UnguessableToken& token( + const blink::DirectFromSellerSignalsSubresource& params) { + return params.token; + } + + static bool Read( + blink::mojom::DirectFromSellerSignalsSubresourceDataView data, + blink::DirectFromSellerSignalsSubresource* out); +}; + +template <> +struct BLINK_COMMON_EXPORT + StructTraits<blink::mojom::DirectFromSellerSignalsDataView, + blink::DirectFromSellerSignals> { + static const GURL& prefix(const blink::DirectFromSellerSignals& params) { + return params.prefix; + } + + static const base::flat_map<url::Origin, + blink::DirectFromSellerSignalsSubresource>& + per_buyer_signals(const blink::DirectFromSellerSignals& params) { + return params.per_buyer_signals; + } + + static const absl::optional<blink::DirectFromSellerSignalsSubresource>& + seller_signals(const blink::DirectFromSellerSignals& params) { + return params.seller_signals; + } + + static const absl::optional<blink::DirectFromSellerSignalsSubresource>& + auction_signals(const blink::DirectFromSellerSignals& params) { + return params.auction_signals; + } + + static bool Read(blink::mojom::DirectFromSellerSignalsDataView data, + blink::DirectFromSellerSignals* out); +}; + +template <> +struct BLINK_COMMON_EXPORT StructTraits<blink::mojom::AuctionAdConfigNonSharedParamsDataView, blink::AuctionConfig::NonSharedParams> { static const absl::optional<std::vector<url::Origin>>& interest_group_buyers( @@ -110,6 +170,11 @@ return config.non_shared_params; } + static const absl::optional<blink::DirectFromSellerSignals>& + direct_from_seller_signals(const blink::AuctionConfig& params) { + return params.direct_from_seller_signals; + } + static bool has_seller_experiment_group_id( const blink::AuctionConfig& config) { return config.seller_experiment_group_id.has_value();
diff --git a/third_party/blink/public/common/messaging/cloneable_message.h b/third_party/blink/public/common/messaging/cloneable_message.h index ec8d584b..d65e35a 100644 --- a/third_party/blink/public/common/messaging/cloneable_message.h +++ b/third_party/blink/public/common/messaging/cloneable_message.h
@@ -64,10 +64,12 @@ int64_t stack_trace_debugger_id_second = 0; bool stack_trace_should_pause = false; - // If not null, this message is locked to the given agent cluster ID. + // The sender's agent cluster ID. // See // https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism - absl::optional<base::UnguessableToken> locked_agent_cluster_id; + base::UnguessableToken sender_agent_cluster_id; + // If true, this message is locked to the sender agent cluster ID. + bool locked_to_sender_agent_cluster = false; // Tokens required to clone FileSystemFileHandles and/or // FileSystemDirectoryHandles.
diff --git a/third_party/blink/public/common/messaging/cloneable_message_mojom_traits.h b/third_party/blink/public/common/messaging/cloneable_message_mojom_traits.h index c6f90dd..0b02f2e3 100644 --- a/third_party/blink/public/common/messaging/cloneable_message_mojom_traits.h +++ b/third_party/blink/public/common/messaging/cloneable_message_mojom_traits.h
@@ -49,9 +49,14 @@ return input.stack_trace_should_pause; } - static const absl::optional<base::UnguessableToken>& locked_agent_cluster_id( + static const base::UnguessableToken& sender_agent_cluster_id( const blink::CloneableMessage& input) { - return input.locked_agent_cluster_id; + return input.sender_agent_cluster_id; + } + + static bool locked_to_sender_agent_cluster( + const blink::CloneableMessage& input) { + return input.locked_to_sender_agent_cluster; } static bool Read(blink::mojom::CloneableMessage::DataView data,
diff --git a/third_party/blink/public/common/messaging/web_message_port.h b/third_party/blink/public/common/messaging/web_message_port.h index 254698d7..3b366930 100644 --- a/third_party/blink/public/common/messaging/web_message_port.h +++ b/third_party/blink/public/common/messaging/web_message_port.h
@@ -157,6 +157,10 @@ // false). This can only be called if "is_transferable()" returns true. MessagePortDescriptor PassPort(); + // Maintains a static agent cluster ID that is used as the cluster ID in + // casees where the embedder is the one calling PostMessage. + static const base::UnguessableToken& GetEmbedderAgentClusterID(); + private: // Creates a message port that wraps the provided |port|. This provided |port| // must be valid. This is private as it should only be called by message
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 076e485..9c315a8c 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -522,6 +522,26 @@ { types = [ { + mojom = "blink.mojom.DirectFromSellerSignalsSubresource" + cpp = "::blink::DirectFromSellerSignalsSubresource" + }, + ] + traits_headers = [ "//third_party/blink/public/common/interest_group/auction_config_mojom_traits.h" ] + traits_public_deps = [ "//url/mojom:mojom_traits" ] + }, + { + types = [ + { + mojom = "blink.mojom.DirectFromSellerSignals" + cpp = "::blink::DirectFromSellerSignals" + }, + ] + traits_headers = [ "//third_party/blink/public/common/interest_group/auction_config_mojom_traits.h" ] + traits_public_deps = [ "//url/mojom:mojom_traits" ] + }, + { + types = [ + { mojom = "blink.mojom.AuctionAdConfigNonSharedParams" cpp = "::blink::AuctionConfig::NonSharedParams" },
diff --git a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom index f1032f8..1dcc3a7 100644 --- a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom +++ b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
@@ -5,6 +5,7 @@ module blink.mojom; import "mojo/public/mojom/base/time.mojom"; +import "mojo/public/mojom/base/unguessable_token.mojom"; import "url/mojom/origin.mojom"; import "url/mojom/url.mojom"; @@ -86,10 +87,99 @@ array<InterestGroupAd>? ad_components; }; +// Packages the details necessary for the browser process to retrieve a +// DirectFromSellerSignals resource of a subresource bundle -- the actual +// subresource URL is constructed by the browser process from the +// DirectFromSellerSignals `prefix` and the browser supplied suffix, as +// described in DirectFromSellerSignals. +// +// To fetch a subresource bundle URL from the browser process, the `bundle_url`, +// subresource URL (constructed from the prefix + suffix), token, and renderer +// process ID are needed. +// +// The resource is only available while the <script type="webbundle"> tag that +// declared the resource is still alive. +// +// TODO(crbug.com/1355887): Consider adding a mechanism to extend the lifetime +// of the subresource for the duration of the auction. +struct DirectFromSellerSignalsSubresource { + // URL of the bundle (.wbn / "application/webbundle") file. + url.mojom.Url bundle_url; + + // The UnguessableToken for this subresource, stored in the renderer's + // ResourceFetcher. + // + // TODO(crbug.com/1364649): Change to use a base::TokenType specialization + // along with other web / subresource bundle uses of UnguessableToken. + mojo_base.mojom.UnguessableToken token; +}; + +// Signals to be loaded from resources in subresource bundle(s). Like +// `seller_signals`, `per_buyer_signals`, and `auction_signals` in +// AuctionAdConfigNonSharedParams, but the signals' contents are not revealed +// to the renderer process. +// +// The page specifies a URL prefix, and the subresource URLs of signals destined +// for particular origins are formed by concatenating a suffix (as described in +// field comments) to the prefix -- since the browser process is doing the +// concatenation, it can ensure that each signal is only given to the recipient +// intended by the seller. +// +// All subresource URLs must resolve to a valid application/json string. The +// origin of the prefix and the URL of each source bundle must have a scheme of +// https (uuid-in-package isn't supported since it doesn't support CORS), and +// each origin must match `seller` in AuctionAdConfig. The response must be +// served with the headers `X-FLEDGE-Auction-Only: true` and `X-Allow-Fledge: +// true`. The request is made with CORS, using the caller of runAdAuction()'s +// frame as the initiator. +// +// The worklet process will parse the signals object and deliver it to worklet +// functions (generateBid(), scoreAd(), reportWin(), reportResult()). +// +// https://github.com/WICG/turtledove/blob/main/FLEDGE.md#25-additional-trusted-signals-directfromsellersignals +struct DirectFromSellerSignals { + // The prefix specified by the page. Must have no query string. + url.mojom.Url prefix; + + // DirectFromSellerSignals for individual buyers. Keys determine the buyer + // that should receive the signals loaded via the + // DirectFromSellerSignalsSubresource value. The subresource URL should be: + // + // prefix + "?perBuyerSignals=" + encodeURIComponent(buyer_origin_key) + // + // where encodeURIComponent() is a function equivalent to the JavaScript + // built-in function encodeURIComponent(), and buyer_origin_key is the buyer's + // origin (and also the map key for the particular + // DirectFromSellerSignalsSubresource). + // + // It's possible that not every buyer origin from `interest_group_buyers` is + // present, or that any buyer is present -- only those subresource URLs that + // are in the `interest_group_buyers` and have been declared in a + // <script type="webbundle"> tag will be included. + map<url.mojom.Origin, DirectFromSellerSignalsSubresource> per_buyer_signals; + + // directFromSellerSignals for the seller. The subresource URL should be: + // + // prefix + "?sellerSignals" + // + // iff such a subresource is declared in a <script type="webbundle"> tag. + DirectFromSellerSignalsSubresource? seller_signals; + + // Signals that are delivered to all parties -- the seller, and all buyers. + // The subresource URL should be: + // + // prefix + "?auctionSignals" + // + // iff such a subresource is declared in a <script type="webbundle"> tag. + DirectFromSellerSignalsSubresource? auction_signals; +}; + // Subset of AuctionAdConfig that is not shared by all auctions that are // using the same SellerWorklet object (so it's "not shared" between // AuctionConfigs that share the same SellerWorklet). Other AuctionAdConfig -// parameters all must be the same for two auctions to share a Sellerworklet. +// parameters all must be the same for two auctions to share a Sellerworklet, or +// otherwise be parameters that don't need to be resent to each seller worklet +// method invocation. struct AuctionAdConfigNonSharedParams { // Owners of interest groups allowed to participate in the auction. // Must all be HTTPS. @@ -173,6 +263,12 @@ // Other parameters are grouped in a struct that is passed to SellerWorklets. AuctionAdConfigNonSharedParams auction_ad_config_non_shared_params; + // DirectFromSellerSignals to be loaded from resources in subresource + // bundle(s). Like `seller_signals`,`per_buyer_signals`, and + // `auction_signals`, but the signals' contents are not revealed to the + // renderer process. See details in the DirectFromSellerSignals comment. + DirectFromSellerSignals? direct_from_seller_signals; + // Optional identifier for an experiment group, used when getting trusted // signals (and as part of AuctionConfig given to worklets). // TODO(https://crbug.com/657632): Update when optional integers supported.
diff --git a/third_party/blink/public/mojom/messaging/cloneable_message.mojom b/third_party/blink/public/mojom/messaging/cloneable_message.mojom index f96d40f..8efa3dc 100644 --- a/third_party/blink/public/mojom/messaging/cloneable_message.mojom +++ b/third_party/blink/public/mojom/messaging/cloneable_message.mojom
@@ -36,9 +36,11 @@ int64 stack_trace_debugger_id_first; int64 stack_trace_debugger_id_second; bool stack_trace_should_pause; - // If not null, this message is locked to the given agent cluster ID. + // The sender's agent cluster ID. // See https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism - mojo_base.mojom.UnguessableToken? locked_agent_cluster_id; + mojo_base.mojom.UnguessableToken sender_agent_cluster_id; + // If true, this message is locked to the sender agent cluster ID. + bool locked_to_sender_agent_cluster; // Tokens required to clone FileSystemFileHandles and/or // FileSystemDirectoryHandles. array<pending_remote<FileSystemAccessTransferToken>> file_system_access_tokens;
diff --git a/third_party/blink/public/web/web_dom_message_event.h b/third_party/blink/public/web/web_dom_message_event.h index 35c2a4b..9b5f155 100644 --- a/third_party/blink/public/web/web_dom_message_event.h +++ b/third_party/blink/public/web/web_dom_message_event.h
@@ -63,19 +63,9 @@ WebString Origin() const; - absl::optional<base::UnguessableToken> locked_agent_cluster_id() const { - return locked_agent_cluster_id_; - } - #if INSIDE_BLINK - explicit WebDOMMessageEvent( - MessageEvent* e, - absl::optional<base::UnguessableToken> locked_agent_cluster_id) - : WebDOMEvent(e), locked_agent_cluster_id_(locked_agent_cluster_id) {} + explicit WebDOMMessageEvent(MessageEvent* e) : WebDOMEvent(e) {} #endif - - private: - absl::optional<base::UnguessableToken> locked_agent_cluster_id_; }; } // namespace blink
diff --git a/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl b/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl index db95081..370b6cb 100644 --- a/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl +++ b/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl
@@ -324,7 +324,7 @@ return; CounterDirectiveMap& map = state.Style()->AccessCounterDirectives(); - DCHECK(!parent_map->IsEmpty()); + DCHECK(!parent_map->empty()); typedef CounterDirectiveMap::const_iterator Iterator; Iterator end = parent_map->end(); @@ -359,7 +359,7 @@ directives.SetSetValue(counter_value); {% endif %} } - DCHECK(!map.IsEmpty()); + DCHECK(!map.empty()); {% endcall %} {% elif property.style_builder_template == 'grid' %} {% set type = property.style_builder_template_args['type'] %}
diff --git a/third_party/blink/renderer/build/scripts/templates/policy_helper.cc.tmpl b/third_party/blink/renderer/build/scripts/templates/policy_helper.cc.tmpl index f2b69d5e..a8766f7 100644 --- a/third_party/blink/renderer/build/scripts/templates/policy_helper.cc.tmpl +++ b/third_party/blink/renderer/build/scripts/templates/policy_helper.cc.tmpl
@@ -32,7 +32,7 @@ // this scenario). const FeatureNameMap& GetDefaultFeatureNameMap() { DEFINE_STATIC_LOCAL(FeatureNameMap, default_feature_name_map, ()); - if (default_feature_name_map.IsEmpty()) { + if (default_feature_name_map.empty()) { {% for feature in permissions_policy_features %} {% if not feature.depends_on or feature.name in pp_origin_trial_dependency_map %} default_feature_name_map.Set(k{{feature.name}}PolicyName, @@ -65,7 +65,7 @@ const DocumentPolicyFeatureSet& GetAvailableDocumentPolicyFeatures() { DocumentPolicyFeatureSet& features = GetAvailableDocumentPolicyFeaturesInternal(); - if (features.IsEmpty()) { + if (features.empty()) { {% for feature in document_policy_features %} {% if not feature.depends_on or feature.name in dp_origin_trial_dependency_map %} features.insert(mojom::DocumentPolicyFeature::k{{feature.name}});
diff --git a/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent_test.cc b/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent_test.cc index da4993f..af0315f 100644 --- a/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent_test.cc +++ b/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent_test.cc
@@ -35,7 +35,7 @@ EXPECT_EQ(1u, cache->ActiveEventIntents().size()); } - EXPECT_TRUE(cache->ActiveEventIntents().IsEmpty()); + EXPECT_TRUE(cache->ActiveEventIntents().empty()); } TEST_F(ScopedBlinkAXEventIntentTest, MultipleIdenticalIntents) { @@ -60,7 +60,7 @@ EXPECT_EQ(1u, cache->ActiveEventIntents().size()); } - EXPECT_TRUE(cache->ActiveEventIntents().IsEmpty()); + EXPECT_TRUE(cache->ActiveEventIntents().empty()); } TEST_F(ScopedBlinkAXEventIntentTest, NestedIndividualIntents) { @@ -98,7 +98,7 @@ EXPECT_EQ(1u, cache->ActiveEventIntents().size()); } - EXPECT_TRUE(cache->ActiveEventIntents().IsEmpty()); + EXPECT_TRUE(cache->ActiveEventIntents().empty()); } TEST_F(ScopedBlinkAXEventIntentTest, NestedMultipleIntents) { @@ -152,7 +152,7 @@ EXPECT_EQ(2u, cache->ActiveEventIntents().size()); } - EXPECT_TRUE(cache->ActiveEventIntents().IsEmpty()); + EXPECT_TRUE(cache->ActiveEventIntents().empty()); } TEST_F(ScopedBlinkAXEventIntentTest, NestedIdenticalIntents) { @@ -187,7 +187,7 @@ EXPECT_EQ(1u, cache->ActiveEventIntents().size()); } - EXPECT_TRUE(cache->ActiveEventIntents().IsEmpty()); + EXPECT_TRUE(cache->ActiveEventIntents().empty()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/animation_input_helpers.cc b/third_party/blink/renderer/core/animation/animation_input_helpers.cc index f4c7935..5aa4e71d 100644 --- a/third_party/blink/renderer/core/animation/animation_input_helpers.cc +++ b/third_party/blink/renderer/core/animation/animation_input_helpers.cc
@@ -101,7 +101,7 @@ const AttributeNameMap& GetSupportedAttributes() { DEFINE_STATIC_LOCAL(AttributeNameMap, supported_attributes, ()); - if (supported_attributes.IsEmpty()) { + if (supported_attributes.empty()) { // Fill the set for the first use. // Animatable attributes from http://www.w3.org/TR/SVG/attindex.html const QualifiedName* attributes[] = {
diff --git a/third_party/blink/renderer/core/animation/animation_test.cc b/third_party/blink/renderer/core/animation/animation_test.cc index a2665b9..6ae7929d 100644 --- a/third_party/blink/renderer/core/animation/animation_test.cc +++ b/third_party/blink/renderer/core/animation/animation_test.cc
@@ -1177,7 +1177,7 @@ 1U, element->GetElementAnimations()->Animations().find(animation)->value); ThreadState::Current()->CollectAllGarbageForTesting(); - EXPECT_TRUE(element->GetElementAnimations()->Animations().IsEmpty()); + EXPECT_TRUE(element->GetElementAnimations()->Animations().empty()); } TEST_P(AnimationAnimationTestNoCompositing, HasLowerCompositeOrdering) {
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.cc b/third_party/blink/renderer/core/animation/animation_timeline.cc index 03b660f..1b8285cc 100644 --- a/third_party/blink/renderer/core/animation/animation_timeline.cc +++ b/third_party/blink/renderer/core/animation/animation_timeline.cc
@@ -97,10 +97,10 @@ // We allow |last_current_phase_and_time_| to advance here when there // are no animations to allow animations spawned during style // recalc to not invalidate this flag. - if (animations_needing_update_.IsEmpty()) + if (animations_needing_update_.empty()) last_current_phase_and_time_ = current_phase_and_time; - return !animations_needing_update_.IsEmpty(); + return !animations_needing_update_.empty(); } void AnimationTimeline::ServiceAnimations(TimingUpdateReason reason) {
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.h b/third_party/blink/renderer/core/animation/animation_timeline.h index 2a7ab31..701aae43 100644 --- a/third_party/blink/renderer/core/animation/animation_timeline.h +++ b/third_party/blink/renderer/core/animation/animation_timeline.h
@@ -86,7 +86,7 @@ Animation* Play(AnimationEffect*, ExceptionState& = ASSERT_NO_EXCEPTION); virtual bool NeedsAnimationTimingUpdate(); - virtual bool HasAnimations() const { return !animations_.IsEmpty(); } + virtual bool HasAnimations() const { return !animations_.empty(); } virtual bool HasOutdatedAnimation() const { return outdated_animation_count_ > 0; }
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index 089b348..07f1edf7 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -868,7 +868,7 @@ compositor_timing, animation_playback_rate); PropertyHandleSet properties = effect.Properties(); - DCHECK(!properties.IsEmpty()); + DCHECK(!properties.empty()); for (const auto& property : properties) { // If the animation duration is infinite, it doesn't make sense to scale // the keyframe offset, so use a scale of 1.0. This is connected to @@ -1038,7 +1038,7 @@ FailureReasons reasons = kNoFailure; if (svg_element.HasNonCSSPropertyAnimations()) reasons |= kTargetHasIncompatibleAnimations; - if (!svg_element.InstancesForElement().IsEmpty()) { + if (!svg_element.InstancesForElement().empty()) { // TODO(crbug.com/785246): Currently when an SVGElement has svg:use // instances, each instance gets style from the original element, using // the original element's animation (thus the animation affects
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index f45be5b..02f1bc3d 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -1296,7 +1296,7 @@ EXPECT_EQ(CheckCanStartEffectOnCompositor(timing_, *inline_.Get(), animation1, *effect1, &unsupported_properties1), CompositorAnimations::kNoFailure); - EXPECT_TRUE(unsupported_properties1.IsEmpty()); + EXPECT_TRUE(unsupported_properties1.empty()); StringKeyframeEffectModel* effect2 = CreateKeyframeEffectModel( CreateReplaceOpKeyframe(CSSPropertyID::kHeight, "100px", 0), @@ -2027,7 +2027,7 @@ // ElementAnimations on the element. SimulateFrame(1.); ThreadState::Current()->CollectAllGarbageForTesting(); - EXPECT_TRUE(element_->GetElementAnimations()->Animations().IsEmpty()); + EXPECT_TRUE(element_->GetElementAnimations()->Animations().empty()); } namespace {
diff --git a/third_party/blink/renderer/core/animation/css/css_animation_update.h b/third_party/blink/renderer/core/animation/css/css_animation_update.h index b529907..0b82551 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation_update.h +++ b/third_party/blink/renderer/core/animation/css/css_animation_update.h
@@ -264,13 +264,12 @@ bool HasUpdates() const { return !new_animations_.empty() || !cancelled_animation_indices_.empty() || - !suppressed_animations_.IsEmpty() || + !suppressed_animations_.empty() || !animation_indices_with_pause_toggled_.empty() || - !animations_with_updates_.empty() || !new_transitions_.IsEmpty() || - !cancelled_transitions_.IsEmpty() || - !finished_transitions_.IsEmpty() || + !animations_with_updates_.empty() || !new_transitions_.empty() || + !cancelled_transitions_.empty() || !finished_transitions_.empty() || !updated_compositor_keyframes_.empty() || scroll_timeline_changed_ || - !changed_view_timelines_.IsEmpty(); + !changed_view_timelines_.empty(); } void Trace(Visitor* visitor) const { @@ -287,8 +286,8 @@ private: bool HasActiveInterpolations() const { - return !active_interpolations_for_animations_.IsEmpty() || - !active_interpolations_for_transitions_.IsEmpty(); + return !active_interpolations_for_animations_.empty() || + !active_interpolations_for_transitions_.empty(); } // Order is significant since it defines the order in which new animations
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index 43c31e1..656d660 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -1406,7 +1406,7 @@ HashSet<PropertyHandle> suppressed_transitions; - if (!pending_update_.NewTransitions().IsEmpty()) { + if (!pending_update_.NewTransitions().empty()) { element->GetDocument() .GetDocumentAnimations() .IncrementTrasitionGeneration(); @@ -1462,7 +1462,7 @@ ElementAnimations* element_animations, CSSAnimationUpdate& update) { HeapHashSet<Member<const Animation>> cancelled_transitions; - if (!update.CancelledTransitions().IsEmpty()) { + if (!update.CancelledTransitions().empty()) { DCHECK(element_animations); const TransitionMap& transition_map = element_animations->CssAnimations().transitions_; @@ -1969,8 +1969,7 @@ EffectStack* effect_stack = element_animations ? &element_animations->GetEffectStack() : nullptr; - if (update.NewAnimations().empty() && - update.SuppressedAnimations().IsEmpty()) { + if (update.NewAnimations().empty() && update.SuppressedAnimations().empty()) { AdoptActiveAnimationInterpolations(effect_stack, update, nullptr, nullptr); return; } @@ -1996,8 +1995,8 @@ element_animations ? &element_animations->GetEffectStack() : nullptr; ActiveInterpolationsMap active_interpolations_for_transitions; - if (update.NewTransitions().IsEmpty() && - update.CancelledTransitions().IsEmpty()) { + if (update.NewTransitions().empty() && + update.CancelledTransitions().empty()) { active_interpolations_for_transitions = EffectStack::ActiveInterpolations( effect_stack, nullptr, nullptr, KeyframeEffect::kTransitionPriority, IsCSSPropertyHandle); @@ -2018,8 +2017,7 @@ update.ActiveInterpolationsForAnimations(); // Properties being animated by animations don't get values from transitions // applied. - if (!animations.IsEmpty() && - !active_interpolations_for_transitions.IsEmpty()) { + if (!animations.empty() && !active_interpolations_for_transitions.empty()) { for (const auto& entry : animations) active_interpolations_for_transitions.erase(entry.key); }
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.h b/third_party/blink/renderer/core/animation/css/css_animations.h index 9fdcf72..6d4968e6 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.h +++ b/third_party/blink/renderer/core/animation/css/css_animations.h
@@ -122,10 +122,10 @@ void ClearPendingUpdate() { pending_update_.Clear(); } void MaybeApplyPendingUpdate(Element*); bool HasPreviousActiveInterpolationsForAnimations() const { - return !previous_active_interpolations_for_animations_.IsEmpty(); + return !previous_active_interpolations_for_animations_.empty(); } bool IsEmpty() const { - return running_animations_.empty() && transitions_.IsEmpty() && + return running_animations_.empty() && transitions_.empty() && pending_update_.IsEmpty(); } bool HasTimelines() const { return !timeline_data_.IsEmpty(); } @@ -199,7 +199,7 @@ } bool IsEmpty() const { - return !scroll_timeline_ && view_timelines_.IsEmpty(); + return !scroll_timeline_ && view_timelines_.empty(); } void Clear() { scroll_timeline_ = nullptr;
diff --git a/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc b/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc index 57d2884..57db9e5 100644 --- a/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc +++ b/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc
@@ -190,7 +190,7 @@ )HTML"); ASSERT_TRUE( - GetDocumentAnimations().GetUnvalidatedTimelinesForTesting().IsEmpty()); + GetDocumentAnimations().GetUnvalidatedTimelinesForTesting().empty()); Element* element = MakeGarbageCollected<HTMLDivElement>(GetDocument()); element->setAttribute(blink::html_names::kIdAttr, "element");
diff --git a/third_party/blink/renderer/core/animation/document_timeline.h b/third_party/blink/renderer/core/animation/document_timeline.h index 56879b8..8b59df6 100644 --- a/third_party/blink/renderer/core/animation/document_timeline.h +++ b/third_party/blink/renderer/core/animation/document_timeline.h
@@ -72,9 +72,7 @@ bool IsActive() const override; absl::optional<base::TimeDelta> InitialStartTimeForAnimations() override; - bool HasPendingUpdates() const { - return !animations_needing_update_.IsEmpty(); - } + bool HasPendingUpdates() const { return !animations_needing_update_.empty(); } // The zero time of DocumentTimeline is computed by adding a separate // |origin_time_| from DocumentTimelineOptions.
diff --git a/third_party/blink/renderer/core/animation/effect_stack_test.cc b/third_party/blink/renderer/core/animation/effect_stack_test.cc index e20b918..05bc6b48 100644 --- a/third_party/blink/renderer/core/animation/effect_stack_test.cc +++ b/third_party/blink/renderer/core/animation/effect_stack_test.cc
@@ -300,7 +300,7 @@ EXPECT_TRUE( effect_stack.AffectedProperties(KeyframeEffect::kTransitionPriority) - .IsEmpty()); + .empty()); auto set = effect_stack.AffectedProperties(KeyframeEffect::kDefaultPriority); ASSERT_EQ(3u, set.size()); @@ -323,7 +323,7 @@ body->GetElementAnimations()->GetEffectStack(); EXPECT_TRUE(effect_stack.AffectedProperties(KeyframeEffect::kDefaultPriority) - .IsEmpty()); + .empty()); auto set = effect_stack.AffectedProperties(KeyframeEffect::kTransitionPriority);
diff --git a/third_party/blink/renderer/core/animation/element_animations.h b/third_party/blink/renderer/core/animation/element_animations.h index 26f5afc..bd898c95 100644 --- a/third_party/blink/renderer/core/animation/element_animations.h +++ b/third_party/blink/renderer/core/animation/element_animations.h
@@ -98,7 +98,7 @@ bool IsEmpty() const { return effect_stack_.IsEmpty() && css_animations_.IsEmpty() && - animations_.IsEmpty() && worklet_animations_.IsEmpty(); + animations_.empty() && worklet_animations_.empty(); } void RestartAnimationOnCompositor();
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc index 4b8226b..952c24d 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -333,7 +333,7 @@ // There would be no reason to composite an effect that has no keyframes; it // has no visual result. - if (model_->Properties().IsEmpty()) + if (model_->Properties().empty()) reasons |= CompositorAnimations::kInvalidAnimationOrEffect; // There would be no reason to composite an effect that has no target; it has
diff --git a/third_party/blink/renderer/core/animation/worklet_animation_controller.cc b/third_party/blink/renderer/core/animation/worklet_animation_controller.cc index 1759cc5..d6aa6e7 100644 --- a/third_party/blink/renderer/core/animation/worklet_animation_controller.cc +++ b/third_party/blink/renderer/core/animation/worklet_animation_controller.cc
@@ -64,7 +64,7 @@ if (animation->IsActiveAnimation()) animations_.insert(GetId(*animation), animation); } - if (!animations_.IsEmpty() && document_->View()) + if (!animations_.empty() && document_->View()) document_->View()->ScheduleAnimation(); }
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.cc b/third_party/blink/renderer/core/clipboard/system_clipboard.cc index 9037f6f..5d30e13 100644 --- a/third_party/blink/renderer/core/clipboard/system_clipboard.cc +++ b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
@@ -306,7 +306,7 @@ } } } - if (!custom_data.IsEmpty()) { + if (!custom_data.empty()) { clipboard_->WriteCustomData(std::move(custom_data)); } }
diff --git a/third_party/blink/renderer/core/content_capture/task_session.cc b/third_party/blink/renderer/core/content_capture/task_session.cc index 7b89975..a86c4c6 100644 --- a/third_party/blink/renderer/core/content_capture/task_session.cc +++ b/third_party/blink/renderer/core/content_capture/task_session.cc
@@ -47,7 +47,7 @@ } ContentHolder* TaskSession::DocumentSession::GetNextUnsentNode() { - while (!captured_content_.IsEmpty()) { + while (!captured_content_.empty()) { auto node = captured_content_.begin()->key; const gfx::Rect rect = captured_content_.Take(node); if (node && node->GetLayoutObject() && !sent_nodes_.Contains(node)) { @@ -60,7 +60,7 @@ } ContentHolder* TaskSession::DocumentSession::GetNextChangedNode() { - while (!changed_content_.IsEmpty()) { + while (!changed_content_.empty()) { auto node = changed_content_.begin()->key; const gfx::Rect rect = changed_content_.Take(node); if (node.Get() && node->GetLayoutObject()) {
diff --git a/third_party/blink/renderer/core/content_capture/task_session.h b/third_party/blink/renderer/core/content_capture/task_session.h index 7bb1f28..71ca0aa 100644 --- a/third_party/blink/renderer/core/content_capture/task_session.h +++ b/third_party/blink/renderer/core/content_capture/task_session.h
@@ -66,10 +66,8 @@ return HasUnsentCapturedContent() || HasUnsentChangedContent() || HasUnsentDetachedNodes(); } - bool HasUnsentCapturedContent() const { - return !captured_content_.IsEmpty(); - } - bool HasUnsentChangedContent() const { return !changed_content_.IsEmpty(); } + bool HasUnsentCapturedContent() const { return !captured_content_.empty(); } + bool HasUnsentChangedContent() const { return !changed_content_.empty(); } bool HasUnsentDetachedNodes() const { return !detached_nodes_.empty(); } WebVector<int64_t> MoveDetachedNodes(); const Document* GetDocument() const { return document_; }
diff --git a/third_party/blink/renderer/core/css/active_style_sheets.cc b/third_party/blink/renderer/core/css/active_style_sheets.cc index c3efd1f..9257d7c 100644 --- a/third_party/blink/renderer/core/css/active_style_sheets.cc +++ b/third_party/blink/renderer/core/css/active_style_sheets.cc
@@ -49,7 +49,7 @@ // The old stylesheet vector is a prefix of the new vector in terms of // StyleSheets. If none of the RuleSets changed, we only need to add the new // sheets to the ScopedStyleResolver (ActiveSheetsAppended). - bool rule_sets_changed_in_common_prefix = !changed_rule_sets.IsEmpty(); + bool rule_sets_changed_in_common_prefix = !changed_rule_sets.empty(); for (; index < new_style_sheet_count; index++) { if (new_style_sheets[index].second) changed_rule_sets.insert(new_style_sheets[index].second); @@ -58,7 +58,7 @@ } if (rule_sets_changed_in_common_prefix) return kActiveSheetsChanged; - if (changed_rule_sets.IsEmpty() && !adds_non_matching_mq) + if (changed_rule_sets.empty() && !adds_non_matching_mq) return kNoActiveSheetsChanged; return kActiveSheetsAppended; } @@ -71,7 +71,7 @@ else if (old_style_sheets[index].first->HasMediaQueryResults()) adds_non_matching_mq = true; } - return changed_rule_sets.IsEmpty() && !adds_non_matching_mq + return changed_rule_sets.empty() && !adds_non_matching_mq ? kNoActiveSheetsChanged : kActiveSheetsChanged; } @@ -119,7 +119,7 @@ if (sheet2.second) changed_rule_sets.insert(sheet2.second); } - return changed_rule_sets.IsEmpty() && !adds_non_matching_mq + return changed_rule_sets.empty() && !adds_non_matching_mq ? kNoActiveSheetsChanged : kActiveSheetsChanged; }
diff --git a/third_party/blink/renderer/core/css/css_crossfade_value.h b/third_party/blink/renderer/core/css/css_crossfade_value.h index afccbc7..c15a7b4 100644 --- a/third_party/blink/renderer/core/css/css_crossfade_value.h +++ b/third_party/blink/renderer/core/css/css_crossfade_value.h
@@ -48,7 +48,7 @@ CSSValue& To() const { return *to_value_; } CSSPrimitiveValue& Percentage() const { return *percentage_value_; } - bool HasClients() const { return !Clients().IsEmpty(); } + bool HasClients() const { return !Clients().empty(); } ImageResourceObserver* GetObserverProxy(); String CustomCSSText() const;
diff --git a/third_party/blink/renderer/core/css/css_font_face.cc b/third_party/blink/renderer/core/css/css_font_face.cc index 91a3bdb..4593925b 100644 --- a/third_party/blink/renderer/core/css/css_font_face.cc +++ b/third_party/blink/renderer/core/css/css_font_face.cc
@@ -89,7 +89,7 @@ } size_t CSSFontFace::ApproximateBlankCharacterCount() const { - if (sources_.IsEmpty() || !sources_.front()->IsInBlockPeriod()) + if (sources_.empty() || !sources_.front()->IsInBlockPeriod()) return 0; size_t approximate_character_count_ = 0; for (CSSSegmentedFontFace* segmented_font_face : segmented_font_faces_) { @@ -123,7 +123,7 @@ // https://www.w3.org/TR/css-fonts-4/#src-desc // "When a font is needed the user agent iterates over the set of references // listed, using the first one it can successfully activate." - while (!sources_.IsEmpty()) { + while (!sources_.empty()) { Member<CSSFontFaceSource>& source = sources_.front(); // Bail out if the first source is in the Failure period, causing fallback @@ -199,7 +199,7 @@ SetLoadStatus(FontFace::kLoading); DCHECK_EQ(LoadStatus(), FontFace::kLoading); - while (!sources_.IsEmpty()) { + while (!sources_.empty()) { Member<CSSFontFaceSource>& source = sources_.front(); if (source->IsValid()) { if (source->IsLocalNonBlocking()) { @@ -227,7 +227,7 @@ else font_face_->SetLoadStatus(new_status); - if (segmented_font_faces_.IsEmpty() || !font_face_->GetExecutionContext()) + if (segmented_font_faces_.empty() || !font_face_->GetExecutionContext()) return; if (auto* window =
diff --git a/third_party/blink/renderer/core/css/css_font_face.h b/third_party/blink/renderer/core/css/css_font_face.h index 97924a85..f573079 100644 --- a/third_party/blink/renderer/core/css/css_font_face.h +++ b/third_party/blink/renderer/core/css/css_font_face.h
@@ -58,7 +58,7 @@ // Front source is the first successfully loaded source. const CSSFontFaceSource* FrontSource() const { - return sources_.IsEmpty() ? nullptr : sources_.front(); + return sources_.empty() ? nullptr : sources_.front(); } FontFace* GetFontFace() const { return font_face_; } @@ -67,7 +67,7 @@ void AddSegmentedFontFace(CSSSegmentedFontFace*); void RemoveSegmentedFontFace(CSSSegmentedFontFace*); - bool IsValid() const { return !sources_.IsEmpty(); } + bool IsValid() const { return !sources_.empty(); } size_t ApproximateBlankCharacterCount() const; void AddSource(CSSFontFaceSource*);
diff --git a/third_party/blink/renderer/core/css/css_font_face_source.cc b/third_party/blink/renderer/core/css/css_font_face_source.cc index d9a55d86..0f99ef4 100644 --- a/third_party/blink/renderer/core/css/css_font_face_source.cc +++ b/third_party/blink/renderer/core/css/css_font_face_source.cc
@@ -100,7 +100,7 @@ void CSSFontFaceSource::PruneTable() { AutoLockForParallelTextShaping guard(lock_); - if (font_data_table_.IsEmpty()) + if (font_data_table_.empty()) return; for (const auto& item : font_data_table_) {
diff --git a/third_party/blink/renderer/core/css/css_image_generator_value.cc b/third_party/blink/renderer/core/css/css_image_generator_value.cc index 524fa57..3619b21 100644 --- a/third_party/blink/renderer/core/css/css_image_generator_value.cc +++ b/third_party/blink/renderer/core/css/css_image_generator_value.cc
@@ -75,7 +75,7 @@ void CSSImageGeneratorValue::AddClient(const ImageResourceObserver* client) { DCHECK(client); - if (clients_.IsEmpty()) { + if (clients_.empty()) { DCHECK(!keep_alive_); keep_alive_ = this; } @@ -99,7 +99,7 @@ if (!--size_count.count) clients_.erase(client); - if (clients_.IsEmpty()) { + if (clients_.empty()) { DCHECK(keep_alive_); keep_alive_.Clear(); }
diff --git a/third_party/blink/renderer/core/css/css_property_value.h b/third_party/blink/renderer/core/css/css_property_value.h index 675735f..915bf58a 100644 --- a/third_party/blink/renderer/core/css/css_property_value.h +++ b/third_party/blink/renderer/core/css/css_property_value.h
@@ -72,11 +72,12 @@ index_in_shorthands_vector, important, implicit), - value_(value, Member<const CSSValue>::AtomicInitializerTag{}) {} + value_(value, decltype(value_)::AtomicInitializerTag{}) {} // FIXME: Remove this. CSSPropertyValue(CSSPropertyValueMetadata metadata, const CSSValue& value) - : metadata_(metadata), value_(value) {} + : metadata_(metadata), + value_(value, decltype(value_)::AtomicInitializerTag{}) {} CSSPropertyID Id() const { return metadata_.PropertyID(); } bool IsSetFromShorthand() const { return metadata_.is_set_from_shorthand_; }
diff --git a/third_party/blink/renderer/core/css/css_segmented_font_face.cc b/third_party/blink/renderer/core/css/css_segmented_font_face.cc index 65d8f9ca..02f6371 100644 --- a/third_party/blink/renderer/core/css/css_segmented_font_face.cc +++ b/third_party/blink/renderer/core/css/css_segmented_font_face.cc
@@ -243,7 +243,7 @@ } bool FontFaceList::IsEmpty() const { - return css_connected_face_.IsEmpty() && non_css_connected_face_.IsEmpty(); + return css_connected_face_.empty() && non_css_connected_face_.empty(); } namespace {
diff --git a/third_party/blink/renderer/core/css/css_selector_watch.cc b/third_party/blink/renderer/core/css/css_selector_watch.cc index 0a5c8231..32e781ed 100644 --- a/third_party/blink/renderer/core/css/css_selector_watch.cc +++ b/third_party/blink/renderer/core/css/css_selector_watch.cc
@@ -70,7 +70,7 @@ void CSSSelectorWatch::CallbackSelectorChangeTimerFired(TimerBase*) { // Should be ensured by updateSelectorMatches(): - DCHECK(!added_selectors_.IsEmpty() || !removed_selectors_.IsEmpty()); + DCHECK(!added_selectors_.empty() || !removed_selectors_.empty()); if (timer_expirations_ < 1) { timer_expirations_++; @@ -125,7 +125,7 @@ if (!should_update_timer) return; - if (removed_selectors_.IsEmpty() && added_selectors_.IsEmpty()) { + if (removed_selectors_.empty() && added_selectors_.empty()) { if (callback_selector_change_timer_.IsActive()) { timer_expirations_ = 0; callback_selector_change_timer_.Stop();
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.cc b/third_party/blink/renderer/core/css/css_style_sheet.cc index 6a3303c..b057949 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet.cc +++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -228,7 +228,7 @@ Document* document = OwnerDocument(); if (!document || !document->IsActive()) return; - if (!custom_element_tag_names_.IsEmpty()) { + if (!custom_element_tag_names_.empty()) { document->GetStyleEngine().ScheduleCustomElementInvalidations( custom_element_tag_names_); } @@ -237,7 +237,7 @@ document->GetStyleEngine().SetNeedsActiveStyleUpdate( ownerNode()->GetTreeScope()); invalidate_matched_properties_cache = true; - } else if (!adopted_tree_scopes_.IsEmpty()) { + } else if (!adopted_tree_scopes_.empty()) { for (auto tree_scope : adopted_tree_scopes_) { // It is currently required that adopted sheets can not be moved between // documents.
diff --git a/third_party/blink/renderer/core/css/font_face_cache.cc b/third_party/blink/renderer/core/css/font_face_cache.cc index 068c9b0..8419682 100644 --- a/third_party/blink/renderer/core/css/font_face_cache.cc +++ b/third_party/blink/renderer/core/css/font_face_cache.cc
@@ -131,11 +131,11 @@ if (!segmented_font_face->IsEmpty()) return false; map_.erase(it); - return map_.IsEmpty(); + return map_.empty(); } bool FontFaceCache::ClearCSSConnected() { - if (style_rule_to_font_face_.IsEmpty()) + if (style_rule_to_font_face_.empty()) return false; for (const auto& item : style_rule_to_font_face_) RemoveFontFace(item.value.Get(), true);
diff --git a/third_party/blink/renderer/core/css/font_face_cache.h b/third_party/blink/renderer/core/css/font_face_cache.h index 927a5da..23328ec8 100644 --- a/third_party/blink/renderer/core/css/font_face_cache.h +++ b/third_party/blink/renderer/core/css/font_face_cache.h
@@ -90,7 +90,7 @@ wtf_size_t size() const { return map_.size(); } void AddFontFace(FontFace* font_face, bool css_connected); - bool IsEmpty() const { return map_.IsEmpty(); } + bool IsEmpty() const { return map_.empty(); } // Returns true if associated |CSSSegmentedFontFace| is empty. bool RemoveFontFace(FontFace* font_face); @@ -148,7 +148,7 @@ void AddFontFace(FontFace* font_face, bool css_connected); void Clear() { map_.clear(); } CapabilitiesSet* Find(const AtomicString& family) const; - bool IsEmpty() const { return map_.IsEmpty(); } + bool IsEmpty() const { return map_.empty(); } // Returns true if |font_face| is removed from |map_|. bool RemoveFontFace(FontFace* font_face);
diff --git a/third_party/blink/renderer/core/css/font_face_set.cc b/third_party/blink/renderer/core/css/font_face_set.cc index 298416f7..4fac4af 100644 --- a/third_party/blink/renderer/core/css/font_face_set.cc +++ b/third_party/blink/renderer/core/css/font_face_set.cc
@@ -65,7 +65,7 @@ } void FontFaceSet::clearForBinding(ScriptState*, ExceptionState&) { - if (!InActiveContext() || non_css_connected_faces_.IsEmpty()) + if (!InActiveContext() || non_css_connected_faces_.empty()) return; FontSelector* font_selector = GetFontSelector(); FontFaceCache* font_face_cache = font_selector->GetFontFaceCache(); @@ -146,7 +146,7 @@ void FontFaceSet::RemoveFromLoadingFonts(FontFace* font_face) { loading_fonts_.erase(font_face); - if (loading_fonts_.IsEmpty()) + if (loading_fonts_.empty()) HandlePendingEventsAndPromisesSoon(); } @@ -262,7 +262,7 @@ } bool FontFaceSet::ShouldSignalReady() const { - if (!loading_fonts_.IsEmpty()) + if (!loading_fonts_.empty()) return false; return is_loading_ || ready_->GetState() == ReadyProperty::kPending; }
diff --git a/third_party/blink/renderer/core/css/font_face_set_document.cc b/third_party/blink/renderer/core/css/font_face_set_document.cc index 669e747..ab14ae8 100644 --- a/third_party/blink/renderer/core/css/font_face_set_document.cc +++ b/third_party/blink/renderer/core/css/font_face_set_document.cc
@@ -77,7 +77,7 @@ void FontFaceSetDocument::DidLayout() { if (!GetExecutionContext()) return; - if (GetDocument()->IsInOutermostMainFrame() && loading_fonts_.IsEmpty()) + if (GetDocument()->IsInOutermostMainFrame() && loading_fonts_.empty()) font_load_histogram_.Record(); if (!ShouldSignalReady()) return;
diff --git a/third_party/blink/renderer/core/css/post_style_update_scope.cc b/third_party/blink/renderer/core/css/post_style_update_scope.cc index c3c36a3..27f8200 100644 --- a/third_party/blink/renderer/core/css/post_style_update_scope.cc +++ b/third_party/blink/renderer/core/css/post_style_update_scope.cc
@@ -49,7 +49,7 @@ element_animations->CssAnimations().MaybeApplyPendingUpdate(element.Get()); } - DCHECK(animation_data_.elements_with_pending_updates_.IsEmpty()) + DCHECK(animation_data_.elements_with_pending_updates_.empty()) << "MaybeApplyPendingUpdate must not set further pending updates"; }
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc index aa1dfd2..95f58d0 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -1168,8 +1168,8 @@ virtual ~OrderedNamedLinesCollector() = default; bool IsEmpty() const { - return ordered_named_grid_lines_.IsEmpty() && - ordered_named_auto_repeat_grid_lines_.IsEmpty(); + return ordered_named_grid_lines_.empty() && + ordered_named_auto_repeat_grid_lines_.empty(); } virtual void CollectLineNamesForIndex( cssvalue::CSSBracketedValueList&,
diff --git a/third_party/blink/renderer/core/css/property_registry.cc b/third_party/blink/renderer/core/css/property_registry.cc index 54c39b2..e61875b 100644 --- a/third_party/blink/renderer/core/css/property_registry.cc +++ b/third_party/blink/renderer/core/css/property_registry.cc
@@ -22,7 +22,7 @@ } void PropertyRegistry::RemoveDeclaredProperties() { - if (declared_properties_.IsEmpty()) + if (declared_properties_.empty()) return; declared_properties_.clear(); declared_viewport_unit_flags_ = 0; @@ -43,7 +43,7 @@ } bool PropertyRegistry::IsEmpty() const { - return registered_properties_.IsEmpty() && declared_properties_.IsEmpty(); + return registered_properties_.empty() && declared_properties_.empty(); } bool PropertyRegistry::IsInRegisteredPropertySet(
diff --git a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h index 7ea64ac5..e058bfa 100644 --- a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h +++ b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h
@@ -71,7 +71,7 @@ MatchedPropertiesCache(); MatchedPropertiesCache(const MatchedPropertiesCache&) = delete; MatchedPropertiesCache& operator=(const MatchedPropertiesCache&) = delete; - ~MatchedPropertiesCache() { DCHECK(cache_.IsEmpty()); } + ~MatchedPropertiesCache() { DCHECK(cache_.empty()); } class CORE_EXPORT Key { STACK_ALLOCATED();
diff --git a/third_party/blink/renderer/core/css/resolver/scoped_style_resolver.cc b/third_party/blink/renderer/core/css/resolver/scoped_style_resolver.cc index 6e923821..b0fab7fa 100644 --- a/third_party/blink/renderer/core/css/resolver/scoped_style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/scoped_style_resolver.cc
@@ -145,7 +145,7 @@ StyleRuleKeyframes* ScopedStyleResolver::KeyframeStylesForAnimation( const AtomicString& animation_name) { - if (keyframes_rule_map_.IsEmpty()) + if (keyframes_rule_map_.empty()) return nullptr; KeyframesRuleMap::iterator it = keyframes_rule_map_.find(animation_name);
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc index f1b0ec94..f2e0afd6 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -2000,7 +2000,7 @@ } } - return !attributes_in_has_argument_.IsEmpty() || + return !attributes_in_has_argument_.empty() || NeedsHasInvalidationForTagName(element.LocalNameForSelectorMatching()); }
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.h b/third_party/blink/renderer/core/css/rule_feature_set.h index 3af8667..8249945 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.h +++ b/third_party/blink/renderer/core/css/rule_feature_set.h
@@ -80,16 +80,6 @@ return metadata_.max_direct_adjacent_selectors; } - bool HasSelectorForAttribute(const AtomicString& attribute_name) const { - DCHECK(!attribute_name.IsEmpty()); - return attribute_invalidation_sets_.Contains(attribute_name); - } - - bool HasSelectorForClass(const AtomicString& class_value) const { - DCHECK(!class_value.IsEmpty()); - return class_invalidation_sets_.Contains(class_value); - } - bool HasSelectorForId(const AtomicString& id_value) const { return id_invalidation_sets_.Contains(id_value); } @@ -150,20 +140,20 @@ CSSSelector::PseudoType pseudo_type) const; inline bool NeedsHasInvalidationForClassChange() const { - return !classes_in_has_argument_.IsEmpty(); + return !classes_in_has_argument_.empty(); } inline bool NeedsHasInvalidationForAttributeChange() const { - return !attributes_in_has_argument_.IsEmpty(); + return !attributes_in_has_argument_.empty(); } inline bool NeedsHasInvalidationForIdChange() const { - return !ids_in_has_argument_.IsEmpty(); + return !ids_in_has_argument_.empty(); } inline bool NeedsHasInvalidationForPseudoStateChange() const { - return !pseudos_in_has_argument_.IsEmpty(); + return !pseudos_in_has_argument_.empty(); } inline bool NeedsHasInvalidationForInsertionOrRemoval() const { return not_pseudo_in_has_argument_ || universal_in_has_argument_ || - !tag_names_in_has_argument_.IsEmpty() || + !tag_names_in_has_argument_.empty() || NeedsHasInvalidationForClassChange() || NeedsHasInvalidationForAttributeChange() || NeedsHasInvalidationForIdChange() ||
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h index 1ba2651d..e5f2a4a 100644 --- a/third_party/blink/renderer/core/css/rule_set.h +++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -245,7 +245,7 @@ public: void Add(const AtomicString& key, const RuleData& rule_data); base::span<const RuleData> Find(const AtomicString& key) const { - DCHECK(buckets.IsEmpty() || compacted); + DCHECK(buckets.empty() || compacted); auto it = buckets.find(key); if (it == buckets.end()) { return {};
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index 804b92b..3b24ae32 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -416,7 +416,7 @@ } bool StyleEngine::ShouldUpdateShadowTreeStyleSheetCollection() const { - return !dirty_tree_scopes_.IsEmpty(); + return !dirty_tree_scopes_.empty(); } void StyleEngine::MediaQueryAffectingValueChanged( @@ -447,7 +447,7 @@ void StyleEngine::MediaQueryAffectingValueChanged( HeapHashSet<Member<TextTrack>>& text_tracks, MediaValueChange change) { - if (text_tracks.IsEmpty()) + if (text_tracks.empty()) return; for (auto text_track : text_tracks) { @@ -576,7 +576,7 @@ if (GetDocument().IsActive()) UpdateActiveStyle(); - if (active_tree_scopes_.IsEmpty()) + if (active_tree_scopes_.empty()) return GetDocumentStyleSheetCollection().ActiveStyleSheets(); ActiveStyleSheetVector active_style_sheets; @@ -1973,7 +1973,7 @@ return; if (!tree_scope.GetDocument().documentElement()) return; - if (changed_rule_sets.IsEmpty()) + if (changed_rule_sets.empty()) return; Element& invalidation_root = @@ -2531,7 +2531,7 @@ StyleRuleKeyframes* StyleEngine::KeyframeStylesForAnimation( const AtomicString& animation_name) { - if (keyframes_rule_map_.IsEmpty()) + if (keyframes_rule_map_.empty()) return nullptr; KeyframesRuleMap::iterator it = keyframes_rule_map_.find(animation_name); @@ -2544,7 +2544,7 @@ StyleRuleFontPaletteValues* StyleEngine::FontPaletteValuesForNameAndFamily( AtomicString palette_name, AtomicString family_name) { - if (font_palette_values_rule_map_.IsEmpty() || palette_name.IsEmpty()) { + if (font_palette_values_rule_map_.empty() || palette_name.IsEmpty()) { return nullptr; }
diff --git a/third_party/blink/renderer/core/css/style_sheet_contents.cc b/third_party/blink/renderer/core/css/style_sheet_contents.cc index e406047..fce76196 100644 --- a/third_party/blink/renderer/core/css/style_sheet_contents.cc +++ b/third_party/blink/renderer/core/css/style_sheet_contents.cc
@@ -465,7 +465,7 @@ return parent_sheet->LoadCompleted(); StyleSheetContents* root = RootStyleSheet(); - return root->loading_clients_.IsEmpty(); + return root->loading_clients_.empty(); } void StyleSheetContents::CheckLoaded() { @@ -479,7 +479,7 @@ } DCHECK_EQ(this, RootStyleSheet()); - if (loading_clients_.IsEmpty()) + if (loading_clients_.empty()) return; // Avoid |CSSSStyleSheet| and |OwnerNode| being deleted by scripts that run @@ -652,8 +652,8 @@ loading_clients_.erase(sheet); completed_clients_.erase(sheet); - if (!sheet->OwnerDocument() || !loading_clients_.IsEmpty() || - !completed_clients_.IsEmpty()) + if (!sheet->OwnerDocument() || !loading_clients_.empty() || + !completed_clients_.empty()) return; has_single_owner_document_ = true;
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_document_state.cc b/third_party/blink/renderer/core/display_lock/display_lock_document_state.cc index c93d78e..991f69d 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_document_state.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_document_state.cc
@@ -237,7 +237,7 @@ bool DisplayLockDocumentState::MarkAncestorContextsHaveTopLayerElement( Element* element) { - if (display_lock_contexts_.IsEmpty()) + if (display_lock_contexts_.empty()) return false; bool had_locked_ancestor = false;
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index fb25125..f4e6eb87 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1901,7 +1901,7 @@ if (style_engine_->NeedsFullStyleUpdate()) return StyleAndLayoutTreeUpdate::kFull; - if (!use_elements_needing_update_.IsEmpty()) + if (!use_elements_needing_update_.empty()) return StyleAndLayoutTreeUpdate::kFull; // We have scheduled an invalidation set on the document node which means any // element may need a style recalc. @@ -2765,7 +2765,7 @@ ScriptForbiddenScope forbid_script; // Breadth-first search since nested use elements add to the queue. - while (!use_elements_needing_update_.IsEmpty()) { + while (!use_elements_needing_update_.empty()) { HeapHashSet<Member<SVGUseElement>> elements; use_elements_needing_update_.swap(elements); for (SVGUseElement* element : elements) @@ -5331,7 +5331,7 @@ void Document::DidMoveTreeToNewDocument(const Node& root) { DCHECK_NE(root.GetDocument(), this); - if (!ranges_.IsEmpty()) { + if (!ranges_.empty()) { AttachedRangeSet ranges = ranges_; for (Range* range : ranges) range->UpdateOwnerDocumentIfNeeded(); @@ -5437,7 +5437,7 @@ unsigned old_length) { NodeWithIndex node_to_be_removed_with_index( const_cast<Text&>(node_to_be_removed)); - if (!ranges_.IsEmpty()) { + if (!ranges_.empty()) { for (Range* range : ranges_) range->DidMergeTextNodes(node_to_be_removed_with_index, old_length); }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 6ccad42a..fd0143f 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -963,7 +963,7 @@ // and therefore the content attribute string should reflect the empty // string. This means we can stop trying to compute the content attribute // string. - if (value.IsNull() && !stored_elements->IsEmpty()) { + if (value.IsNull() && !stored_elements->empty()) { stored_elements->insert(element); continue; } @@ -2639,7 +2639,7 @@ auto popups_to_hide = document.PopupsWaitingToHide(); for (auto popup : popups_to_hide) popup->PopupHideFinishIfNeeded(); - DCHECK(document.PopupsWaitingToHide().IsEmpty()); + DCHECK(document.PopupsWaitingToHide().empty()); } if (endpoint && endpoint->PopupType() == PopupValueType::kHint) { @@ -2795,7 +2795,7 @@ animations.insert(animation); } animations.RemoveAll(previous_animations); - if (animations.IsEmpty()) { + if (animations.empty()) { // No animations to wait for: just finish immediately. PopupHideFinishIfNeeded(); } else {
diff --git a/third_party/blink/renderer/core/dom/id_target_observer_registry.cc b/third_party/blink/renderer/core/dom/id_target_observer_registry.cc index f8b477a..c0707b1 100644 --- a/third_party/blink/renderer/core/dom/id_target_observer_registry.cc +++ b/third_party/blink/renderer/core/dom/id_target_observer_registry.cc
@@ -49,20 +49,20 @@ void IdTargetObserverRegistry::RemoveObserver(const AtomicString& id, IdTargetObserver* observer) { - if (id.IsEmpty() || registry_.IsEmpty()) + if (id.IsEmpty() || registry_.empty()) return; IdToObserverSetMap::iterator iter = registry_.find(id.Impl()); ObserverSet* set = iter->value.Get(); set->erase(observer); - if (set->IsEmpty() && set != notifying_observers_in_set_) + if (set->empty() && set != notifying_observers_in_set_) registry_.erase(iter); } void IdTargetObserverRegistry::NotifyObserversInternal(const AtomicString& id) { DCHECK(!id.IsEmpty()); - DCHECK(!registry_.IsEmpty()); + DCHECK(!registry_.empty()); auto it_reg = registry_.find(id.Impl()); if (it_reg != registry_.end()) @@ -77,17 +77,17 @@ observer->IdTargetChanged(); } - if (notifying_observers_in_set_->IsEmpty()) + if (notifying_observers_in_set_->empty()) registry_.erase(id.Impl()); notifying_observers_in_set_ = nullptr; } bool IdTargetObserverRegistry::HasObservers(const AtomicString& id) const { - if (id.IsEmpty() || registry_.IsEmpty()) + if (id.IsEmpty() || registry_.empty()) return false; auto it = registry_.find(id.Impl()); - return it != registry_.end() ? !it->value->IsEmpty() : false; + return it != registry_.end() ? !it->value->empty() : false; } } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/id_target_observer_registry.h b/third_party/blink/renderer/core/dom/id_target_observer_registry.h index b9e18b5..f55d31e2 100644 --- a/third_party/blink/renderer/core/dom/id_target_observer_registry.h +++ b/third_party/blink/renderer/core/dom/id_target_observer_registry.h
@@ -63,7 +63,7 @@ inline void IdTargetObserverRegistry::NotifyObservers(const AtomicString& id) { DCHECK(!notifying_observers_in_set_); - if (id.IsEmpty() || registry_.IsEmpty()) + if (id.IsEmpty() || registry_.empty()) return; IdTargetObserverRegistry::NotifyObserversInternal(id); }
diff --git a/third_party/blink/renderer/core/dom/mutation_observer.cc b/third_party/blink/renderer/core/dom/mutation_observer.cc index 2bf1203..8ab37b5 100644 --- a/third_party/blink/renderer/core/dom/mutation_observer.cc +++ b/third_party/blink/renderer/core/dom/mutation_observer.cc
@@ -205,7 +205,7 @@ if (registrations_.Contains(registration)) registration->Unregister(); } - DCHECK(registrations_.IsEmpty()); + DCHECK(registrations_.empty()); } void MutationObserver::ObservationStarted( @@ -235,7 +235,7 @@ return *slot_change_list; } static void EnsureEnqueueMicrotask() { - if (ActiveMutationObservers().IsEmpty() && ActiveSlotChangeList().empty()) { + if (ActiveMutationObservers().empty() && ActiveSlotChangeList().empty()) { Microtask::EnqueueMicrotask( WTF::BindOnce(&MutationObserver::DeliverMutations)); }
diff --git a/third_party/blink/renderer/core/dom/mutation_observer_interest_group.cc b/third_party/blink/renderer/core/dom/mutation_observer_interest_group.cc index 7f91eda..20e1127 100644 --- a/third_party/blink/renderer/core/dom/mutation_observer_interest_group.cc +++ b/third_party/blink/renderer/core/dom/mutation_observer_interest_group.cc
@@ -44,7 +44,7 @@ HeapHashMap<Member<MutationObserver>, MutationRecordDeliveryOptions> observers; target.GetRegisteredMutationObserversOfType(observers, type, attribute_name); - if (observers.IsEmpty()) + if (observers.empty()) return nullptr; return MakeGarbageCollected<MutationObserverInterestGroup>(observers, @@ -56,7 +56,7 @@ observers, MutationRecordDeliveryOptions old_value_flag) : old_value_flag_(old_value_flag) { - DCHECK(!observers.IsEmpty()); + DCHECK(!observers.empty()); observers_.swap(observers); }
diff --git a/third_party/blink/renderer/core/dom/mutation_observer_registration.h b/third_party/blink/renderer/core/dom/mutation_observer_registration.h index b6b2685..68019e0 100644 --- a/third_party/blink/renderer/core/dom/mutation_observer_registration.h +++ b/third_party/blink/renderer/core/dom/mutation_observer_registration.h
@@ -60,7 +60,7 @@ void ClearTransientRegistrations(); bool HasTransientRegistrations() const { return transient_registration_nodes_ && - !transient_registration_nodes_->IsEmpty(); + !transient_registration_nodes_->empty(); } void Unregister();
diff --git a/third_party/blink/renderer/core/dom/node_lists_node_data.h b/third_party/blink/renderer/core/dom/node_lists_node_data.h index 71c1885..98dd5839 100644 --- a/third_party/blink/renderer/core/dom/node_lists_node_data.h +++ b/third_party/blink/renderer/core/dom/node_lists_node_data.h
@@ -141,8 +141,8 @@ void InvalidateCaches(const QualifiedName* attr_name = nullptr); bool IsEmpty() const { - return !child_node_list_ && atomic_name_caches_.IsEmpty() && - tag_collection_ns_caches_.IsEmpty(); + return !child_node_list_ && atomic_name_caches_.empty() && + tag_collection_ns_caches_.empty(); } void AdoptTreeScope() { InvalidateCaches(); }
diff --git a/third_party/blink/renderer/core/dom/popup_animation_finished_event_listener.cc b/third_party/blink/renderer/core/dom/popup_animation_finished_event_listener.cc index 7c83a60..8f2b7ef 100644 --- a/third_party/blink/renderer/core/dom/popup_animation_finished_event_listener.cc +++ b/third_party/blink/renderer/core/dom/popup_animation_finished_event_listener.cc
@@ -18,7 +18,7 @@ HeapHashSet<Member<EventTarget>>&& animations) : popup_element_(popup_element), animations_(std::move(animations)) { DCHECK(popup_element->HasPopupAttribute()); - DCHECK(!animations_.IsEmpty()); + DCHECK(!animations_.empty()); for (auto animation : animations_) { animation->addEventListener(event_type_names::kFinish, this, /*use_capture*/ false); @@ -51,7 +51,7 @@ void PopupAnimationFinishedEventListener::Invoke(ExecutionContext*, Event* event) { - DCHECK(!animations_.IsEmpty()); + DCHECK(!animations_.empty()); DCHECK(event->type() == event_type_names::kFinish || event->type() == event_type_names::kCancel); auto* animation = event->target(); @@ -59,13 +59,13 @@ animations_.erase(animation); // Finish hiding the popup once all animations complete. - if (animations_.IsEmpty()) { + if (animations_.empty()) { popup_element_->PopupHideFinishIfNeeded(); } } bool PopupAnimationFinishedEventListener::IsFinished() const { - return animations_.IsEmpty(); + return animations_.empty(); } void PopupAnimationFinishedEventListener::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller.cc b/third_party/blink/renderer/core/dom/scripted_animation_controller.cc index b16a848..f7c7ab61 100644 --- a/third_party/blink/renderer/core/dom/scripted_animation_controller.cc +++ b/third_party/blink/renderer/core/dom/scripted_animation_controller.cc
@@ -55,7 +55,7 @@ if (it != per_frame_events_.end()) { HashSet<const StringImpl*>& set = it->value; set.erase(event->type().Impl()); - if (set.IsEmpty()) + if (set.empty()) per_frame_events_.erase(target); } }
diff --git a/third_party/blink/renderer/core/dom/slot_assignment_engine.cc b/third_party/blink/renderer/core/dom/slot_assignment_engine.cc index 22bb66b..f2681f7 100644 --- a/third_party/blink/renderer/core/dom/slot_assignment_engine.cc +++ b/third_party/blink/renderer/core/dom/slot_assignment_engine.cc
@@ -41,7 +41,7 @@ } void SlotAssignmentEngine::RecalcSlotAssignments() { - if (shadow_roots_needing_recalc_.IsEmpty()) + if (shadow_roots_needing_recalc_.empty()) return; TRACE_EVENT0("blink", "SlotAssignmentEngine::RecalcSlotAssignments"); for (auto& shadow_root : @@ -52,7 +52,7 @@ // shadow_roots_needing_recalc_. shadow_root->GetSlotAssignment().RecalcAssignment(); } - DCHECK(shadow_roots_needing_recalc_.IsEmpty()); + DCHECK(shadow_roots_needing_recalc_.empty()); } void SlotAssignmentEngine::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/dom/slot_assignment_engine.h b/third_party/blink/renderer/core/dom/slot_assignment_engine.h index 0389dff2..fda6657 100644 --- a/third_party/blink/renderer/core/dom/slot_assignment_engine.h +++ b/third_party/blink/renderer/core/dom/slot_assignment_engine.h
@@ -25,7 +25,7 @@ void Disconnected(ShadowRoot&); bool HasPendingSlotAssignmentRecalc() const { - return !shadow_roots_needing_recalc_.IsEmpty(); + return !shadow_roots_needing_recalc_.empty(); } void RecalcSlotAssignments();
diff --git a/third_party/blink/renderer/core/dom/transition_pseudo_element_data.h b/third_party/blink/renderer/core/dom/transition_pseudo_element_data.h index 3377b269..ebb6e16c 100644 --- a/third_party/blink/renderer/core/dom/transition_pseudo_element_data.h +++ b/third_party/blink/renderer/core/dom/transition_pseudo_element_data.h
@@ -52,7 +52,7 @@ inline bool TransitionPseudoElementData::HasPseudoElements() const { return transition_ || transition_outgoing_image_ || transition_incoming_image_ || transition_image_wrapper_ || - !transition_containers_.IsEmpty(); + !transition_containers_.empty(); } inline void TransitionPseudoElementData::ClearPseudoElements() {
diff --git a/third_party/blink/renderer/core/dom/tree_ordered_list.cc b/third_party/blink/renderer/core/dom/tree_ordered_list.cc index 0b485c7..4177c88b 100644 --- a/third_party/blink/renderer/core/dom/tree_ordered_list.cc +++ b/third_party/blink/renderer/core/dom/tree_ordered_list.cc
@@ -34,7 +34,7 @@ namespace blink { void TreeOrderedList::Add(Node* node) { - if (nodes_.IsEmpty()) { + if (nodes_.empty()) { nodes_.insert(node); return; }
diff --git a/third_party/blink/renderer/core/dom/tree_ordered_list.h b/third_party/blink/renderer/core/dom/tree_ordered_list.h index a22312e6..deb61a26 100644 --- a/third_party/blink/renderer/core/dom/tree_ordered_list.h +++ b/third_party/blink/renderer/core/dom/tree_ordered_list.h
@@ -48,7 +48,7 @@ void Add(Node*); void Remove(const Node*); - bool IsEmpty() const { return nodes_.IsEmpty(); } + bool IsEmpty() const { return nodes_.empty(); } void Clear() { nodes_.clear(); } wtf_size_t size() const { return nodes_.size(); }
diff --git a/third_party/blink/renderer/core/dom/visited_link_state.cc b/third_party/blink/renderer/core/dom/visited_link_state.cc index f7580fe1..4bf27e7a 100644 --- a/third_party/blink/renderer/core/dom/visited_link_state.cc +++ b/third_party/blink/renderer/core/dom/visited_link_state.cc
@@ -84,7 +84,7 @@ void VisitedLinkState::InvalidateStyleForAllLinks( bool invalidate_visited_link_hashes) { - if (!links_checked_for_visited_state_.IsEmpty() && GetDocument().firstChild()) + if (!links_checked_for_visited_state_.empty() && GetDocument().firstChild()) InvalidateStyleForAllLinksRecursively(*GetDocument().firstChild(), invalidate_visited_link_hashes); }
diff --git a/third_party/blink/renderer/core/editing/layout_selection.cc b/third_party/blink/renderer/core/editing/layout_selection.cc index 8fed85f..4554a91 100644 --- a/third_party/blink/renderer/core/editing/layout_selection.cc +++ b/third_party/blink/renderer/core/editing/layout_selection.cc
@@ -212,7 +212,7 @@ DCHECK(selected_objects.Contains(paint_range->end_node)) << this; return; } - DCHECK(selected_objects.IsEmpty()) << this; + DCHECK(selected_objects.empty()) << this; #endif }
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc index 2faabae7..935181c 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc +++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -160,7 +160,7 @@ inline bool DocumentMarkerController::PossiblyHasMarkers( DocumentMarker::MarkerTypes types) const { - DCHECK(!markers_.IsEmpty() || + DCHECK(!markers_.empty() || possibly_existing_marker_types_ == DocumentMarker::MarkerTypes(0)); return possibly_existing_marker_types_.Intersects(types); } @@ -282,7 +282,7 @@ for (; !marked_text.AtEnd(); marked_text.Advance()) { if (!PossiblyHasMarkers(marker_types)) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); const Node& node = marked_text.CurrentContainer(); auto* text_node = DynamicTo<Text>(node); if (!text_node) @@ -374,7 +374,7 @@ if (!PossiblyHasMarkers(DocumentMarker::MarkerTypes::All())) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); MarkerLists* const src_markers = FindMarkers(&src_node); if (!src_markers) @@ -424,7 +424,7 @@ if (!PossiblyHasMarkers(marker_types)) return; - DCHECK(!(markers_.IsEmpty())); + DCHECK(!(markers_.empty())); MarkerLists* const markers = FindMarkers(&text); if (!markers) @@ -465,7 +465,7 @@ if (empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount) { markers_.erase(&text); - if (markers_.IsEmpty()) { + if (markers_.empty()) { possibly_existing_marker_types_ = DocumentMarker::MarkerTypes(); SetDocument(nullptr); } @@ -954,7 +954,7 @@ if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) return result; - DCHECK(!(markers_.IsEmpty())); + DCHECK(!(markers_.empty())); // outer loop: process each node MarkerMap::iterator end = markers_.end(); @@ -1005,7 +1005,7 @@ } void DocumentMarkerController::DidProcessMarkerMap(const LivenessBroker&) { - if (markers_.IsEmpty()) + if (markers_.empty()) Clear(); } @@ -1026,7 +1026,7 @@ DocumentMarker::MarkerTypes marker_types) { if (!PossiblyHasMarkers(marker_types)) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); MarkerMap::iterator iterator = markers_.find(&text); if (iterator != markers_.end()) @@ -1097,7 +1097,7 @@ const SuggestionMarker::SuggestionType& type) { if (!PossiblyHasMarkers(DocumentMarker::kSuggestion)) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); for (const auto& node_markers : markers_) { MarkerLists* markers = node_markers.value; @@ -1126,7 +1126,7 @@ DocumentMarker::MarkerTypes marker_types) { if (!PossiblyHasMarkers(marker_types)) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); HeapVector<Member<const Text>> nodes_with_markers; CopyKeysToVector(markers_, nodes_with_markers); @@ -1183,7 +1183,7 @@ if (node_can_be_removed) { markers_.erase(iterator); - if (markers_.IsEmpty()) { + if (markers_.empty()) { possibly_existing_marker_types_ = DocumentMarker::MarkerTypes(); SetDocument(nullptr); } @@ -1194,7 +1194,7 @@ DocumentMarker::MarkerTypes marker_types) { if (!PossiblyHasMarkers(marker_types)) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); // outer loop: process each markered Text in the document for (auto& iterator : markers_) { @@ -1216,7 +1216,7 @@ if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) return false; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); const Node* const start_container = range.StartPosition().ComputeContainerNode(); @@ -1302,7 +1302,7 @@ unsigned new_length) { if (!PossiblyHasMarkers(DocumentMarker::MarkerTypes::All())) return; - DCHECK(!markers_.IsEmpty()); + DCHECK(!markers_.empty()); auto* text_node = DynamicTo<Text>(node); if (!text_node) return;
diff --git a/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc b/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc index f3ea623..0124615 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc +++ b/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc
@@ -174,8 +174,8 @@ } void SpellCheckRequester::TimerFiredToProcessQueuedRequest() { - DCHECK(!request_queue_.IsEmpty()); - if (request_queue_.IsEmpty()) + DCHECK(!request_queue_.empty()); + if (request_queue_.empty()) return; InvokeRequest(request_queue_.TakeFirst()); @@ -245,7 +245,7 @@ void SpellCheckRequester::EnqueueRequest(SpellCheckRequest* request) { DCHECK(request); bool continuation = false; - if (!request_queue_.IsEmpty()) { + if (!request_queue_.empty()) { SpellCheckRequest* last_request = request_queue_.back(); // It's a continuation if the number of the last request got incremented in // the new one and both apply to the same editable. @@ -284,7 +284,7 @@ last_processed_sequence_ = sequence; ClearProcessingRequest(); - if (!request_queue_.IsEmpty()) { + if (!request_queue_.empty()) { timer_to_process_queued_request_ = PostCancellableTask( *window_->GetTaskRunner(TaskType::kInternalDefault), FROM_HERE, WTF::BindOnce(&SpellCheckRequester::TimerFiredToProcessQueuedRequest,
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc index 7eb0301..ab8832d 100644 --- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc +++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
@@ -389,7 +389,7 @@ if (!node && web_local_frame_impl_->GetFrame()->GetDocument()) node = web_local_frame_impl_->GetFrame()->GetDocument()->documentElement(); - if (!overlay_agents_.IsEmpty()) { + if (!overlay_agents_.empty()) { for (auto& it : overlay_agents_) it.value->Inspect(node); } else { @@ -499,14 +499,14 @@ void WebDevToolsAgentImpl::WillProcessTask( const base::PendingTask& pending_task, bool was_blocked_or_low_priority) { - if (network_agents_.IsEmpty()) + if (network_agents_.empty()) return; ThreadDebugger::IdleFinished(V8PerIsolateData::MainThreadIsolate()); } void WebDevToolsAgentImpl::DidProcessTask( const base::PendingTask& pending_task) { - if (network_agents_.IsEmpty()) + if (network_agents_.empty()) return; ThreadDebugger::IdleStarted(V8PerIsolateData::MainThreadIsolate()); FlushProtocolNotifications();
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h index 06987d43..92ffc33 100644 --- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h +++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
@@ -73,7 +73,7 @@ void WillBeDestroyed(); void FlushProtocolNotifications(); - bool HasOverlays() const { return !overlay_agents_.IsEmpty(); } + bool HasOverlays() const { return !overlay_agents_.empty(); } void UpdateOverlaysPrePaint(); void PaintOverlays(GraphicsContext&);
diff --git a/third_party/blink/renderer/core/exported/web_dom_message_event.cc b/third_party/blink/renderer/core/exported/web_dom_message_event.cc index beae7ec..d13f3c8e 100644 --- a/third_party/blink/renderer/core/exported/web_dom_message_event.cc +++ b/third_party/blink/renderer/core/exported/web_dom_message_event.cc
@@ -51,7 +51,7 @@ const WebFrame* source_frame, const WebDocument& target_document, WebVector<MessagePortChannel> channels) - : WebDOMMessageEvent(MessageEvent::Create(), absl::nullopt) { + : WebDOMMessageEvent(MessageEvent::Create()) { DOMWindow* window = nullptr; if (source_frame) window = WebFrame::ToCoreFrame(*source_frame)->DomWindow();
diff --git a/third_party/blink/renderer/core/exported/web_frame_serializer.cc b/third_party/blink/renderer/core/exported/web_frame_serializer.cc index e6646c3f..637749e 100644 --- a/third_party/blink/renderer/core/exported/web_frame_serializer.cc +++ b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
@@ -108,7 +108,7 @@ "resource count", static_cast<uint64_t>(resources.size())); // There was an error serializing the frame (e.g. of an image resource). - if (resources.IsEmpty()) + if (resources.empty()) return WebThreadSafeData(); // Encode serialized resources as MHTML. @@ -121,7 +121,7 @@ MHTMLArchive::GenerateMHTMLPart( boundary, FrameSerializerDelegateImpl::GetContentID(frame), encoding_policy, resources.TakeFirst(), *output->MutableData()); - while (!resources.IsEmpty()) { + while (!resources.empty()) { TRACE_EVENT0("page-serialization", "WebFrameSerializer::generateMHTMLParts encoding"); MHTMLArchive::GenerateMHTMLPart(boundary, String(), encoding_policy,
diff --git a/third_party/blink/renderer/core/fetch/bytes_consumer_tee.cc b/third_party/blink/renderer/core/fetch/bytes_consumer_tee.cc index 304a849..9805bf0 100644 --- a/third_party/blink/renderer/core/fetch/bytes_consumer_tee.cc +++ b/third_party/blink/renderer/core/fetch/bytes_consumer_tee.cc
@@ -154,7 +154,7 @@ *available = 0; if (is_cancelled_ || is_closed_) return Result::kDone; - if (!chunks_.IsEmpty()) { + if (!chunks_.empty()) { Chunk* chunk = chunks_[0]; DCHECK_LE(offset_, chunk->size()); *buffer = chunk->data() + offset_; @@ -179,9 +179,9 @@ Result EndRead(size_t read) override { DCHECK(chunk_in_use_); - DCHECK(chunks_.IsEmpty() || chunk_in_use_ == chunks_[0]); + DCHECK(chunks_.empty() || chunk_in_use_ == chunks_[0]); chunk_in_use_ = nullptr; - if (chunks_.IsEmpty()) { + if (chunks_.empty()) { // This object becomes errored during the two-phase read. DCHECK_EQ(PublicState::kErrored, GetPublicState()); return Result::kOk; @@ -193,7 +193,7 @@ offset_ = 0; chunks_.pop_front(); } - if (chunks_.IsEmpty() && tee_->GetPublicState() == PublicState::kClosed) { + if (chunks_.empty() && tee_->GetPublicState() == PublicState::kClosed) { // All data has been consumed. execution_context_->GetTaskRunner(TaskType::kNetworking) ->PostTask(FROM_HERE, WTF::BindOnce(&Destination::Close, @@ -244,7 +244,7 @@ chunks_.push_back(chunk); } - bool IsEmpty() const { return chunks_.IsEmpty(); } + bool IsEmpty() const { return chunks_.empty(); } void ClearChunks() { chunks_.clear(); @@ -254,7 +254,7 @@ void Notify() { if (is_cancelled_ || is_closed_) return; - if (chunks_.IsEmpty() && tee_->GetPublicState() == PublicState::kClosed) { + if (chunks_.empty() && tee_->GetPublicState() == PublicState::kClosed) { Close(); return; } @@ -279,7 +279,7 @@ private: void Close() { DCHECK_EQ(PublicState::kClosed, tee_->GetPublicState()); - DCHECK(chunks_.IsEmpty()); + DCHECK(chunks_.empty()); if (is_closed_ || is_cancelled_) { // It's possible to reach here because this function can be // called asynchronously.
diff --git a/third_party/blink/renderer/core/fileapi/file_reader.cc b/third_party/blink/renderer/core/fileapi/file_reader.cc index 49b7e99..c0ad146 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader.cc
@@ -132,7 +132,7 @@ private: void PushReader(FileReader* reader) { - if (pending_readers_.IsEmpty() && + if (pending_readers_.empty() && running_readers_.size() < max_running_readers_) { reader->ExecutePendingRead(); DCHECK(!running_readers_.Contains(reader)); @@ -171,7 +171,7 @@ if (GetSupplementable()->IsContextDestroyed()) return; while (running_readers_.size() < max_running_readers_) { - if (pending_readers_.IsEmpty()) + if (pending_readers_.empty()) return; FileReader* reader = pending_readers_.TakeFirst(); reader->ExecutePendingRead();
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.cc b/third_party/blink/renderer/core/frame/ad_tracker.cc index 1135ce3..f6aaed5d 100644 --- a/third_party/blink/renderer/core/frame/ad_tracker.cc +++ b/third_party/blink/renderer/core/frame/ad_tracker.cc
@@ -352,7 +352,7 @@ if (it == known_ad_scripts_.end()) return false; - if (it->value.IsEmpty()) + if (it->value.empty()) return false; // Delay calling ScriptAtTopOfStack() as much as possible due to its cost.
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc index 4ba18ee2..01bcc0c 100644 --- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc +++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
@@ -321,7 +321,7 @@ bool AreAllMatchingHashesPresent( const network::mojom::blink::CSPSourceList* directive, const IntegrityMetadataSet& hashes) { - if (!directive || hashes.IsEmpty()) + if (!directive || hashes.empty()) return false; for (const std::pair<String, IntegrityAlgorithm>& hash : hashes) { // Convert the hash from integrity metadata format to CSP format.
diff --git a/third_party/blink/renderer/core/frame/dom_window.cc b/third_party/blink/renderer/core/frame/dom_window.cc index 833e221..9f0a74f 100644 --- a/third_party/blink/renderer/core/frame/dom_window.cc +++ b/third_party/blink/renderer/core/frame/dom_window.cc
@@ -856,21 +856,18 @@ DOMWindow::PostedMessage::ToBlinkTransferableMessage() && { BlinkTransferableMessage result; - // Message data and cluster ID (optional). result.message = std::move(data); - if (result.message->IsLockedToAgentCluster()) - result.locked_agent_cluster_id = source->GetAgentClusterID(); + result.sender_agent_cluster_id = source->GetAgentClusterID(); + result.locked_to_sender_agent_cluster = + result.message->IsLockedToAgentCluster(); - // Ports result.ports = std::move(channels); - // User activation if (user_activation) { result.user_activation = mojom::blink::UserActivationSnapshot::New( user_activation->hasBeenActive(), user_activation->isActive()); } - // Capability delegation result.delegated_capability = delegated_capability; return result;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index 1ff417d..a315da5 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -3147,15 +3147,14 @@ // If the agent cluster id had a value it means this was locked when it // was serialized. - if (message.locked_agent_cluster_id) + if (message.locked_to_sender_agent_cluster) message_event->LockToAgentCluster(); // Finally dispatch the message to the DOM Window. DomWindow()->DispatchMessageEventWithOriginCheck( target_security_origin.get(), message_event, std::make_unique<SourceLocation>(String(), String(), 0, 0, nullptr), - message.locked_agent_cluster_id ? message.locked_agent_cluster_id.value() - : base::UnguessableToken()); + message.sender_agent_cluster_id); } bool LocalFrame::ShouldThrottleDownload() {
diff --git a/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc b/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc index b5f570d..d65ce43 100644 --- a/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc +++ b/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
@@ -1344,7 +1344,7 @@ DOMWindowPortalHost::portalHost(*dom_window)->OnPortalActivated(); frame_->GetPage()->SetInsidePortal(false); - DCHECK(!data.locked_agent_cluster_id) + DCHECK(!data.locked_to_sender_agent_cluster) << "portal activation is always cross-agent-cluster and should be " "diagnosed early"; MessagePortArray* ports =
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index eb7bb6f0..b9379c83 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1219,7 +1219,7 @@ bool LocalFrameView::RequiresMainThreadScrollingForBackgroundAttachmentFixed() const { - if (background_attachment_fixed_objects_.IsEmpty()) + if (background_attachment_fixed_objects_.empty()) return false; if (background_attachment_fixed_objects_.size() > 1) return true; @@ -1761,7 +1761,7 @@ // isEmpty: // FIXME: This assert has been temporarily removed due to // https://crbug.com/430344 - if (part_update_set_.IsEmpty()) + if (part_update_set_.empty()) return true; // Need to swap because script will run inside the below loop and invalidate @@ -1797,7 +1797,7 @@ part_update_set_.erase(&object); } - return part_update_set_.IsEmpty(); + return part_update_set_.empty(); } void LocalFrameView::UpdatePluginsTimerFired(TimerBase*) { @@ -1818,7 +1818,7 @@ void LocalFrameView::ScheduleUpdatePluginsIfNecessary() { DCHECK(!IsInPerformLayout()); - if (update_plugins_timer_.IsActive() || part_update_set_.IsEmpty()) + if (update_plugins_timer_.IsActive() || part_update_set_.empty()) return; update_plugins_timer_.StartOneShot(base::TimeDelta(), FROM_HERE); } @@ -4781,7 +4781,7 @@ } bool LocalFrameView::HasDominantVideoElement() const { - return !fullscreen_video_elements_.IsEmpty(); + return !fullscreen_video_elements_.empty(); } #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/core/frame/opened_frame_tracker.cc b/third_party/blink/renderer/core/frame/opened_frame_tracker.cc index 2314553..8159f45 100644 --- a/third_party/blink/renderer/core/frame/opened_frame_tracker.cc +++ b/third_party/blink/renderer/core/frame/opened_frame_tracker.cc
@@ -19,7 +19,7 @@ } bool OpenedFrameTracker::IsEmpty() const { - return opened_frames_.IsEmpty(); + return opened_frames_.empty(); } void OpenedFrameTracker::Add(Frame* frame) {
diff --git a/third_party/blink/renderer/core/frame/pending_beacon_dispatcher.cc b/third_party/blink/renderer/core/frame/pending_beacon_dispatcher.cc index 87ef104..96b8667 100644 --- a/third_party/blink/renderer/core/frame/pending_beacon_dispatcher.cc +++ b/third_party/blink/renderer/core/frame/pending_beacon_dispatcher.cc
@@ -120,7 +120,7 @@ } void PendingBeaconDispatcher::ScheduleDispatchBeacons() { - if (pending_beacons_.IsEmpty()) { + if (pending_beacons_.empty()) { return; }
diff --git a/third_party/blink/renderer/core/frame/platform_event_dispatcher.cc b/third_party/blink/renderer/core/frame/platform_event_dispatcher.cc index 6dd8bef..92087ccc 100644 --- a/third_party/blink/renderer/core/frame/platform_event_dispatcher.cc +++ b/third_party/blink/renderer/core/frame/platform_event_dispatcher.cc
@@ -34,14 +34,14 @@ DCHECK(controllers_.Contains(controller)); controllers_.erase(controller); - if (!is_dispatching_ && controllers_.IsEmpty()) { + if (!is_dispatching_ && controllers_.empty()) { StopListening(); is_listening_ = false; } } void PlatformEventDispatcher::NotifyControllers() { - if (controllers_.IsEmpty()) + if (controllers_.empty()) return; { @@ -56,7 +56,7 @@ } } - if (controllers_.IsEmpty()) { + if (controllers_.empty()) { StopListening(); is_listening_ = false; }
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index 9b234f1..e3c90793 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -1618,6 +1618,7 @@ message.message = SerializedScriptValue::NullValue(); message.sender_origin = SecurityOrigin::CreateFromString("https://origin.com"); + message.sender_agent_cluster_id = base::UnguessableToken::Create(); return message; };
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc b/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc index df7f84c..316f560 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc +++ b/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc
@@ -182,7 +182,7 @@ size_t blink_gc_alloc_kb = ProcessHeap::TotalAllocatedObjectSize() / kKiloByte; - while (!rendering_context_descriptions_.IsEmpty()) { + while (!rendering_context_descriptions_.empty()) { RenderingContextDescriptionCodec desc( rendering_context_descriptions_.TakeAny()); @@ -290,7 +290,6 @@ static_cast<int>(blink_gc_alloc_kb)); } } - } void CanvasPerformanceMonitor::DidProcessTask(TimeTicks start_time,
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h index cc4fadd2..72c7ce2e 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -144,7 +144,7 @@ void AddListener(CanvasDrawListener*); void RemoveListener(CanvasDrawListener*); // Derived from OffscreenCanvasPlaceholder. - bool HasCanvasCapture() const final { return !listeners_.IsEmpty(); } + bool HasCanvasCapture() const final { return !listeners_.empty(); } // Used for rendering void DidDraw(const SkIRect&) override;
diff --git a/third_party/blink/renderer/core/html/closewatcher/close_watcher.cc b/third_party/blink/renderer/core/html/closewatcher/close_watcher.cc index 64102d54..18642d6 100644 --- a/third_party/blink/renderer/core/html/closewatcher/close_watcher.cc +++ b/third_party/blink/renderer/core/html/closewatcher/close_watcher.cc
@@ -43,7 +43,7 @@ : receiver_(this, window), window_(window) {} void CloseWatcher::WatcherStack::Add(CloseWatcher* watcher) { - if (watchers_.IsEmpty()) { + if (watchers_.empty()) { auto& host = window_->GetFrame()->GetLocalFrameHostRemote(); host.SetCloseListener(receiver_.BindNewPipeAndPassRemote( window_->GetTaskRunner(TaskType::kMiscPlatformAPI))); @@ -53,7 +53,7 @@ void CloseWatcher::WatcherStack::Remove(CloseWatcher* watcher) { watchers_.erase(watcher); - if (watchers_.IsEmpty()) { + if (watchers_.empty()) { receiver_.reset(); } } @@ -65,14 +65,14 @@ } void CloseWatcher::WatcherStack::EscapeKeyHandler(KeyboardEvent* event) { - if (!watchers_.IsEmpty() && !event->DefaultHandled() && event->isTrusted() && + if (!watchers_.empty() && !event->DefaultHandled() && event->isTrusted() && event->keyCode() == VKEY_ESCAPE) { Signal(); } } void CloseWatcher::WatcherStack::Signal() { - while (!watchers_.IsEmpty()) { + while (!watchers_.empty()) { CloseWatcher* watcher = watchers_.back(); watcher->close(); if (!watcher->IsGroupedWithPrevious()) {
diff --git a/third_party/blink/renderer/core/html/closewatcher/close_watcher.h b/third_party/blink/renderer/core/html/closewatcher/close_watcher.h index 19d14b6..9019620 100644 --- a/third_party/blink/renderer/core/html/closewatcher/close_watcher.h +++ b/third_party/blink/renderer/core/html/closewatcher/close_watcher.h
@@ -59,7 +59,7 @@ void Add(CloseWatcher*); void Remove(CloseWatcher*); - bool HasActiveWatcher() const { return !watchers_.IsEmpty(); } + bool HasActiveWatcher() const { return !watchers_.empty(); } bool HasConsumedFreeWatcher() const; void Trace(Visitor*) const;
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc index ca6f1ed..f5481f4 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
@@ -210,7 +210,7 @@ // a custom element callback reaction with element, callback name // "attributeChangedCallback", and an argument list containing attribute's // local name, null, attribute's value, and attribute's namespace. - if (!observed_attributes_.IsEmpty()) + if (!observed_attributes_.empty()) EnqueueAttributeChangedCallbackForAllAttributes(element); // 4.13.5.5: If element is connected, then enqueue a custom element callback
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter.cc b/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter.cc index 958c2a7..3535abe8 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter.cc
@@ -81,7 +81,7 @@ if (children->size() == 1) Visit(result, *children, children->begin()); - DCHECK(children->IsEmpty()); + DCHECK(children->empty()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/form_controller.cc b/third_party/blink/renderer/core/html/forms/form_controller.cc index 1f1c86d..08d22ad 100644 --- a/third_party/blink/renderer/core/html/forms/form_controller.cc +++ b/third_party/blink/renderer/core/html/forms/form_controller.cc
@@ -217,7 +217,7 @@ static std::unique_ptr<SavedFormState> Deserialize(const Vector<String>&, wtf_size_t& index); void SerializeTo(Vector<String>&) const; - bool IsEmpty() const { return state_for_new_controls_.IsEmpty(); } + bool IsEmpty() const { return state_for_new_controls_.empty(); } void AppendControlState(const AtomicString& name, const AtomicString& type, const FormControlState&); @@ -297,7 +297,7 @@ FormControlState SavedFormState::TakeControlState(const AtomicString& name, const AtomicString& type) { - if (state_for_new_controls_.IsEmpty()) + if (state_for_new_controls_.empty()) return FormControlState(); ControlStateMap::iterator it = state_for_new_controls_.find(ControlKey(name.Impl(), type.Impl())); @@ -514,12 +514,12 @@ } bool FormController::HasControlStates() const { - return !saved_form_state_map_.IsEmpty(); + return !saved_form_state_map_.empty(); } FormControlState FormController::TakeStateForControl( const ListedElement& control) { - if (saved_form_state_map_.IsEmpty()) + if (saved_form_state_map_.empty()) return FormControlState(); if (!form_key_generator_) form_key_generator_ = MakeGarbageCollected<FormKeyGenerator>();
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc index c765124..f974920 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -207,7 +207,7 @@ select_type_->UpdateTextStyleAndContent(); SetNeedsValidityCheck(); - if (has_new_selection || !old_selection.IsEmpty()) { + if (has_new_selection || !old_selection.empty()) { DispatchInputEvent(); DispatchChangeEvent(); }
diff --git a/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc b/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc index 758c160..7f99476 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc
@@ -631,7 +631,7 @@ void HTMLSelectMenuElement::ResetOptionParts() { // Remove part status from all current option parts - while (!option_parts_.IsEmpty()) { + while (!option_parts_.empty()) { OptionPartRemoved(option_parts_.back()); }
diff --git a/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc b/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc index ed73a4d..0cfbccc 100644 --- a/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc +++ b/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc
@@ -31,7 +31,7 @@ public: RadioButtonGroup(); - bool IsEmpty() const { return members_.IsEmpty(); } + bool IsEmpty() const { return members_.empty(); } bool IsRequired() const { return required_count_; } HTMLInputElement* CheckedButton() const { return checked_button_; } void Add(HTMLInputElement*); @@ -152,7 +152,7 @@ if (checked_button_ == button) checked_button_ = nullptr; - if (members_.IsEmpty()) { + if (members_.empty()) { DCHECK(!required_count_); DCHECK(!checked_button_); } else if (was_valid != IsValid()) {
diff --git a/third_party/blink/renderer/core/html/html_slot_element.cc b/third_party/blink/renderer/core/html/html_slot_element.cc index 0c905830..9a612bd 100644 --- a/third_party/blink/renderer/core/html/html_slot_element.cc +++ b/third_party/blink/renderer/core/html/html_slot_element.cc
@@ -159,7 +159,7 @@ void HTMLSlotElement::assign(HeapVector<Member<V8UnionElementOrText>>& js_nodes, ExceptionState&) { UseCounter::Count(GetDocument(), WebFeature::kSlotAssignNode); - if (js_nodes.empty() && manually_assigned_nodes_.IsEmpty()) + if (js_nodes.empty() && manually_assigned_nodes_.empty()) return; HeapVector<Member<Node>> nodes; @@ -179,7 +179,7 @@ } void HTMLSlotElement::Assign(const HeapVector<Member<Node>>& nodes) { - if (nodes.empty() && manually_assigned_nodes_.IsEmpty()) + if (nodes.empty() && manually_assigned_nodes_.empty()) return; bool updated = false; @@ -213,7 +213,7 @@ } } } - DCHECK(updated || removed_nodes.IsEmpty()); + DCHECK(updated || removed_nodes.empty()); if (updated) { for (auto removed_node : removed_nodes)
diff --git a/third_party/blink/renderer/core/html/link_style.cc b/third_party/blink/renderer/core/html/link_style.cc index 104b72e..e99458f 100644 --- a/third_party/blink/renderer/core/html/link_style.cc +++ b/third_party/blink/renderer/core/html/link_style.cc
@@ -63,7 +63,7 @@ // here, instead of in the resource fetcher. https://crbug.com/500701. if ((!cached_style_sheet->ErrorOccurred() && !owner_->FastGetAttribute(html_names::kIntegrityAttr).IsEmpty() && - !cached_style_sheet->IntegrityMetadata().IsEmpty()) || + !cached_style_sheet->IntegrityMetadata().empty()) || resource->IsLinkPreload()) { ResourceIntegrityDisposition disposition = cached_style_sheet->IntegrityDisposition();
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h index 7d8c8f04..59aff96 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h +++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
@@ -56,7 +56,7 @@ bool IsVisible() const { return is_visible_; } - bool HasSource() const { return !sources_.IsEmpty(); } + bool HasSource() const { return !sources_.empty(); } void Invoke(ExecutionContext*, Event*) override;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index 563839d..2283661 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -230,7 +230,7 @@ DCHECK(it != map.end()); WeakMediaElementSet* set = it->value; set->erase(element); - if (set->IsEmpty()) + if (set->empty()) map.erase(it); }
diff --git a/third_party/blink/renderer/core/html/parser/html_parser_idioms.cc b/third_party/blink/renderer/core/html/parser/html_parser_idioms.cc index 745bdd849..fafe25f 100644 --- a/third_party/blink/renderer/core/html/parser/html_parser_idioms.cc +++ b/third_party/blink/renderer/core/html/parser/html_parser_idioms.cc
@@ -418,7 +418,7 @@ // computeHashAndMaskTop8Bits is the function StringImpl::hash() uses. unsigned hash = StringHasher::ComputeHashAndMaskTop8Bits(characters, length); const WTF::StaticStringsTable& table = StringImpl::AllStaticStrings(); - DCHECK(!table.IsEmpty()); + DCHECK(!table.empty()); WTF::StaticStringsTable::const_iterator it = table.find(hash); if (it == table.end())
diff --git a/third_party/blink/renderer/core/html/parser/preload_request.cc b/third_party/blink/renderer/core/html/parser/preload_request.cc index 129c4676..edd8b9e 100644 --- a/third_party/blink/renderer/core/html/parser/preload_request.cc +++ b/third_party/blink/renderer/core/html/parser/preload_request.cc
@@ -40,7 +40,7 @@ bool PreloadRequest::ExclusionInfo::ShouldExclude( const KURL& base_url, const String& resource_url) const { - if (resources_.IsEmpty() && scopes_.IsEmpty()) + if (resources_.empty() && scopes_.empty()) return false; KURL url = KURL(base_url.IsEmpty() ? document_url_ : base_url, resource_url); if (resources_.Contains(url))
diff --git a/third_party/blink/renderer/core/html/portal/html_portal_element.cc b/third_party/blink/renderer/core/html/portal/html_portal_element.cc index 1d8bb14..29df784 100644 --- a/third_party/blink/renderer/core/html/portal/html_portal_element.cc +++ b/third_party/blink/renderer/core/html/portal/html_portal_element.cc
@@ -147,13 +147,13 @@ BlinkTransferableMessage data; data.message = SerializedScriptValue::UndefinedValue(); data.message->UnregisterMemoryAllocatedWithCurrentScriptContext(); - data.sender_origin = - GetExecutionContext()->GetSecurityOrigin()->IsolatedCopy(); + data.sender_origin = context->GetSecurityOrigin()->IsolatedCopy(); if (ThreadDebugger* debugger = ThreadDebugger::From(V8PerIsolateData::MainThreadIsolate())) { data.sender_stack_trace_id = debugger->StoreCurrentStackTrace("activate (implicit)"); } + data.sender_agent_cluster_id = context->GetAgentClusterID(); PortalContents* portal = std::exchange(portal_, nullptr); portal->Activate(std::move(data), @@ -282,6 +282,7 @@ return {}; msg.sender_origin = execution_context->GetSecurityOrigin()->IsolatedCopy(); + msg.sender_agent_cluster_id = execution_context->GetAgentClusterID(); // msg.user_activation is left out; we will probably handle user activation // explicitly for activate data.
diff --git a/third_party/blink/renderer/core/html/portal/portal_contents.cc b/third_party/blink/renderer/core/html/portal/portal_contents.cc index 8d546e4..84495e0 100644 --- a/third_party/blink/renderer/core/html/portal/portal_contents.cc +++ b/third_party/blink/renderer/core/html/portal/portal_contents.cc
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/core/dom/increment_load_event_delay_count.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/remote_frame.h" #include "third_party/blink/renderer/core/html/portal/document_portals.h" #include "third_party/blink/renderer/core/html/portal/html_portal_element.h"
diff --git a/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc b/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc index 087375d..6affd26 100644 --- a/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc +++ b/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc
@@ -50,6 +50,9 @@ transferable_message.sender_origin = execution_context->GetSecurityOrigin()->IsolatedCopy(); + transferable_message.sender_agent_cluster_id = + execution_context->GetAgentClusterID(); + if (ThreadDebugger* debugger = ThreadDebugger::From(script_state->GetIsolate())) { transferable_message.sender_stack_trace_id =
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc index 461ce9b..aa60d86 100644 --- a/third_party/blink/renderer/core/input/pointer_event_manager.cc +++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -1183,7 +1183,7 @@ // It's safe to assume that uniqueTouchEventIds won't wrap back to 0 from // 2^32-1 (>4.2 billion): even with a generous 100 unique ids per touch // sequence & one sequence per 10 second, it takes 13+ years to wrap back. - while (!touch_ids_for_canceled_pointerdowns_.IsEmpty()) { + while (!touch_ids_for_canceled_pointerdowns_.empty()) { uint32_t first_id = touch_ids_for_canceled_pointerdowns_.front(); if (first_id > unique_touch_event_id) return false;
diff --git a/third_party/blink/renderer/core/input/scroll_manager.cc b/third_party/blink/renderer/core/input/scroll_manager.cc index 07ce442..c46f64d 100644 --- a/third_party/blink/renderer/core/input/scroll_manager.cc +++ b/third_party/blink/renderer/core/input/scroll_manager.cc
@@ -109,7 +109,7 @@ // Send the overscroll event to the node that scrolling is latched to which // is either previously scrolled node or the last node in the scroll chain. Node* scroll_target = previous_gesture_scrolled_node_; - if (!scroll_target && !current_scroll_chain_.IsEmpty()) + if (!scroll_target && !current_scroll_chain_.empty()) scroll_target = DOMNodeIds::NodeForId(current_scroll_chain_.front()); return scroll_target; } @@ -179,7 +179,7 @@ const ScrollState& scroll_state, Deque<DOMNodeId>& scroll_chain, bool is_autoscroll) { - DCHECK(scroll_chain.IsEmpty()); + DCHECK(scroll_chain.empty()); scroll_chain.clear(); DCHECK(start_node.GetLayoutObject()); @@ -346,7 +346,7 @@ RecomputeScrollChain(*node, *scroll_state, scroll_chain, /* is_autoscroll */ false); - while (!scroll_chain.IsEmpty()) { + while (!scroll_chain.empty()) { Node* scroll_chain_node = DOMNodeIds::NodeForId(scroll_chain.TakeLast()); DCHECK(scroll_chain_node); @@ -440,7 +440,7 @@ frame_->GetDocument()->UpdateStyleAndLayout(DocumentUpdateReason::kScroll); } - DCHECK(!current_scroll_chain_.IsEmpty()); + DCHECK(!current_scroll_chain_.empty()); scroll_state.SetScrollChain(current_scroll_chain_); @@ -551,7 +551,7 @@ TRACE_EVENT_SCOPE_THREAD, "length", current_scroll_chain_.size()); - if (current_scroll_chain_.IsEmpty()) { + if (current_scroll_chain_.empty()) { // If a child has a non-empty scroll chain, we need to consider that instead // of simply returning WebInputEventResult::kNotHandled. return child_result; @@ -622,7 +622,7 @@ return result; } - if (current_scroll_chain_.IsEmpty()) { + if (current_scroll_chain_.empty()) { TRACE_EVENT_INSTANT0("input", "Empty Scroll Chain", TRACE_EVENT_SCOPE_THREAD); return WebInputEventResult::kNotHandled; @@ -784,7 +784,7 @@ } PassScrollGestureEvent(gesture_event, node->GetLayoutObject()); - if (current_scroll_chain_.IsEmpty()) { + if (current_scroll_chain_.empty()) { ClearGestureScrollState(); return WebInputEventResult::kNotHandled; } @@ -942,7 +942,7 @@ scroll_end_target); } } - if (current_scroll_chain_.IsEmpty()) { + if (current_scroll_chain_.empty()) { NotifyScrollPhaseEndForCustomizedScroll(); ClearGestureScrollState(); return;
diff --git a/third_party/blink/renderer/core/input/touch_event_manager.cc b/third_party/blink/renderer/core/input/touch_event_manager.cc index 039b6747..005a427 100644 --- a/third_party/blink/renderer/core/input/touch_event_manager.cc +++ b/third_party/blink/renderer/core/input/touch_event_manager.cc
@@ -221,7 +221,7 @@ } WebCoalescedInputEvent TouchEventManager::GenerateWebCoalescedInputEvent() { - DCHECK(!touch_attribute_map_.IsEmpty()); + DCHECK(!touch_attribute_map_.empty()); auto event = std::make_unique<WebTouchEvent>(); @@ -584,7 +584,7 @@ DCHECK_LE(event.GetType(), WebInputEvent::Type::kPointerTypeLast); DCHECK_NE(event.GetType(), WebInputEvent::Type::kPointerCausedUaAction); - if (touch_attribute_map_.IsEmpty()) { + if (touch_attribute_map_.empty()) { // Ideally we'd DCHECK(!m_touchSequenceDocument) here since we should // have cleared the active document when we saw the last release. But we // have some tests that violate this, ClusterFuzz could trigger it, and @@ -651,7 +651,7 @@ } touch_attribute_map_.RemoveAll(released_canceled_points); - if (touch_attribute_map_.IsEmpty()) { + if (touch_attribute_map_.empty()) { AllTouchesReleasedCleanup(); } @@ -673,11 +673,11 @@ } bool TouchEventManager::IsAnyTouchActive() const { - return !touch_attribute_map_.IsEmpty(); + return !touch_attribute_map_.empty(); } Element* TouchEventManager::CurrentTouchDownElement() { - if (touch_attribute_map_.IsEmpty() || touch_attribute_map_.size() > 1) + if (touch_attribute_map_.empty() || touch_attribute_map_.size() > 1) return nullptr; Node* touch_node = touch_attribute_map_.begin()->value->target_; return touch_node ? DynamicTo<Element>(*touch_node) : nullptr;
diff --git a/third_party/blink/renderer/core/inspector/dom_patch_support.cc b/third_party/blink/renderer/core/inspector/dom_patch_support.cc index 6ff95f0..d148771bf 100644 --- a/third_party/blink/renderer/core/inspector/dom_patch_support.cc +++ b/third_party/blink/renderer/core/inspector/dom_patch_support.cc
@@ -526,7 +526,7 @@ void DOMPatchSupport::MarkNodeAsUsed(Digest* digest) { HeapDeque<Member<Digest>> queue; queue.push_back(digest); - while (!queue.IsEmpty()) { + while (!queue.empty()) { Digest* first = queue.TakeFirst(); unused_nodes_map_.erase(first->sha1_); for (wtf_size_t i = 0; i < first->children_.size(); ++i)
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index 3e051df..f1d746e 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -828,7 +828,7 @@ } } - if (document_css_style_sheets->IsEmpty()) + if (document_css_style_sheets->empty()) document_to_css_style_sheets_.erase(document); } @@ -840,7 +840,7 @@ void InspectorCSSAgent::ForcePseudoState(Element* element, CSSSelector::PseudoType pseudo_type, bool* result) { - if (node_id_to_forced_pseudo_state_.IsEmpty()) + if (node_id_to_forced_pseudo_state_.empty()) return; int node_id = dom_agent_->BoundNodeId(element); @@ -2928,7 +2928,7 @@ void InspectorCSSAgent::takeComputedStyleUpdates( std::unique_ptr<TakeComputedStyleUpdatesCallback> callback) { - if (tracked_computed_styles_.IsEmpty()) { + if (tracked_computed_styles_.empty()) { callback->sendFailure(Response::ServerError( "No computed styles are being tracked right now.")); return; @@ -2952,7 +2952,7 @@ void InspectorCSSAgent::DidUpdateComputedStyle(Element* element, const ComputedStyle* old_style, const ComputedStyle* new_style) { - if (tracked_computed_styles_.IsEmpty()) + if (tracked_computed_styles_.empty()) return; if (!old_style && !new_style)
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc index d5f7704b..d850a88 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
@@ -812,7 +812,7 @@ } void InspectorDOMDebuggerAgent::DidRemoveBreakpoint() { - if (!dom_breakpoints_.IsEmpty()) + if (!dom_breakpoints_.empty()) return; if (!csp_violation_breakpoints_.IsEmpty()) return;
diff --git a/third_party/blink/renderer/core/inspector/inspector_media_context_impl_unittest.cc b/third_party/blink/renderer/core/inspector/inspector_media_context_impl_unittest.cc index 95e8e83..1b0c777 100644 --- a/third_party/blink/renderer/core/inspector/inspector_media_context_impl_unittest.cc +++ b/third_party/blink/renderer/core/inspector/inspector_media_context_impl_unittest.cc
@@ -42,7 +42,7 @@ EXPECT_TRUE(players->at(id)->errors.empty()); EXPECT_TRUE(players->at(id)->events.empty()); EXPECT_TRUE(players->at(id)->messages.empty()); - EXPECT_TRUE(players->at(id)->properties.IsEmpty()); + EXPECT_TRUE(players->at(id)->properties.empty()); impl->NotifyPlayerEvents(id, MakeEvents(10)); EXPECT_EQ(players->at(id)->events.size(), wtf_size_t{10});
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc index 5547b65..d342f0e 100644 --- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -2026,7 +2026,7 @@ } // If invoked with an empty list, it means none of the encodings should be // accepted. See InspectorNetworkAgent::PrepareRequest. - if (accepted_encodings.IsEmpty()) + if (accepted_encodings.empty()) accepted_encodings.insert("none"); // Set the inspector state.
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state.h b/third_party/blink/renderer/core/inspector/inspector_session_state.h index ef5fb0c0..6680287 100644 --- a/third_party/blink/renderer/core/inspector/inspector_session_state.h +++ b/third_party/blink/renderer/core/inspector/inspector_session_state.h
@@ -183,7 +183,7 @@ } // O(1) shortcut for Keys().empty(). - bool IsEmpty() const { return map_.IsEmpty(); } + bool IsEmpty() const { return map_.empty(); } // Returns the value for a given |key|, or the default value if // the key wasn't set.
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc index d86321a..9f2b218a 100644 --- a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc +++ b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc
@@ -215,7 +215,7 @@ // The cookie should be empty since everything is cleared. DevToolsSessionStatePtr cookie = dev_tools_session.CloneCookie(); - EXPECT_TRUE(cookie->entries.IsEmpty()); + EXPECT_TRUE(cookie->entries.empty()); } TEST(InspectorSessionStateTest, MultipleAgents) { @@ -267,6 +267,6 @@ dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); } - EXPECT_TRUE(dev_tools_session.CloneCookie()->entries.IsEmpty()); + EXPECT_TRUE(dev_tools_session.CloneCookie()->entries.empty()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_task_runner.cc b/third_party/blink/renderer/core/inspector/inspector_task_runner.cc index 539de0f..c5067968 100644 --- a/third_party/blink/renderer/core/inspector/inspector_task_runner.cc +++ b/third_party/blink/renderer/core/inspector/inspector_task_runner.cc
@@ -57,7 +57,7 @@ InspectorTaskRunner::Task InspectorTaskRunner::TakeNextInterruptingTask() { base::AutoLock locker(lock_); - if (disposed_ || interrupting_task_queue_.IsEmpty()) + if (disposed_ || interrupting_task_queue_.empty()) return Task(); return interrupting_task_queue_.TakeFirst();
diff --git a/third_party/blink/renderer/core/inspector/network_resources_data.cc b/third_party/blink/renderer/core/inspector/network_resources_data.cc index 9f7d205..6601721 100644 --- a/third_party/blink/renderer/core/inspector/network_resources_data.cc +++ b/third_party/blink/renderer/core/inspector/network_resources_data.cc
@@ -404,7 +404,7 @@ } void NetworkResourcesData::Clear(const String& preserved_loader_id) { - if (request_id_to_resource_data_map_.IsEmpty()) + if (request_id_to_resource_data_map_.empty()) return; request_ids_deque_.clear(); content_size_ = 0;
diff --git a/third_party/blink/renderer/core/inspector/worker_thread_debugger.cc b/third_party/blink/renderer/core/inspector/worker_thread_debugger.cc index 2d98341..d927d3e 100644 --- a/third_party/blink/renderer/core/inspector/worker_thread_debugger.cc +++ b/third_party/blink/renderer/core/inspector/worker_thread_debugger.cc
@@ -69,7 +69,7 @@ paused_context_group_id_(kInvalidContextGroupId) {} WorkerThreadDebugger::~WorkerThreadDebugger() { - DCHECK(worker_threads_.IsEmpty()); + DCHECK(worker_threads_.empty()); } void WorkerThreadDebugger::ReportConsoleMessage(
diff --git a/third_party/blink/renderer/core/intersection_observer/element_intersection_observer_data.h b/third_party/blink/renderer/core/intersection_observer/element_intersection_observer_data.h index 9369314c..6a8e81c 100644 --- a/third_party/blink/renderer/core/intersection_observer/element_intersection_observer_data.h +++ b/third_party/blink/renderer/core/intersection_observer/element_intersection_observer_data.h
@@ -35,9 +35,7 @@ void AddObserver(IntersectionObserver&); void RemoveObservation(IntersectionObservation&); void RemoveObserver(IntersectionObserver&); - bool IsEmpty() const { - return observations_.IsEmpty() && observers_.IsEmpty(); - } + bool IsEmpty() const { return observations_.empty() && observers_.empty(); } void TrackWithController(IntersectionObserverController&); void StopTrackingWithController(IntersectionObserverController&);
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc index b1e6bd1..a45ef88 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
@@ -392,7 +392,7 @@ observation->Disconnect(); observations_.erase(observation); active_observations_.erase(observation); - if (root() && root()->isConnected() && observations_.IsEmpty()) { + if (root() && root()->isConnected() && observations_.empty()) { root() ->GetDocument() .EnsureIntersectionObserverController() @@ -463,7 +463,7 @@ unsigned flags, absl::optional<base::TimeTicks>& monotonic_time) { DCHECK(!RootIsImplicit()); - if (!RootIsValid() || !GetExecutionContext() || observations_.IsEmpty()) + if (!RootIsValid() || !GetExecutionContext() || observations_.empty()) return 0; // If we're processing post-layout deliveries only and we're not a post-layout @@ -508,7 +508,7 @@ void IntersectionObserver::ReportUpdates(IntersectionObservation& observation) { DCHECK_EQ(observation.Observer(), this); - bool needs_scheduling = active_observations_.IsEmpty(); + bool needs_scheduling = active_observations_.empty(); active_observations_.insert(&observation); if (needs_scheduling) {
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.h b/third_party/blink/renderer/core/intersection_observer/intersection_observer.h index 8bf51c1..276d605 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.h +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.h
@@ -154,10 +154,10 @@ // root just because root_ is null. Hence root_is_implicit_. bool RootIsImplicit() const { return root_is_implicit_; } - bool HasObservations() const { return !observations_.IsEmpty(); } + bool HasObservations() const { return !observations_.empty(); } bool AlwaysReportRootBounds() const { return always_report_root_bounds_; } bool NeedsOcclusionTracking() const { - return trackVisibility() && !observations_.IsEmpty(); + return trackVisibility() && !observations_.empty(); } DOMHighResTimeStamp GetTimeStamp(base::TimeTicks monotonic_time) const; @@ -202,7 +202,7 @@ } private: - bool NeedsDelivery() const { return !active_observations_.IsEmpty(); } + bool NeedsDelivery() const { return !active_observations_.empty(); } void ProcessCustomWeakness(const LivenessBroker&); const Member<IntersectionObserverDelegate> delegate_;
diff --git a/third_party/blink/renderer/core/layout/custom_scrollbar.cc b/third_party/blink/renderer/core/layout/custom_scrollbar.cc index a34a469..cbca378 100644 --- a/third_party/blink/renderer/core/layout/custom_scrollbar.cc +++ b/third_party/blink/renderer/core/layout/custom_scrollbar.cc
@@ -49,7 +49,7 @@ CustomScrollbar::~CustomScrollbar() { DCHECK(!scrollable_area_); - DCHECK(parts_.IsEmpty()); + DCHECK(parts_.empty()); } int CustomScrollbar::HypotheticalScrollbarThickness(
diff --git a/third_party/blink/renderer/core/layout/deferred_shaping_controller.cc b/third_party/blink/renderer/core/layout/deferred_shaping_controller.cc index d453179..ed45f58 100644 --- a/third_party/blink/renderer/core/layout/deferred_shaping_controller.cc +++ b/third_party/blink/renderer/core/layout/deferred_shaping_controller.cc
@@ -46,7 +46,7 @@ } bool DeferredShapingController::IsRegisteredDeferred(Element& element) const { - return !deferred_elements_.IsEmpty() && deferred_elements_.Contains(&element); + return !deferred_elements_.empty() && deferred_elements_.Contains(&element); } void DeferredShapingController::UnregisterDeferred(Element& element) { @@ -72,7 +72,7 @@ return; if (!document_->HasFinishedParsing()) return; - if (!default_allow_deferred_shaping_ && deferred_elements_.IsEmpty()) + if (!default_allow_deferred_shaping_ && deferred_elements_.empty()) return; default_allow_deferred_shaping_ = false; // Cancels the last resort task. @@ -84,7 +84,7 @@ } size_t DeferredShapingController::ReshapeAllDeferredInternal() { - if (deferred_elements_.IsEmpty()) + if (deferred_elements_.empty()) return 0; size_t count = 0; for (auto& element : deferred_elements_) {
diff --git a/third_party/blink/renderer/core/layout/depth_ordered_layout_object_list.cc b/third_party/blink/renderer/core/layout/depth_ordered_layout_object_list.cc index c2734c27..a6f9420 100644 --- a/third_party/blink/renderer/core/layout/depth_ordered_layout_object_list.cc +++ b/third_party/blink/renderer/core/layout/depth_ordered_layout_object_list.cc
@@ -46,7 +46,7 @@ } bool DepthOrderedLayoutObjectList::IsEmpty() const { - return data_->objects().IsEmpty(); + return data_->objects().empty(); } namespace { @@ -102,7 +102,7 @@ const HeapVector<LayoutObjectWithDepth>& DepthOrderedLayoutObjectList::Ordered() { - if (data_->objects_.IsEmpty() || !data_->ordered_objects_.empty()) + if (data_->objects_.empty() || !data_->ordered_objects_.empty()) return data_->ordered_objects_; CopyToVector(data_->objects_, data_->ordered_objects_);
diff --git a/third_party/blink/renderer/core/layout/floating_objects.cc b/third_party/blink/renderer/core/layout/floating_objects.cc index eea3e1b..f536b83 100644 --- a/third_party/blink/renderer/core/layout/floating_objects.cc +++ b/third_party/blink/renderer/core/layout/floating_objects.cc
@@ -489,7 +489,7 @@ } void FloatingObjects::MoveAllToFloatInfoMap(LayoutBoxToFloatInfoMap& map) { - while (!set_.IsEmpty()) { + while (!set_.empty()) { FloatingObject* floating_object = set_.front(); set_.RemoveFirst(); LayoutBox* layout_object = floating_object->GetLayoutObject(); @@ -580,7 +580,7 @@ void FloatingObjects::ComputePlacedFloatsTree() { DCHECK(!placed_floats_tree_.IsInitialized()); - if (set_.IsEmpty()) + if (set_.empty()) return; placed_floats_tree_.InitIfNeeded(layout_object_->View()->GetIntervalArena()); FloatingObjectSetIterator it = set_.begin();
diff --git a/third_party/blink/renderer/core/layout/grid.cc b/third_party/blink/renderer/core/layout/grid.cc index 436b4ac..c790d36 100644 --- a/third_party/blink/renderer/core/layout/grid.cc +++ b/third_party/blink/renderer/core/layout/grid.cc
@@ -56,7 +56,7 @@ #if DCHECK_IS_ON() bool Grid::HasAnyGridItemPaintOrder() const { - return !grid_items_indexes_map_.IsEmpty(); + return !grid_items_indexes_map_.empty(); } #endif
diff --git a/third_party/blink/renderer/core/layout/grid.h b/third_party/blink/renderer/core/layout/grid.h index b467415..fd88bb42 100644 --- a/third_party/blink/renderer/core/layout/grid.h +++ b/third_party/blink/renderer/core/layout/grid.h
@@ -64,7 +64,7 @@ } // Note that out of flow children are not grid items. - bool HasGridItems() const { return !grid_item_area_.IsEmpty(); } + bool HasGridItems() const { return !grid_item_area_.empty(); } GridArea GridItemArea(const LayoutBox&) const; void SetGridItemArea(const LayoutBox&, GridArea);
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index ed059191..23c5f03 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -151,7 +151,7 @@ if (HasPositionedObjects()) { TrackedLayoutBoxLinkedHashSet* descendants = GetPositionedDescendantsMap().Take(this); - DCHECK(!descendants->IsEmpty()); + DCHECK(!descendants->empty()); for (LayoutBox* descendant : *descendants) { DCHECK_EQ(GetPositionedContainerMap().at(descendant), this); GetPositionedContainerMap().erase(descendant); @@ -160,7 +160,7 @@ if (HasPercentHeightDescendants()) { TrackedLayoutBoxLinkedHashSet* descendants = GetPercentHeightDescendantsMap().Take(this); - DCHECK(!descendants->IsEmpty()); + DCHECK(!descendants->empty()); for (LayoutBox* descendant : *descendants) { DCHECK_EQ(descendant->PercentHeightContainer(), this); descendant->SetPercentHeightContainer(nullptr); @@ -1059,7 +1059,7 @@ DCHECK(positioned_descendants); DCHECK(positioned_descendants->Contains(o)); positioned_descendants->erase(o); - if (positioned_descendants->IsEmpty()) { + if (positioned_descendants->empty()) { GetPositionedDescendantsMap().erase(container); container->has_positioned_objects_ = false; } @@ -1163,7 +1163,7 @@ positioned_descendants->erase(object); GetPositionedContainerMap().erase(object); } - if (positioned_descendants->IsEmpty()) { + if (positioned_descendants->empty()) { GetPositionedDescendantsMap().erase(this); has_positioned_objects_ = false; } @@ -1216,7 +1216,7 @@ if (TrackedLayoutBoxLinkedHashSet* descendants = PercentHeightDescendants()) { descendants->erase(descendant); descendant->SetPercentHeightContainer(nullptr); - if (descendants->IsEmpty()) { + if (descendants->empty()) { GetPercentHeightDescendantsMap().erase(this); has_percent_height_descendants_ = false; } @@ -1244,7 +1244,7 @@ return; TrackedLayoutBoxLinkedHashSet* descendants = &*it->value; descendants->erase(&svg_text); - if (descendants->IsEmpty()) { + if (descendants->empty()) { map.erase(this); has_svg_text_descendants_ = false; }
diff --git a/third_party/blink/renderer/core/layout/layout_block.h b/third_party/blink/renderer/core/layout/layout_block.h index c30bf670..4ab208d 100644 --- a/third_party/blink/renderer/core/layout/layout_block.h +++ b/third_party/blink/renderer/core/layout/layout_block.h
@@ -182,7 +182,7 @@ bool HasPositionedObjects() const { NOT_DESTROYED(); DCHECK(has_positioned_objects_ ? (PositionedObjectsInternal() && - !PositionedObjectsInternal()->IsEmpty()) + !PositionedObjectsInternal()->empty()) : !PositionedObjectsInternal()); return has_positioned_objects_; } @@ -204,7 +204,7 @@ NOT_DESTROYED(); DCHECK(has_percent_height_descendants_ ? (PercentHeightDescendantsInternal() && - !PercentHeightDescendantsInternal()->IsEmpty()) + !PercentHeightDescendantsInternal()->empty()) : !PercentHeightDescendantsInternal()); return has_percent_height_descendants_; }
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc index 1fe9c94a..68209a1f 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -1434,7 +1434,7 @@ if (floating_objects_) { floating_objects_->Clear(); } - if (!old_intruding_float_set.IsEmpty()) + if (!old_intruding_float_set.empty()) MarkAllDescendantsWithFloatsForLayout(); return; } @@ -1569,7 +1569,7 @@ } MarkLinesDirtyInBlockRange(change_logical_top, change_logical_bottom); - } else if (!old_intruding_float_set.IsEmpty()) { + } else if (!old_intruding_float_set.empty()) { // If there are previously intruding floats that no longer intrude, then // children with floats should also get layout because they might need their // floating object lists cleared. @@ -1579,9 +1579,9 @@ const FloatingObjectSet& floating_object_set = floating_objects_->Set(); FloatingObjectSetIterator end = floating_object_set.end(); for (FloatingObjectSetIterator it = floating_object_set.begin(); - it != end && !old_intruding_float_set.IsEmpty(); ++it) + it != end && !old_intruding_float_set.empty(); ++it) old_intruding_float_set.erase((*it)->GetLayoutObject()); - if (!old_intruding_float_set.IsEmpty()) + if (!old_intruding_float_set.empty()) MarkAllDescendantsWithFloatsForLayout(); } } @@ -3591,7 +3591,7 @@ while (curr != last_float && (!curr->IsPlaced() || LogicalTopForFloat(*curr) >= logical_offset)) { floating_objects_->Remove(curr); - if (floating_object_set.IsEmpty()) + if (floating_object_set.empty()) break; curr = floating_object_set.back().Get(); } @@ -3625,7 +3625,7 @@ return false; const FloatingObjectSet& floating_object_set = floating_objects_->Set(); - if (floating_object_set.IsEmpty()) + if (floating_object_set.empty()) return false; // If all floats have already been positioned, then we have no work to do.
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.h b/third_party/blink/renderer/core/layout/layout_block_flow.h index d17e11e9..3360b06 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.h +++ b/third_party/blink/renderer/core/layout/layout_block_flow.h
@@ -240,7 +240,7 @@ bool ContainsFloats() const { NOT_DESTROYED(); - return floating_objects_ && !floating_objects_->Set().IsEmpty(); + return floating_objects_ && !floating_objects_->Set().empty(); } bool ContainsFloat(LayoutBox*) const;
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc index 87f72bf..da939c4 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc
@@ -597,7 +597,7 @@ glyph_bounds.Union(word_glyph_bounds); measured_width += word_measurement.width; } - if (!word_measurement.fallback_fonts.IsEmpty()) { + if (!word_measurement.fallback_fonts.empty()) { HashSet<const SimpleFontData*>::const_iterator end = word_measurement.fallback_fonts.end(); for (HashSet<const SimpleFontData*>::const_iterator it = @@ -631,7 +631,7 @@ glyph_overflow.SetFromBounds(glyph_bounds, font, measured_width); run->box_->SetLogicalWidth(LayoutUnit(measured_width) + hyphen_width); - if (!fallback_fonts.IsEmpty()) { + if (!fallback_fonts.empty()) { DCHECK(run->box_->IsText()); GlyphOverflowAndFallbackFontsMap::ValueType* it = text_box_data_map @@ -1076,7 +1076,7 @@ } layout_state.SetFloatIndex(layout_state.FloatIndex() + 1); } - layout_state.SetLastFloat(!floating_object_set.IsEmpty() + layout_state.SetLastFloat(!floating_object_set.empty() ? floating_object_set.back().Get() : nullptr); }
diff --git a/third_party/blink/renderer/core/layout/layout_flow_thread.h b/third_party/blink/renderer/core/layout/layout_flow_thread.h index 96ce645..4fec3af 100644 --- a/third_party/blink/renderer/core/layout/layout_flow_thread.h +++ b/third_party/blink/renderer/core/layout/layout_flow_thread.h
@@ -171,7 +171,7 @@ } bool HasValidColumnSetInfo() const { NOT_DESTROYED(); - return !column_sets_invalidated_ && !multi_column_set_list_.IsEmpty(); + return !column_sets_invalidated_ && !multi_column_set_list_.empty(); } bool MapToVisualRectInAncestorSpaceInternal(
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc index 06e83b9f..5323244d 100644 --- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc +++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
@@ -503,7 +503,7 @@ } } else { DCHECK(!column_sets_invalidated_); - if (multi_column_set_list_.IsEmpty()) + if (multi_column_set_list_.empty()) return nullptr; if (offset < LayoutUnit()) { column_set = multi_column_set_list_.front(); @@ -513,7 +513,7 @@ .AllOverlapsWithAdapter<MultiColumnSetSearchAdapter>(adapter); // If no set was found, the offset is in the flow thread overflow. - if (!adapter.Result() && !multi_column_set_list_.IsEmpty()) + if (!adapter.Result() && !multi_column_set_list_.empty()) column_set = multi_column_set_list_.back(); else column_set = adapter.Result();
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index be79ccb..e99e7dc 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -1722,9 +1722,9 @@ glyph_overflow.SetFromBounds(glyph_bounds, f, max_width_); // We shouldn't change our mind once we "know". DCHECK(!known_to_have_no_overflow_and_no_fallback_fonts_ || - (fallback_fonts.IsEmpty() && glyph_overflow.IsApproximatelyZero())); + (fallback_fonts.empty() && glyph_overflow.IsApproximatelyZero())); known_to_have_no_overflow_and_no_fallback_fonts_ = - fallback_fonts.IsEmpty() && glyph_overflow.IsApproximatelyZero(); + fallback_fonts.empty() && glyph_overflow.IsApproximatelyZero(); ClearIntrinsicLogicalWidthsDirty(); }
diff --git a/third_party/blink/renderer/core/layout/line/inline_flow_box.cc b/third_party/blink/renderer/core/layout/line/inline_flow_box.cc index 09786638..b8fbc28 100644 --- a/third_party/blink/renderer/core/layout/line/inline_flow_box.cc +++ b/third_party/blink/renderer/core/layout/line/inline_flow_box.cc
@@ -1225,7 +1225,7 @@ &fallback_fonts, &glyph_bounds); const Font& font = layout_text.StyleRef().GetFont(); glyph_overflow.SetFromBounds(glyph_bounds, font, measured_width); - if (!fallback_fonts.IsEmpty()) { + if (!fallback_fonts.empty()) { GlyphOverflowAndFallbackFontsMap::ValueType* it = text_box_data_map .insert(text, std::make_pair(Vector<const SimpleFontData*>(), @@ -1279,7 +1279,7 @@ text_box_overflow.SetWidth( LayoutUnit(text_box_overflow.Width() + text->NewlineSpaceWidth())); } else { - if (text_box_data_map.IsEmpty()) { + if (text_box_data_map.empty()) { // An empty glyph map means that we're computing overflow without // a layout, so calculate the glyph overflow on the fly. GlyphOverflowAndFallbackFontsMap glyph_overflow_for_text;
diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc index e64030c..eb7efe0 100644 --- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
@@ -1724,7 +1724,7 @@ // to reflect the expansion. if (item_expansion > LayoutUnit()) { // Maps don't allow keys of 0, so adjust the index by 1. - if (row_cross_size_updates_.IsEmpty() || + if (row_cross_size_updates_.empty() || !row_cross_size_updates_.Contains(flex_line_idx + 1)) { row_cross_size_updates_.insert(flex_line_idx + 1, item_expansion); AdjustOffsetForNextLine(flex_line_outputs, flex_line_idx, @@ -1789,7 +1789,7 @@ status == NGLayoutResult::kNeedsEarlierBreak) return NGLayoutResult::kNeedsEarlierBreak; - if (!row_cross_size_updates_.IsEmpty()) { + if (!row_cross_size_updates_.empty()) { DCHECK(!is_column_); return NGLayoutResult::kNeedsRelayoutWithRowCrossSizeChanges; } @@ -2543,7 +2543,7 @@ DCHECK(!cross_size_adjustments_); // There should be no more than two row expansions per fragmentainer. - DCHECK(!row_cross_size_updates_.IsEmpty()); + DCHECK(!row_cross_size_updates_.empty()); DCHECK_LE(row_cross_size_updates_.size(), 2u); NGLayoutAlgorithmParams params(
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc index 8f83aa44..8b06574 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc
@@ -1596,8 +1596,7 @@ EXPECT_EQ(computed_grid_row_track_list.axis_type, GridAxisType::kSubgriddedAxis); - EXPECT_TRUE( - computed_grid_column_track_list.ordered_named_grid_lines.IsEmpty()); + EXPECT_TRUE(computed_grid_column_track_list.ordered_named_grid_lines.empty()); const OrderedNamedGridLines& ordered_named_grid_row_lines = computed_grid_row_track_list.ordered_named_grid_lines;
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc index a1375ec..04d36f22 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
@@ -37,18 +37,18 @@ const NamedGridLinesMap& auto_repeat_grid_line_names = computed_grid_track_list.auto_repeat_named_grid_lines; - if (!grid_line_names.IsEmpty() && are_named_lines_valid) { + if (!grid_line_names.empty() && are_named_lines_valid) { auto it = grid_line_names.find(named_line); named_lines_indexes_ = it == grid_line_names.end() ? nullptr : &it->value; } - if (!auto_repeat_grid_line_names.IsEmpty() && are_named_lines_valid) { + if (!auto_repeat_grid_line_names.empty() && are_named_lines_valid) { auto it = auto_repeat_grid_line_names.find(named_line); auto_repeat_named_lines_indexes_ = it == auto_repeat_grid_line_names.end() ? nullptr : &it->value; } - if (!implicit_grid_line_names.IsEmpty()) { + if (!implicit_grid_line_names.empty()) { auto it = implicit_grid_line_names.find(named_line); implicit_named_lines_indexes_ = it == implicit_grid_line_names.end() ? nullptr : &it->value;
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc index b7f7970..45bc9d7 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc
@@ -636,7 +636,7 @@ } void NGGridPlacement::PlacedGridItemsList::AppendCurrentItemsToOrderedList() { - DCHECK(ordered_list.IsEmpty()); + DCHECK(ordered_list.empty()); auto ComparePlacedGridItemPointers = [](const std::unique_ptr<PlacedGridItem>& lhs,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/inline_containing_block_utils.cc b/third_party/blink/renderer/core/layout/ng/inline/inline_containing_block_utils.cc index 9e8c571d..e60b2f0f 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/inline_containing_block_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/inline_containing_block_utils.cc
@@ -110,7 +110,7 @@ void InlineContainingBlockUtils::ComputeInlineContainerGeometry( InlineContainingBlockMap* inline_containing_block_map, NGBoxFragmentBuilder* container_builder) { - if (inline_containing_block_map->IsEmpty()) + if (inline_containing_block_map->empty()) return; // This function requires that we have the final size of the fragment set @@ -171,7 +171,7 @@ const LayoutBox* box, PhysicalSize accumulated_containing_block_size, InlineContainingBlockMap* inline_containing_block_map) { - if (inline_containing_block_map->IsEmpty()) + if (inline_containing_block_map->empty()) return; #if DCHECK_IS_ON() // Make sure all entries are a continuation root.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h index 3d89121..4526dc21 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h +++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h
@@ -45,7 +45,7 @@ DISALLOW_NEW(); public: - bool IsEmpty() const { return anchor_references_.IsEmpty(); } + bool IsEmpty() const { return anchor_references_.empty(); } const NGPhysicalAnchorReference* AnchorReference( const AtomicString& name) const; @@ -94,7 +94,7 @@ class CORE_EXPORT NGLogicalAnchorQuery : public GarbageCollected<NGLogicalAnchorQuery> { public: - bool IsEmpty() const { return anchor_references_.IsEmpty(); } + bool IsEmpty() const { return anchor_references_.empty(); } const NGLogicalAnchorReference* AnchorReference( const AtomicString& name) const; @@ -144,7 +144,7 @@ public: bool HasAnchorsOnOutOfFlowObjects() const { return has_anchors_on_oofs_; } bool ShouldLayoutByContainingBlock() const { - return !queries_.IsEmpty() || has_anchors_on_oofs_; + return !queries_.empty() || has_anchors_on_oofs_; } // Get |NGLogicalAnchorQuery| in the stitched coordinate system for the given
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc index db8ad67..55eb802 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -277,7 +277,7 @@ void NGContainerFragmentBuilder::SwapMulticolsWithPendingOOFs( MulticolCollection* multicols_with_pending_oofs) { - DCHECK(multicols_with_pending_oofs->IsEmpty()); + DCHECK(multicols_with_pending_oofs->empty()); std::swap(multicols_with_pending_oofs_, *multicols_with_pending_oofs); } @@ -433,13 +433,13 @@ NGFragmentedOutOfFlowData* oof_data = fragment.FragmentedOutOfFlowData(); if (!oof_data) return; - DCHECK(!oof_data->multicols_with_pending_oofs.IsEmpty() || + DCHECK(!oof_data->multicols_with_pending_oofs.empty() || !oof_data->oof_positioned_fragmentainer_descendants.empty()); const NGPhysicalBoxFragment* box_fragment = DynamicTo<NGPhysicalBoxFragment>(&fragment); bool is_column_spanner = box_fragment && box_fragment->IsColumnSpanAll(); - if (!oof_data->multicols_with_pending_oofs.IsEmpty()) { + if (!oof_data->multicols_with_pending_oofs.empty()) { const auto& multicols_with_pending_oofs = oof_data->multicols_with_pending_oofs; for (auto& multicol : multicols_with_pending_oofs) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h index 4c55db1..1c33b51 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -216,7 +216,7 @@ } bool HasMulticolsWithPendingOOFs() const { - return !multicols_with_pending_oofs_.IsEmpty(); + return !multicols_with_pending_oofs_.empty(); } HeapVector<NGLogicalOutOfFlowPositionedNode>*
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 5cfb452..de3eddd7 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -809,9 +809,9 @@ NGContainerFragmentBuilder::MulticolCollection multicols_with_pending_oofs; container_builder->SwapMulticolsWithPendingOOFs(&multicols_with_pending_oofs); - DCHECK(!multicols_with_pending_oofs.IsEmpty()); + DCHECK(!multicols_with_pending_oofs.empty()); - while (!multicols_with_pending_oofs.IsEmpty()) { + while (!multicols_with_pending_oofs.empty()) { for (auto& multicol : multicols_with_pending_oofs) LayoutOOFsInMulticol(NGBlockNode(multicol.key), multicol.value); multicols_with_pending_oofs.clear();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h index e2139d2..1d24890 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h
@@ -353,7 +353,7 @@ bool NeedsOOFPositionedInfoPropagation() const { return !oof_positioned_fragmentainer_descendants.empty() || - !multicols_with_pending_oofs.IsEmpty(); + !multicols_with_pending_oofs.empty(); } static base::span<NGPhysicalOOFNodeForFragmentation>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc index 60f499c..b5e67028 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -525,7 +525,7 @@ DCHECK(has_fragmented_out_of_flow_data_); DCHECK_EQ(has_fragmented_out_of_flow_data_, !builder->oof_positioned_fragmentainer_descendants_.empty() || - !builder->multicols_with_pending_oofs_.IsEmpty()); + !builder->multicols_with_pending_oofs_.empty()); NGFragmentedOutOfFlowData* fragmented_data = MakeGarbageCollected<NGFragmentedOutOfFlowData>(); fragmented_data->oof_positioned_fragmentainer_descendants.ReserveCapacity(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc index bc88ec90..c2a3e63 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -362,7 +362,7 @@ use_last_baseline_for_inline_baseline_(false), has_fragmented_out_of_flow_data_( !builder->oof_positioned_fragmentainer_descendants_.empty() || - !builder->multicols_with_pending_oofs_.IsEmpty()), + !builder->multicols_with_pending_oofs_.empty()), has_out_of_flow_fragment_child_(builder->HasOutOfFlowFragmentChild()), has_out_of_flow_in_fragmentainer_subtree_( builder->HasOutOfFlowInFragmentainerSubtree()), @@ -503,14 +503,14 @@ return nullptr; auto* oof_data = reinterpret_cast<NGFragmentedOutOfFlowData*>(oof_data_.Get()); - DCHECK(!oof_data->multicols_with_pending_oofs.IsEmpty() || + DCHECK(!oof_data->multicols_with_pending_oofs.empty() || !oof_data->oof_positioned_fragmentainer_descendants.empty()); return oof_data; } bool NGPhysicalFragment::HasNestedMulticolsWithOOFs() const { const NGFragmentedOutOfFlowData* oof_data = FragmentedOutOfFlowData(); - return oof_data && !oof_data->multicols_with_pending_oofs.IsEmpty(); + return oof_data && !oof_data->multicols_with_pending_oofs.empty(); } bool NGPhysicalFragment::NeedsOOFPositionedInfoPropagation() const {
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.cc b/third_party/blink/renderer/core/layout/text_autosizer.cc index 73e7f1b..2cb347e 100644 --- a/third_party/blink/renderer/core/layout/text_autosizer.cc +++ b/third_party/blink/renderer/core/layout/text_autosizer.cc
@@ -1394,7 +1394,7 @@ BlockSet& blocks = *blocks_iter->value; blocks.erase(To<LayoutBlock>(layout_object)); - if (blocks.IsEmpty()) { + if (blocks.empty()) { blocks_for_fingerprint_.erase(blocks_iter); SuperclusterMap::iterator supercluster_iter = @@ -1540,7 +1540,7 @@ void TextAutosizer::CheckSuperclusterConsistency() { HeapHashSet<Member<Supercluster>>& potentially_inconsistent_superclusters = fingerprint_mapper_.GetPotentiallyInconsistentSuperclusters(); - if (potentially_inconsistent_superclusters.IsEmpty()) + if (potentially_inconsistent_superclusters.empty()) return; for (Supercluster* supercluster : potentially_inconsistent_superclusters) {
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.h b/third_party/blink/renderer/core/layout/text_autosizer.h index 4b84318..a492e69 100644 --- a/third_party/blink/renderer/core/layout/text_autosizer.h +++ b/third_party/blink/renderer/core/layout/text_autosizer.h
@@ -272,7 +272,7 @@ Fingerprint Get(const LayoutObject*); BlockSet* GetTentativeClusterRoots(Fingerprint); Supercluster* CreateSuperclusterIfNeeded(LayoutBlock*, bool& is_new_entry); - bool HasFingerprints() const { return !fingerprints_.IsEmpty(); } + bool HasFingerprints() const { return !fingerprints_.empty(); } HeapHashSet<Member<Supercluster>>& GetPotentiallyInconsistentSuperclusters() { return potentially_inconsistent_superclusters_;
diff --git a/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc b/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc index bab69b2..32a9fc7 100644 --- a/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc +++ b/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc
@@ -121,7 +121,7 @@ alternative_resources_it->value.emplace_back(std::move(alt_resource)); } } - if (alternative_resources.IsEmpty()) + if (alternative_resources.empty()) return nullptr; return std::make_unique<AlternateSignedExchangeResourceInfo>( std::move(alternative_resources));
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 98288705..f8f46be 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -2800,7 +2800,7 @@ if (RuntimeEnabledFeatures::EarlyHintsPreloadForNavigationOptInEnabled( frame_->DomWindow()) && - !early_hints_preloaded_resources_.IsEmpty()) { + !early_hints_preloaded_resources_.empty()) { CountUse(WebFeature::kEarlyHintsPreload); } }
diff --git a/third_party/blink/renderer/core/loader/document_loader_test.cc b/third_party/blink/renderer/core/loader/document_loader_test.cc index c9ab3a7..cb797a35 100644 --- a/third_party/blink/renderer/core/loader/document_loader_test.cc +++ b/third_party/blink/renderer/core/loader/document_loader_test.cc
@@ -169,8 +169,8 @@ } // Serve the remaining bytes to complete the load. - EXPECT_FALSE(data_.IsEmpty()); - while (!data_.IsEmpty()) + EXPECT_FALSE(data_.empty()); + while (!data_.empty()) DispatchOneByte(); body_loader_->Finish();
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.h b/third_party/blink/renderer/core/loader/resource/image_resource_content.h index 33d033a..5c8ed49 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource_content.h +++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.h
@@ -186,7 +186,7 @@ scoped_refptr<const SharedBuffer> ResourceBuffer() const; bool ShouldUpdateImageImmediately() const; bool HasObservers() const { - return !observers_.IsEmpty() || !finished_observers_.IsEmpty(); + return !observers_.empty() || !finished_observers_.empty(); } bool IsRefetchableDataFromDiskCache() const { return is_refetchable_data_from_disk_cache_;
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_rule_test.cc b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_rule_test.cc index 3ee54d4..436a57f 100644 --- a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_rule_test.cc +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_rule_test.cc
@@ -69,8 +69,8 @@ ASSERT_TRUE(absl::holds_alternative<ScriptWebBundleRule>(result)); auto& rule = absl::get<ScriptWebBundleRule>(result); EXPECT_EQ(rule.source_url(), "https://example.com/foo.wbn"); - EXPECT_TRUE(rule.scope_urls().IsEmpty()); - EXPECT_TRUE(rule.resource_urls().IsEmpty()); + EXPECT_TRUE(rule.scope_urls().empty()); + EXPECT_TRUE(rule.resource_urls().empty()); } TEST(ScriptWebBundleRuleTest, ResourcesShouldBeResolvedOnBundleURL) { @@ -304,8 +304,8 @@ ASSERT_TRUE(absl::holds_alternative<ScriptWebBundleRule>(result)); auto& rule = absl::get<ScriptWebBundleRule>(result); EXPECT_EQ(rule.source_url(), "https://example.com/foo.wbn"); - EXPECT_TRUE(rule.scope_urls().IsEmpty()); - EXPECT_TRUE(rule.resource_urls().IsEmpty()); + EXPECT_TRUE(rule.scope_urls().empty()); + EXPECT_TRUE(rule.resource_urls().empty()); EXPECT_EQ(logger.Message(), "Invalid top-level key \"unknown\" in WebBundle rule."); }
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message.h b/third_party/blink/renderer/core/messaging/blink_cloneable_message.h index 499c1565..5c7a3c4 100644 --- a/third_party/blink/renderer/core/messaging/blink_cloneable_message.h +++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message.h
@@ -27,7 +27,8 @@ scoped_refptr<blink::SerializedScriptValue> message; scoped_refptr<const blink::SecurityOrigin> sender_origin; v8_inspector::V8StackTraceId sender_stack_trace_id; - absl::optional<base::UnguessableToken> locked_agent_cluster_id; + base::UnguessableToken sender_agent_cluster_id; + bool locked_to_sender_agent_cluster = false; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc index 518ccfa4..5ca8a984 100644 --- a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc +++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc
@@ -46,10 +46,11 @@ data.stack_trace_debugger_id_second()), data.stack_trace_should_pause()); - absl::optional<base::UnguessableToken> locked_agent_cluster_id; - if (!data.ReadLockedAgentClusterId(&locked_agent_cluster_id)) + base::UnguessableToken sender_agent_cluster_id; + if (!data.ReadSenderAgentClusterId(&sender_agent_cluster_id)) return false; - out->locked_agent_cluster_id = locked_agent_cluster_id; + out->sender_agent_cluster_id = sender_agent_cluster_id; + out->locked_to_sender_agent_cluster = data.locked_to_sender_agent_cluster(); Vector<PendingRemote<blink::mojom::blink::FileSystemAccessTransferToken>>& tokens = out->message->FileSystemAccessTokens();
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h index 1985014..e430b8e1 100644 --- a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h +++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h
@@ -55,9 +55,14 @@ return input.sender_stack_trace_id.should_pause; } - static const absl::optional<base::UnguessableToken>& locked_agent_cluster_id( + static const base::UnguessableToken& sender_agent_cluster_id( const blink::BlinkCloneableMessage& input) { - return input.locked_agent_cluster_id; + return input.sender_agent_cluster_id; + } + + static bool locked_to_sender_agent_cluster( + const blink::BlinkCloneableMessage& input) { + return input.locked_to_sender_agent_cluster; } static Vector<
diff --git a/third_party/blink/renderer/core/messaging/blink_transferable_message.cc b/third_party/blink/renderer/core/messaging/blink_transferable_message.cc index 8104f8aa..ced54ad 100644 --- a/third_party/blink/renderer/core/messaging/blink_transferable_message.cc +++ b/third_party/blink/renderer/core/messaging/blink_transferable_message.cc
@@ -39,7 +39,9 @@ std::make_pair(message.stack_trace_debugger_id_first, message.stack_trace_debugger_id_second), message.stack_trace_should_pause); - result.locked_agent_cluster_id = message.locked_agent_cluster_id; + result.sender_agent_cluster_id = message.sender_agent_cluster_id; + result.locked_to_sender_agent_cluster = + message.locked_to_sender_agent_cluster; result.ports.AppendRange(message.ports.begin(), message.ports.end()); for (auto& channel : message.stream_channels) { result.message->GetStreams().push_back(
diff --git a/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc b/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc index ec9613ab..517fa2e3 100644 --- a/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc +++ b/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc
@@ -63,6 +63,7 @@ transferables.array_buffers.push_back(array_buffer); BlinkTransferableMessage msg; msg.sender_origin = SecurityOrigin::CreateUniqueOpaque(); + msg.sender_agent_cluster_id = base::UnguessableToken::Create(); msg.message = BuildSerializedScriptValue(scope.GetIsolate(), v8_buffer, transferables); mojo_message = mojom::blink::TransferableMessage::SerializeAsMessage(&msg); @@ -104,6 +105,7 @@ transferables.array_buffers.push_back(original_array_buffer); BlinkTransferableMessage msg; msg.sender_origin = SecurityOrigin::CreateUniqueOpaque(); + msg.sender_agent_cluster_id = base::UnguessableToken::Create(); msg.message = BuildSerializedScriptValue(scope.GetIsolate(), v8_buffer, transferables); mojo::Message mojo_message = @@ -148,6 +150,7 @@ transferables.image_bitmaps.push_back(image_bitmap); BlinkTransferableMessage msg; msg.sender_origin = SecurityOrigin::CreateUniqueOpaque(); + msg.sender_agent_cluster_id = base::UnguessableToken::Create(); msg.message = BuildSerializedScriptValue(scope.GetIsolate(), wrapper, transferables); mojo_message = mojom::blink::TransferableMessage::SerializeAsMessage(&msg); @@ -174,6 +177,7 @@ transferables.image_bitmaps.push_back(std::move(original_bitmap)); BlinkTransferableMessage msg; msg.sender_origin = SecurityOrigin::CreateUniqueOpaque(); + msg.sender_agent_cluster_id = base::UnguessableToken::Create(); msg.message = BuildSerializedScriptValue(scope.GetIsolate(), wrapper, transferables); mojo::Message mojo_message =
diff --git a/third_party/blink/renderer/core/messaging/message_port.cc b/third_party/blink/renderer/core/messaging/message_port.cc index bae7a3b..8395061 100644 --- a/third_party/blink/renderer/core/messaging/message_port.cc +++ b/third_party/blink/renderer/core/messaging/message_port.cc
@@ -125,11 +125,8 @@ if (debugger) msg.sender_stack_trace_id = debugger->StoreCurrentStackTrace("postMessage"); - if (msg.message->IsLockedToAgentCluster()) { - msg.locked_agent_cluster_id = GetExecutionContext()->GetAgentClusterID(); - } else { - msg.locked_agent_cluster_id = absl::nullopt; - } + msg.sender_agent_cluster_id = GetExecutionContext()->GetAgentClusterID(); + msg.locked_to_sender_agent_cluster = msg.message->IsLockedToAgentCluster(); mojo::Message mojo_message = mojom::blink::TransferableMessage::WrapAsMessage(std::move(msg)); @@ -325,8 +322,9 @@ } } - if (message.locked_agent_cluster_id) { - if (!context->IsSameAgentCluster(*message.locked_agent_cluster_id)) { + if (message.locked_to_sender_agent_cluster) { + DCHECK(message.sender_agent_cluster_id); + if (!context->IsSameAgentCluster(message.sender_agent_cluster_id)) { UseCounter::Count( context, WebFeature::kMessageEventSharedArrayBufferDifferentAgentCluster);
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_api.cc b/third_party/blink/renderer/core/navigation_api/navigation_api.cc index 2ae9ea10..f842367 100644 --- a/third_party/blink/renderer/core/navigation_api/navigation_api.cc +++ b/third_party/blink/renderer/core/navigation_api/navigation_api.cc
@@ -208,7 +208,7 @@ } void NavigationApi::PopulateKeySet() { - DCHECK(keys_to_indices_.IsEmpty()); + DCHECK(keys_to_indices_.empty()); for (wtf_size_t i = 0; i < entries_.size(); i++) keys_to_indices_.insert(entries_[i]->key(), i); } @@ -895,7 +895,7 @@ // This function may be called when a v8 context hasn't been initialized. // upcoming_traversals_ being non-empty requires a v8 context, so check that // so that we don't unnecessarily try to initialize one below. - if (!upcoming_traversals_.IsEmpty() && GetSupplementable()->GetFrame() && + if (!upcoming_traversals_.empty() && GetSupplementable()->GetFrame() && !GetSupplementable()->GetFrame()->IsAttached()) { auto* script_state = ToScriptStateForMainWorld(GetSupplementable()->GetFrame()); @@ -905,7 +905,7 @@ CopyValuesToVector(upcoming_traversals_, traversals); for (auto& traversal : traversals) FinalizeWithAbortedNavigationError(script_state, traversal); - DCHECK(upcoming_traversals_.IsEmpty()); + DCHECK(upcoming_traversals_.empty()); } }
diff --git a/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc b/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc index 3dd8887..20ab67ff 100644 --- a/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc +++ b/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
@@ -244,7 +244,7 @@ DCHECK(execution_context); const OriginTrialContext* context = execution_context->GetOriginTrialContext(); - if (!context || context->trial_results_.IsEmpty()) + if (!context || context->trial_results_.empty()) return nullptr; auto tokens = std::make_unique<Vector<String>>(); @@ -280,7 +280,7 @@ std::unique_ptr<Vector<OriginTrialFeature>> OriginTrialContext::GetInheritedTrialFeatures() const { - if (enabled_features_.IsEmpty()) { + if (enabled_features_.empty()) { return nullptr; } std::unique_ptr<Vector<OriginTrialFeature>> result = @@ -295,7 +295,7 @@ std::unique_ptr<Vector<OriginTrialFeature>> OriginTrialContext::GetEnabledNavigationFeatures() const { - if (enabled_features_.IsEmpty()) + if (enabled_features_.empty()) return nullptr; std::unique_ptr<Vector<OriginTrialFeature>> result = std::make_unique<Vector<OriginTrialFeature>>();
diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc index cee914c..8879463 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc
@@ -130,18 +130,21 @@ return &doc->GetRootScrollerController().EffectiveRootScroller(); } - WebCoalescedInputEvent GenerateTouchGestureEvent(WebInputEvent::Type type, - int delta_x = 0, - int delta_y = 0) { - return GenerateGestureEvent(type, WebGestureDevice::kTouchscreen, delta_x, - delta_y); - } - - WebCoalescedInputEvent GenerateWheelGestureEvent(WebInputEvent::Type type, - int delta_x = 0, - int delta_y = 0) { - return GenerateGestureEvent(type, WebGestureDevice::kTouchpad, delta_x, - delta_y); + WebGestureEvent GenerateTouchGestureEvent(WebInputEvent::Type type, + int delta_x = 0, + int delta_y = 0) { + WebGestureEvent event(type, WebInputEvent::kNoModifiers, + WebInputEvent::GetStaticTimeStampForTests(), + WebGestureDevice::kTouchscreen); + event.SetPositionInWidget(gfx::PointF(100, 100)); + if (type == WebInputEvent::Type::kGestureScrollUpdate) { + event.data.scroll_update.delta_x = delta_x; + event.data.scroll_update.delta_y = delta_y; + } else if (type == WebInputEvent::Type::kGestureScrollBegin) { + event.data.scroll_begin.delta_x_hint = delta_x; + event.data.scroll_begin.delta_y_hint = delta_y; + } + return event; } void SetCreateWebFrameWidgetCallback( @@ -151,23 +154,6 @@ } protected: - WebCoalescedInputEvent GenerateGestureEvent(WebInputEvent::Type type, - WebGestureDevice device, - int delta_x, - int delta_y) { - WebGestureEvent event(type, WebInputEvent::kNoModifiers, - WebInputEvent::GetStaticTimeStampForTests(), device); - event.SetPositionInWidget(gfx::PointF(100, 100)); - if (type == WebInputEvent::Type::kGestureScrollUpdate) { - event.data.scroll_update.delta_x = delta_x; - event.data.scroll_update.delta_y = delta_y; - } else if (type == WebInputEvent::Type::kGestureScrollBegin) { - event.data.scroll_begin.delta_x_hint = delta_x; - event.data.scroll_begin.delta_y_hint = delta_y; - } - return WebCoalescedInputEvent(event, ui::LatencyInfo()); - } - WebViewImpl* InitializeInternal(const String& url) { helper_ = std::make_unique<frame_test_helpers::WebViewHelper>( create_widget_callback_); @@ -176,8 +162,11 @@ &ConfigureSettings); // Initialize browser controls to be shown. - GetWebView()->ResizeWithBrowserControls(gfx::Size(400, 400), 50, 60, true); + gfx::Size viewport_size = gfx::Size(400, 400); + GetWebView()->ResizeWithBrowserControls(viewport_size, 50, 60, true); GetWebView()->GetBrowserControls().SetShownRatio(1, 1); + helper_->GetMainFrameWidget()->UpdateCompositorViewportRect( + gfx::Rect(viewport_size)); UpdateAllLifecyclePhases(MainFrameView()); @@ -226,82 +215,45 @@ EffectiveRootScroller(MainFrame()->GetDocument())); } -class OverscrollWidgetInputHandlerHost - : public frame_test_helpers::TestWidgetInputHandlerHost { - public: - MOCK_METHOD5(DidOverscroll, - void(const gfx::Vector2dF&, - const gfx::Vector2dF&, - const gfx::PointF&, - const gfx::Vector2dF&, - cc::OverscrollBehavior)); - - void DidOverscroll(mojom::blink::DidOverscrollParamsPtr params) override { - DidOverscroll(params->latest_overscroll_delta, - params->accumulated_overscroll, - params->causal_event_viewport_point, - params->current_fling_velocity, params->overscroll_behavior); - } -}; - -class OverscrollTestWebFrameWidget - : public frame_test_helpers::TestWebFrameWidget { - public: - template <typename... Args> - explicit OverscrollTestWebFrameWidget(Args&&... args) - : frame_test_helpers::TestWebFrameWidget(std::forward<Args>(args)...) {} - - // frame_test_helpers::TestWebFrameWidget overrides. - frame_test_helpers::TestWidgetInputHandlerHost* GetInputHandlerHost() - override { - return &input_handler_host_; - } - - OverscrollWidgetInputHandlerHost& GetOverscrollWidgetInputHandlerHost() { - return input_handler_host_; - } - - private: - OverscrollWidgetInputHandlerHost input_handler_host_; -}; - -// Tests that setting an element as the root scroller causes it to control url -// bar hiding and overscroll. -TEST_F(RootScrollerTest, TestSetRootScroller) { - SetCreateWebFrameWidgetCallback(base::BindRepeating( - &frame_test_helpers::WebViewHelper::CreateTestWebFrameWidget< - OverscrollTestWebFrameWidget>)); +// Tests that a DIV which becomes the implicit root scroller will properly +// control url bar and bottom bar hiding and overscroll. +TEST_F(RootScrollerTest, BrowserControlsAndOverscroll) { Initialize("root-scroller.html"); UpdateAllLifecyclePhases(MainFrameView()); Element* container = MainFrame()->GetDocument()->getElementById("container"); ASSERT_EQ(container, EffectiveRootScroller(MainFrame()->GetDocument())); - // Content is 1000x1000, WebView size is 400x400 but hiding the top controls - // makes it 400x450 so max scroll is 550px. - double maximum_scroll = 550; + // Content is 1000x1000, WebView is 400x400 but hiding the 50px top controls + // and the 60px bottom controls makes it 400x510 so max scroll is 490px. + double maximum_scroll = 490; - OverscrollTestWebFrameWidget* widget = - static_cast<OverscrollTestWebFrameWidget*>(helper_->GetMainFrameWidget()); + auto* widget = helper_->GetMainFrameWidget(); + auto* layer_tree_host = helper_->GetLayerTreeHost(); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollBegin)); { // Scrolling over the #container DIV should cause the browser controls to // hide. EXPECT_FLOAT_EQ(1, GetBrowserControls().TopShownRatio()); EXPECT_FLOAT_EQ(1, GetBrowserControls().BottomShownRatio()); - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollUpdate, 0, -GetBrowserControls().TopHeight())); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + EXPECT_FLOAT_EQ(0, GetBrowserControls().TopShownRatio()); EXPECT_FLOAT_EQ(0, GetBrowserControls().BottomShownRatio()); } { // Make sure we're actually scrolling the DIV and not the LocalFrameView. - widget->HandleInputEvent(GenerateTouchGestureEvent( + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( WebInputEvent::Type::kGestureScrollUpdate, 0, -100)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + EXPECT_FLOAT_EQ(100, container->scrollTop()); EXPECT_FLOAT_EQ(0, MainFrameView()->LayoutViewport()->GetScrollOffset().y()); @@ -310,75 +262,80 @@ { // Scroll 50 pixels past the end. Ensure we report the 50 pixels as // overscroll. - EXPECT_CALL(widget->GetOverscrollWidgetInputHandlerHost(), - DidOverscroll(gfx::Vector2dF(0, 50), gfx::Vector2dF(0, 50), - gfx::PointF(100, 100), gfx::Vector2dF(), - cc::OverscrollBehavior())); - widget->HandleInputEvent(GenerateTouchGestureEvent( - WebInputEvent::Type::kGestureScrollUpdate, 0, -500)); + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( + WebInputEvent::Type::kGestureScrollUpdate, 0, -440)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + + EXPECT_TRUE( + widget->last_overscroll()->Equals(mojom::blink::DidOverscrollParams( + gfx::Vector2dF(0, 50), gfx::Vector2dF(0, 50), gfx::Vector2dF(), + gfx::PointF(100, 100), cc::OverscrollBehavior()))); + EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); EXPECT_FLOAT_EQ(0, MainFrameView()->LayoutViewport()->GetScrollOffset().y()); - RunPendingTasks(); - Mock::VerifyAndClearExpectations( - &widget->GetOverscrollWidgetInputHandlerHost()); } { // Continue the gesture overscroll. - EXPECT_CALL(widget->GetOverscrollWidgetInputHandlerHost(), - DidOverscroll(gfx::Vector2dF(0, 20), gfx::Vector2dF(0, 70), - gfx::PointF(100, 100), gfx::Vector2dF(), - cc::OverscrollBehavior())); - widget->HandleInputEvent(GenerateTouchGestureEvent( + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( WebInputEvent::Type::kGestureScrollUpdate, 0, -20)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + + EXPECT_TRUE( + widget->last_overscroll()->Equals(mojom::blink::DidOverscrollParams( + gfx::Vector2dF(0, 70), gfx::Vector2dF(0, 20), gfx::Vector2dF(), + gfx::PointF(100, 100), cc::OverscrollBehavior()))); + EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); EXPECT_FLOAT_EQ(0, MainFrameView()->LayoutViewport()->GetScrollOffset().y()); - RunPendingTasks(); - Mock::VerifyAndClearExpectations( - &widget->GetOverscrollWidgetInputHandlerHost()); } - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollEnd)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); { // Make sure a new gesture scroll still won't scroll the frameview and // overscrolls. - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollBegin)); - EXPECT_CALL(widget->GetOverscrollWidgetInputHandlerHost(), - DidOverscroll(gfx::Vector2dF(0, 30), gfx::Vector2dF(0, 30), - gfx::PointF(100, 100), gfx::Vector2dF(), - cc::OverscrollBehavior())); - widget->HandleInputEvent(GenerateTouchGestureEvent( + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( WebInputEvent::Type::kGestureScrollUpdate, 0, -30)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + + EXPECT_TRUE( + widget->last_overscroll()->Equals(mojom::blink::DidOverscrollParams( + gfx::Vector2dF(0, 30), gfx::Vector2dF(0, 30), gfx::Vector2dF(), + gfx::PointF(100, 100), cc::OverscrollBehavior()))); + EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); EXPECT_FLOAT_EQ(0, MainFrameView()->LayoutViewport()->GetScrollOffset().y()); - RunPendingTasks(); - Mock::VerifyAndClearExpectations( - &widget->GetOverscrollWidgetInputHandlerHost()); - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollEnd)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); } { // Scrolling up should show the browser controls. - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollBegin)); EXPECT_FLOAT_EQ(0, GetBrowserControls().TopShownRatio()); EXPECT_FLOAT_EQ(0, GetBrowserControls().BottomShownRatio()); - GetWebView()->MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent( + + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( WebInputEvent::Type::kGestureScrollUpdate, 0, 30)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + EXPECT_FLOAT_EQ(0.6, GetBrowserControls().TopShownRatio()); EXPECT_FLOAT_EQ(0.6, GetBrowserControls().BottomShownRatio()); - widget->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollEnd)); } @@ -650,7 +607,10 @@ base_url); GetWebView()->ResizeWithBrowserControls(gfx::Size(400, 400), 50, 50, true); - UpdateAllLifecyclePhases(MainFrameView()); + + auto* widget = helper_->GetMainFrameWidget(); + auto* layer_tree_host = helper_->GetLayerTreeHost(); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); Element* container = MainFrame()->GetDocument()->getElementById("container"); ASSERT_EQ(container, EffectiveRootScroller(MainFrame()->GetDocument())); @@ -663,30 +623,48 @@ // scroll offset should shrink. ASSERT_EQ(1000 - 400, container_scroller->MaximumScrollOffset().y()); - GetWebView()->MainFrameWidget()->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollBegin)); + ASSERT_EQ(1, GetBrowserControls().TopShownRatio()); ASSERT_EQ(1, GetBrowserControls().BottomShownRatio()); - GetWebView()->MainFrameWidget()->HandleInputEvent( + + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollUpdate, 0, -GetBrowserControls().TopHeight())); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + ASSERT_EQ(0, GetBrowserControls().TopShownRatio()); ASSERT_EQ(0, GetBrowserControls().BottomShownRatio()); + + // TODO(crbug.com/1364851): This should be 1000 - 500, but the main thread's + // maximum scroll offset does not account for the hidden bottom bar. EXPECT_EQ(1000 - 450, container_scroller->MaximumScrollOffset().y()); - GetWebView()->MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent( + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( WebInputEvent::Type::kGestureScrollUpdate, 0, -3000)); - EXPECT_EQ(1000 - 450, container_scroller->GetScrollOffset().y()); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); - GetWebView()->MainFrameWidget()->HandleInputEvent( + // The compositor input handler correctly accounts for both top and bottom bar + // in the calculation of scroll bounds. This is the true maximum. + EXPECT_EQ(1000 - 500, container_scroller->GetScrollOffset().y()); + + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollEnd)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + GetWebView()->ResizeWithBrowserControls(gfx::Size(400, 450), 50, 50, false); + + // TODO(crbug.com/1364851): This should be 1000 - 500, but the main thread's + // maximum scroll offset does not account for the hidden bottom bar. EXPECT_EQ(1000 - 450, container_scroller->MaximumScrollOffset().y()); } TEST_F(RootScrollerTest, RotationAnchoring) { Initialize("root-scroller-rotation.html"); + auto* widget = helper_->GetMainFrameWidget(); + auto* layer_tree_host = helper_->GetLayerTreeHost(); ScrollableArea* container_scroller; { @@ -710,12 +688,15 @@ int scroll_y = 1000 * 4; GetWebView()->SetPageScaleFactor(2); - GetWebView()->MainFrameWidget()->HandleInputEvent( + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); + + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollBegin)); - GetWebView()->MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent( + widget->DispatchThroughCcInputHandler(GenerateTouchGestureEvent( WebInputEvent::Type::kGestureScrollUpdate, -scroll_x, -scroll_y)); - GetWebView()->MainFrameWidget()->HandleInputEvent( + widget->DispatchThroughCcInputHandler( GenerateTouchGestureEvent(WebInputEvent::Type::kGestureScrollEnd)); + layer_tree_host->CompositeForTest(base::TimeTicks::Now(), false); // The visual viewport should be 1.5 screens scrolled so that the target // occupies the bottom quadrant of the layout viewport.
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state.cc b/third_party/blink/renderer/core/page/scrolling/scroll_state.cc index e60d0182..47fdba9 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state.cc +++ b/third_party/blink/renderer/core/page/scrolling/scroll_state.cc
@@ -70,7 +70,7 @@ } void ScrollState::distributeToScrollChainDescendant() { - if (!scroll_chain_.IsEmpty()) { + if (!scroll_chain_.empty()) { DOMNodeId descendant_id = scroll_chain_.TakeFirst(); NodeForId(descendant_id)->CallDistributeScroll(*this); }
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc index 2fde0a3..bbdfba4 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
@@ -245,7 +245,7 @@ void ImageRecordsManager::AssignPaintTimeToRegisteredQueuedRecords( const base::TimeTicks& timestamp, unsigned last_queued_frame_index) { - while (!images_queued_for_paint_time_.IsEmpty()) { + while (!images_queued_for_paint_time_.empty()) { const base::WeakPtr<ImageRecord>& record = images_queued_for_paint_time_.front().first; if (!record) {
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index b20ed05..f832b1a 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -584,7 +584,7 @@ const LayoutObject& ancestor, const NGPhysicalBoxFragment& fragment, const PrePaintTreeWalkContext& context) { - if (pending_missables_.IsEmpty()) + if (pending_missables_.empty()) return; for (const NGLink& child : fragment.Children()) {
diff --git a/third_party/blink/renderer/core/paint/table_section_painter.cc b/third_party/blink/renderer/core/paint/table_section_painter.cc index 0eeebb83..b78da7a 100644 --- a/third_party/blink/renderer/core/paint/table_section_painter.cc +++ b/third_party/blink/renderer/core/paint/table_section_painter.cc
@@ -204,7 +204,7 @@ const auto& visually_overflowing_cells = layout_table_section_.VisuallyOverflowingCells(); - if (visually_overflowing_cells.IsEmpty()) { + if (visually_overflowing_cells.empty()) { // This path is for 2 cases: // 1. Normal partial paint, without overflowing cells; // 2. Full paint, for small sections or big sections with many overflowing
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc b/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc index 89d4b00..ab8ce06 100644 --- a/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc +++ b/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc
@@ -262,7 +262,7 @@ ->RunScript(&Window()); ThreadState::Current()->CollectAllGarbageForTesting(); WebHeap::CollectAllGarbageForTesting(); - ASSERT_EQ(observers.IsEmpty(), true); + ASSERT_EQ(observers.empty(), true); // // Test whether ResizeObserver is kept alive by an Element @@ -281,7 +281,7 @@ ->RunScript(&Window()); ThreadState::Current()->CollectAllGarbageForTesting(); WebHeap::CollectAllGarbageForTesting(); - ASSERT_EQ(observers.IsEmpty(), true); + ASSERT_EQ(observers.empty(), true); } } // namespace blink
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc index 91fb38d6..f0c0c533 100644 --- a/third_party/blink/renderer/core/script/classic_pending_script.cc +++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -321,7 +321,7 @@ // checks were destined for this request, so we cannot skip the integrity // check. bool integrity_failure = false; - if (!options_.GetIntegrityMetadata().IsEmpty() || resource->IsLinkPreload()) { + if (!options_.GetIntegrityMetadata().empty() || resource->IsLinkPreload()) { integrity_failure = resource->IntegrityDisposition() != ResourceIntegrityDisposition::kPassed; }
diff --git a/third_party/blink/renderer/core/script/html_parser_script_runner.cc b/third_party/blink/renderer/core/script/html_parser_script_runner.cc index a3f99ad..ee6a5f9 100644 --- a/third_party/blink/renderer/core/script/html_parser_script_runner.cc +++ b/third_party/blink/renderer/core/script/html_parser_script_runner.cc
@@ -149,7 +149,7 @@ parser_blocking_script_->Dispose(); parser_blocking_script_ = nullptr; - while (!force_deferred_scripts_.IsEmpty()) { + while (!force_deferred_scripts_.empty()) { DCHECK( base::FeatureList::IsEnabled(features::kForceDeferScriptIntervention)); PendingScript* pending_script = force_deferred_scripts_.TakeFirst(); @@ -157,7 +157,7 @@ } delayer_for_force_defer_->Deactivate(); - while (!scripts_to_execute_after_parsing_.IsEmpty()) { + while (!scripts_to_execute_after_parsing_.empty()) { PendingScript* pending_script = scripts_to_execute_after_parsing_.TakeFirst(); pending_script->Dispose(); @@ -401,7 +401,7 @@ // <specdef href="https://html.spec.whatwg.org/C/#stop-parsing"> PendingScript* HTMLParserScriptRunner::TryTakeReadyScriptWaitingForParsing( HeapDeque<Member<PendingScript>>* waiting_scripts) { - DCHECK(!waiting_scripts->IsEmpty()); + DCHECK(!waiting_scripts->empty()); // <spec step="5.1">Spin the event loop until the first script in the list of // scripts that will execute when the document has finished parsing has its @@ -437,11 +437,11 @@ // <spec step="5">While the list of scripts that will execute when the // document has finished parsing is not empty:</spec> - while (!force_deferred_scripts_.IsEmpty() || - !scripts_to_execute_after_parsing_.IsEmpty()) { + while (!force_deferred_scripts_.empty() || + !scripts_to_execute_after_parsing_.empty()) { DCHECK(!IsExecutingScript()); DCHECK(!HasParserBlockingScript()); - DCHECK(scripts_to_execute_after_parsing_.IsEmpty() || + DCHECK(scripts_to_execute_after_parsing_.empty() || scripts_to_execute_after_parsing_.front()->IsExternalOrModule()); // <spec step="5.3">Remove the first script element from the list of scripts @@ -452,7 +452,7 @@ // First execute the scripts that were forced-deferred. If no such scripts // are present, then try executing scripts that were deferred by the web // developer. - if (!force_deferred_scripts_.IsEmpty()) { + if (!force_deferred_scripts_.empty()) { DCHECK(base::FeatureList::IsEnabled( features::kForceDeferScriptIntervention)); first = TryTakeReadyScriptWaitingForParsing(&force_deferred_scripts_); @@ -488,7 +488,7 @@ // All scripts waiting for parsing have now executed (end of spec step 3), // including any force deferred syncrhonous scripts. Now resume async // script execution if it was suspended by force deferral. - DCHECK(force_deferred_scripts_.IsEmpty()); + DCHECK(force_deferred_scripts_.empty()); delayer_for_force_defer_->Deactivate(); return true; }
diff --git a/third_party/blink/renderer/core/script/module_map.cc b/third_party/blink/renderer/core/script/module_map.cc index b5d3720..ced3fee 100644 --- a/third_party/blink/renderer/core/script/module_map.cc +++ b/third_party/blink/renderer/core/script/module_map.cc
@@ -69,7 +69,7 @@ void ModuleMap::Entry::AddClient(SingleModuleClient* new_client) { DCHECK(!clients_.Contains(new_client)); if (!is_fetching_) { - DCHECK(clients_.IsEmpty()); + DCHECK(clients_.empty()); DispatchFinishedNotificationAsync(new_client); return; }
diff --git a/third_party/blink/renderer/core/script/script_runner.cc b/third_party/blink/renderer/core/script/script_runner.cc index 75830cf..1600d7e 100644 --- a/third_party/blink/renderer/core/script/script_runner.cc +++ b/third_party/blink/renderer/core/script/script_runner.cc
@@ -236,7 +236,7 @@ break; case ScriptSchedulingType::kInOrder: - while (!pending_in_order_scripts_.IsEmpty() && + while (!pending_in_order_scripts_.empty() && pending_in_order_scripts_.front()->IsReady()) { PendingScript* pending_in_order = pending_in_order_scripts_.TakeFirst(); task_runner_->PostTask( @@ -247,7 +247,7 @@ break; case ScriptSchedulingType::kForceInOrder: - while (!pending_force_in_order_scripts_.IsEmpty() && + while (!pending_force_in_order_scripts_.empty() && pending_force_in_order_scripts_.front()->IsReady()) { PendingScript* pending_in_order = pending_force_in_order_scripts_.TakeFirst(); @@ -257,7 +257,7 @@ WrapWeakPersistent(this), WrapPersistent(pending_in_order))); } - if (pending_force_in_order_scripts_.IsEmpty()) { + if (pending_force_in_order_scripts_.empty()) { task_runner_->PostTask( FROM_HERE, WTF::BindOnce(&ScriptRunner::
diff --git a/third_party/blink/renderer/core/streams/queue_with_sizes.h b/third_party/blink/renderer/core/streams/queue_with_sizes.h index 9f153c99..dbafbd8 100644 --- a/third_party/blink/renderer/core/streams/queue_with_sizes.h +++ b/third_party/blink/renderer/core/streams/queue_with_sizes.h
@@ -42,7 +42,7 @@ double TotalSize() { return queue_total_size_; } // Not part of the standard. - bool IsEmpty() { return queue_.IsEmpty(); } + bool IsEmpty() { return queue_.empty(); } // https://streams.spec.whatwg.org/#reset-queue void ResetQueue();
diff --git a/third_party/blink/renderer/core/streams/readable_byte_stream_controller.cc b/third_party/blink/renderer/core/streams/readable_byte_stream_controller.cc index 83363f3..0a4a924 100644 --- a/third_party/blink/renderer/core/streams/readable_byte_stream_controller.cc +++ b/third_party/blink/renderer/core/streams/readable_byte_stream_controller.cc
@@ -79,7 +79,7 @@ // https://streams.spec.whatwg.org/#rbs-controller-byob-request // 1. If this.[[byobRequest]] is null and this.[[pendingPullIntos]] is not // empty, - if (!byob_request_ && !pending_pull_intos_.IsEmpty()) { + if (!byob_request_ && !pending_pull_intos_.empty()) { // a. Let firstDescriptor be this.[[pendingPullIntos]][0]. const PullIntoDescriptor* first_descriptor = pending_pull_intos_[0]; // b. Let view be ! Construct(%Uint8Array%, « firstDescriptor’s buffer, @@ -219,7 +219,7 @@ } // 4. If controller.[[pendingPullIntos]] is not empty, - if (!controller->pending_pull_intos_.IsEmpty()) { + if (!controller->pending_pull_intos_.empty()) { // a. Let firstPendingPullInto be controller.[[pendingPullIntos]][0]. const PullIntoDescriptor* first_pending_pull_into = controller->pending_pull_intos_[0]; @@ -307,7 +307,7 @@ } // 8. If controller.[[pendingPullIntos]] is not empty, - if (!controller->pending_pull_intos_.IsEmpty()) { + if (!controller->pending_pull_intos_.empty()) { // a. Let firstPendingPullInto be controller.[[pendingPullIntos]][0]. PullIntoDescriptor* first_pending_pull_into = controller->pending_pull_intos_[0]; @@ -340,7 +340,7 @@ // b. If ! ReadableStreamGetNumReadRequests(stream) is 0, if (ReadableStream::GetNumReadRequests(stream) == 0) { // i. Assert: controller.[[pendingPullIntos]] is empty. - DCHECK(controller->pending_pull_intos_.IsEmpty()); + DCHECK(controller->pending_pull_intos_.empty()); // ii. Perform ! // ReadableByteStreamControllerEnqueueChunkToQueue(controller, @@ -350,10 +350,10 @@ } else { // c. Otherwise, // i. Assert: controller.[[queue]] is empty. - DCHECK(controller->queue_.IsEmpty()); + DCHECK(controller->queue_.empty()); // ii. If controller.[[pendingPullIntos]] is not empty, - if (!controller->pending_pull_intos_.IsEmpty()) { + if (!controller->pending_pull_intos_.empty()) { // 1. Assert: controller.[[pendingPullIntos]][0]'s reader type is // "default". DCHECK_EQ(controller->pending_pull_intos_[0]->reader_type, @@ -473,7 +473,7 @@ // 1. Assert: controller.[[closeRequested]] is false. DCHECK(!controller->close_requested_); // 2. While controller.[[pendingPullIntos]] is not empty, - while (!controller->pending_pull_intos_.IsEmpty()) { + while (!controller->pending_pull_intos_.empty()) { // a. If controller.[[queueTotalSize]] is 0, return. if (controller->queue_total_size_ == 0) { return; @@ -509,7 +509,7 @@ ReadableStreamDefaultReader* default_reader = To<ReadableStreamDefaultReader>(reader); // 3. While reader.[[readRequests]] is not empty, - while (!default_reader->read_requests_.IsEmpty()) { + while (!default_reader->read_requests_.empty()) { // a. If controller.[[queueTotalSize]] is 0, return. if (controller->queue_total_size_ == 0) { return; @@ -808,7 +808,7 @@ // 11. Set controller.[[autoAllocateChunkSize]] to autoAllocateChunkSize. controller->auto_allocate_chunk_size_ = auto_allocate_chunk_size; // 12. Set controller.[[pendingPullIntos]] to a new empty list. - DCHECK(controller->pending_pull_intos_.IsEmpty()); + DCHECK(controller->pending_pull_intos_.empty()); // 13. Set stream.[[controller]] to controller. stream->readable_stream_controller_ = controller; // 14. Let startResult be the result of performing startAlgorithm. @@ -970,7 +970,7 @@ // https://streams.spec.whatwg.org/#readable-byte-stream-controller-fill-head-pull-into-descriptor // 1. Assert: either controller.[[pendingPullIntos]] is empty, or // controller.[[pendingPullIntos]][0] is pullIntoDescriptor. - DCHECK(controller->pending_pull_intos_.IsEmpty() || + DCHECK(controller->pending_pull_intos_.empty() || controller->pending_pull_intos_[0] == pull_into_descriptor); // 2. Assert: controller.[[byobRequest]] is null. DCHECK(!controller->byob_request_); @@ -1215,7 +1215,7 @@ buffer, buffer->ByteLength(), byte_offset, byte_length, 0, element_size, ctor, ReaderType::kBYOB); // 11. If controller.[[pendingPullIntos]] is not empty, - if (!controller->pending_pull_intos_.IsEmpty()) { + if (!controller->pending_pull_intos_.empty()) { // a. Append pullIntoDescriptor to controller.[[pendingPullIntos]]. controller->pending_pull_intos_.push_back(pull_into_descriptor); // b. Perform ! ReadableStreamAddReadIntoRequest(stream, readIntoRequest). @@ -1313,7 +1313,7 @@ ExceptionState& exception_state) { // https://streams.spec.whatwg.org/#readable-byte-stream-controller-respond // 1. Assert: controller.[[pendingPullIntos]] is not empty. - DCHECK(!controller->pending_pull_intos_.IsEmpty()); + DCHECK(!controller->pending_pull_intos_.empty()); // 2. Let firstDescriptor be controller.[[pendingPullIntos]][0]. PullIntoDescriptor* first_descriptor = controller->pending_pull_intos_[0]; // 3. Let state be controller.[[stream]].[[state]]. @@ -1506,7 +1506,7 @@ ExceptionState& exception_state) { // https://streams.spec.whatwg.org/#readable-byte-stream-controller-respond-with-new-view // 1. Assert: controller.[[pendingPullIntos]] is not empty. - DCHECK(!controller->pending_pull_intos_.IsEmpty()); + DCHECK(!controller->pending_pull_intos_.empty()); // 2. Assert: ! IsDetachedBuffer(view.[[ViewedArrayBuffer]]) is false. DCHECK(!view->buffer()->IsDetached()); // 3. Let firstDescriptor be controller.[[pendingPullIntos]][0]. @@ -1696,7 +1696,7 @@ void ReadableByteStreamController::ReleaseSteps() { // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamcontroller-releasesteps // 1. If this.[[pendingPullIntos]] is not empty, - if (!pending_pull_intos_.IsEmpty()) { + if (!pending_pull_intos_.empty()) { // a. Let firstPendingPullInto be this.[[pendingPullIntos]][0]. PullIntoDescriptor* first_pending_pull_into = pending_pull_intos_[0]; // b. Set firstPendingPullInto’s reader type to "none".
diff --git a/third_party/blink/renderer/core/streams/readable_stream.cc b/third_party/blink/renderer/core/streams/readable_stream.cc index 01d9782b..551df8f9 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.cc +++ b/third_party/blink/renderer/core/streams/readable_stream.cc
@@ -2162,7 +2162,7 @@ ReadableStreamGenericReader* reader = stream->reader_; ReadableStreamBYOBReader* byob_reader = To<ReadableStreamBYOBReader>(reader); // 3. Assert: reader.[[readIntoRequests]] is not empty. - DCHECK(!byob_reader->read_into_requests_.IsEmpty()); + DCHECK(!byob_reader->read_into_requests_.empty()); // 4. Let readIntoRequest be reader.[[readIntoRequests]][0]. ReadableStreamBYOBReader::ReadIntoRequest* read_into_request = byob_reader->read_into_requests_[0];
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.cc b/third_party/blink/renderer/core/style/grid_positions_resolver.cc index 501f36bc..c3d8de4 100644 --- a/third_party/blink/renderer/core/style/grid_positions_resolver.cc +++ b/third_party/blink/renderer/core/style/grid_positions_resolver.cc
@@ -54,18 +54,18 @@ is_for_columns ? grid_container_style.ImplicitNamedGridColumnLines() : grid_container_style.ImplicitNamedGridRowLines(); - if (!grid_line_names.IsEmpty() && are_named_lines_valid) { + if (!grid_line_names.empty() && are_named_lines_valid) { auto it = grid_line_names.find(named_line); named_lines_indexes_ = it == grid_line_names.end() ? nullptr : &it->value; } - if (!auto_repeat_grid_line_names.IsEmpty() && are_named_lines_valid) { + if (!auto_repeat_grid_line_names.empty() && are_named_lines_valid) { auto it = auto_repeat_grid_line_names.find(named_line); auto_repeat_named_lines_indexes_ = it == auto_repeat_grid_line_names.end() ? nullptr : &it->value; } - if (!implicit_grid_line_names.IsEmpty()) { + if (!implicit_grid_line_names.empty()) { auto it = implicit_grid_line_names.find(named_line); implicit_named_lines_indexes_ = it == implicit_grid_line_names.end() ? nullptr : &it->value;
diff --git a/third_party/blink/renderer/core/style/style_variables.cc b/third_party/blink/renderer/core/style/style_variables.cc index c2de48f..2ecb766 100644 --- a/third_party/blink/renderer/core/style/style_variables.cc +++ b/third_party/blink/renderer/core/style/style_variables.cc
@@ -103,7 +103,7 @@ } bool StyleVariables::IsEmpty() const { - return data_.IsEmpty() && values_->IsEmpty(); + return data_.empty() && values_->empty(); } void StyleVariables::CollectNames(HashSet<AtomicString>& names) const {
diff --git a/third_party/blink/renderer/core/svg/animation/element_smil_animations.h b/third_party/blink/renderer/core/svg/animation/element_smil_animations.h index 4904759..2c63098 100644 --- a/third_party/blink/renderer/core/svg/animation/element_smil_animations.h +++ b/third_party/blink/renderer/core/svg/animation/element_smil_animations.h
@@ -25,7 +25,7 @@ void AddAnimation(const QualifiedName& attribute, SVGAnimationElement*); void RemoveAnimation(const QualifiedName& attribute, SVGAnimationElement*); - bool HasAnimations() const { return !sandwiches_.IsEmpty(); } + bool HasAnimations() const { return !sandwiches_.empty(); } bool Apply(SMILTime elapsed);
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc index 71647f6..f84addf 100644 --- a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc +++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
@@ -119,7 +119,7 @@ SMILTimeContainer::TimingUpdate::~TimingUpdate() { if (!ShouldDispatchEvents()) return; - DCHECK(IsSeek() || updated_elements_.IsEmpty()); + DCHECK(IsSeek() || updated_elements_.empty()); for (const auto& entry : updated_elements_) { SVGSMILElement* element = entry.key; if (auto events_to_dispatch = element->ComputeSeekEvents(entry.value)) @@ -217,7 +217,7 @@ } bool SMILTimeContainer::HasAnimations() const { - return !animated_targets_.IsEmpty(); + return !animated_targets_.empty(); } bool SMILTimeContainer::HasPendingSynchronization() const {
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc index 3a73340..8d70676 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
@@ -828,7 +828,7 @@ // Because this page is detached, it can't get default font settings // from the embedder. Copy over font settings so we have sensible // defaults. These settings are fixed and will not update if changed. - if (!Page::OrdinaryPages().IsEmpty()) { + if (!Page::OrdinaryPages().empty()) { Settings& default_settings = (*Page::OrdinaryPages().begin())->GetSettings(); page->GetSettings().GetGenericFontFamilySettings() =
diff --git a/third_party/blink/renderer/core/svg/svg_document_extensions.cc b/third_party/blink/renderer/core/svg/svg_document_extensions.cc index 5359911d..2fc0a859 100644 --- a/third_party/blink/renderer/core/svg/svg_document_extensions.cc +++ b/third_party/blink/renderer/core/svg/svg_document_extensions.cc
@@ -81,7 +81,7 @@ for (auto& svg_element : web_animations_pending_svg_elements) svg_element->ApplyActiveWebAnimations(); - DCHECK(web_animations_pending_svg_elements_.IsEmpty()); + DCHECK(web_animations_pending_svg_elements_.empty()); } void SVGDocumentExtensions::StartAnimations() {
diff --git a/third_party/blink/renderer/core/svg/svg_element.cc b/third_party/blink/renderer/core/svg/svg_element.cc index 72a1bba6..ce505bd 100644 --- a/third_party/blink/renderer/core/svg/svg_element.cc +++ b/third_party/blink/renderer/core/svg/svg_element.cc
@@ -290,7 +290,7 @@ } bool SVGElement::HasNonCSSPropertyAnimations() const { - if (HasSVGRareData() && !SvgRareData()->WebAnimatedAttributes().IsEmpty()) + if (HasSVGRareData() && !SvgRareData()->WebAnimatedAttributes().empty()) return true; if (GetSMILAnimations() && GetSMILAnimations()->HasAnimations()) return true; @@ -687,7 +687,7 @@ const QualifiedName& attribute_name) { DEFINE_STATIC_LOCAL(AttributeToPropertyTypeMap, css_property_map, ()); - if (css_property_map.IsEmpty()) { + if (css_property_map.empty()) { // Fill the map for the first use. struct AttrToTypeEntry { const QualifiedName& attr; @@ -954,7 +954,7 @@ if (!HasSVGRareData()) return; const auto& animated_attributes = SvgRareData()->WebAnimatedAttributes(); - if (animated_attributes.IsEmpty() || !animated_attributes.Contains(attribute)) + if (animated_attributes.empty() || !animated_attributes.Contains(attribute)) return; // TODO(alancutter): Only mark attributes as dirty if their animation depends // on the underlying value. @@ -1080,7 +1080,7 @@ return; const HeapHashSet<WeakMember<SVGElement>>& set = InstancesForElement(); - if (set.IsEmpty()) + if (set.empty()) return; // Mark all use elements referencing 'element' for rebuilding @@ -1100,7 +1100,7 @@ StyleChangeType change_type, const StyleChangeReasonForTracing& reason) { const HeapHashSet<WeakMember<SVGElement>>& set = InstancesForElement(); - if (set.IsEmpty()) + if (set.empty()) return; for (SVGElement* instance : set)
diff --git a/third_party/blink/renderer/core/svg/svg_element.h b/third_party/blink/renderer/core/svg/svg_element.h index d283ffb..b12bf35 100644 --- a/third_party/blink/renderer/core/svg/svg_element.h +++ b/third_party/blink/renderer/core/svg/svg_element.h
@@ -69,7 +69,7 @@ String title() const override; bool HasRelativeLengths() const { - return !elements_with_relative_lengths_.IsEmpty(); + return !elements_with_relative_lengths_.empty(); } static bool IsAnimatableCSSProperty(const QualifiedName&);
diff --git a/third_party/blink/renderer/core/svg/svg_length.cc b/third_party/blink/renderer/core/svg/svg_length.cc index f30779b..e438b6ba 100644 --- a/third_party/blink/renderer/core/svg/svg_length.cc +++ b/third_party/blink/renderer/core/svg/svg_length.cc
@@ -258,7 +258,7 @@ typedef HashMap<QualifiedName, SVGLengthMode> LengthModeForLengthAttributeMap; DEFINE_STATIC_LOCAL(LengthModeForLengthAttributeMap, length_mode_map, ()); - if (length_mode_map.IsEmpty()) { + if (length_mode_map.empty()) { length_mode_map.Set(svg_names::kXAttr, SVGLengthMode::kWidth); length_mode_map.Set(svg_names::kYAttr, SVGLengthMode::kHeight); length_mode_map.Set(svg_names::kCxAttr, SVGLengthMode::kWidth);
diff --git a/third_party/blink/renderer/core/timing/background_tracing_helper.cc b/third_party/blink/renderer/core/timing/background_tracing_helper.cc index ac47783..d97941a 100644 --- a/third_party/blink/renderer/core/timing/background_tracing_helper.cc +++ b/third_party/blink/renderer/core/timing/background_tracing_helper.cc
@@ -130,7 +130,7 @@ // are permitted to be included in background traces. See crbug.com/1181774. // If there's no allow-list, then bail early. - if (GetSiteMarkHashMap().IsEmpty()) + if (GetSiteMarkHashMap().empty()) return; // Only support http and https origins to actual remote servers.
diff --git a/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc b/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc index 634e919..6ee7d5e 100644 --- a/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc +++ b/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc
@@ -111,46 +111,46 @@ // A list with a valid site hash not followed by an '=' is invalid. EXPECT_FALSE(ParseBackgroundTracingPerformanceMarkHashes("deadc0de", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with invalid characters in the site hash is invalid. EXPECT_FALSE( ParseBackgroundTracingPerformanceMarkHashes("nothex=aabbccdd", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with an.IsEmpty site hash is invalid. EXPECT_FALSE( ParseBackgroundTracingPerformanceMarkHashes("=aabbccdd", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with an too long site hash is invalid. EXPECT_FALSE(ParseBackgroundTracingPerformanceMarkHashes( "00deadc0de=aabbccdd", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with no mark hashes is invalid. EXPECT_FALSE( ParseBackgroundTracingPerformanceMarkHashes("deadc0de=", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with an.IsEmpty mark hash is invalid. EXPECT_FALSE(ParseBackgroundTracingPerformanceMarkHashes("deadc0de=,aabbccdd", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with a too long mark hash is invalid. EXPECT_FALSE(ParseBackgroundTracingPerformanceMarkHashes( "deadc0de=aabbccddee", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // A list with a non-hex mark hash is invalid. EXPECT_FALSE( ParseBackgroundTracingPerformanceMarkHashes("deadc0de=nothex", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // Parsing an empty list is valid, but the return should be empty as well. EXPECT_TRUE(ParseBackgroundTracingPerformanceMarkHashes("", hashes)); - EXPECT_TRUE(hashes.IsEmpty()); + EXPECT_TRUE(hashes.empty()); // Expect a single mark hash to be parsed. EXPECT_TRUE(
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc index 23cec93..42d4f3c 100644 --- a/third_party/blink/renderer/core/timing/performance.cc +++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -964,7 +964,7 @@ } void Performance::ActivateObserver(PerformanceObserver& observer) { - if (active_observers_.IsEmpty()) + if (active_observers_.empty()) deliver_observations_timer_.StartOneShot(base::TimeDelta(), FROM_HERE); if (suspended_observers_.Contains(&observer))
diff --git a/third_party/blink/renderer/core/timing/profiler_group.cc b/third_party/blink/renderer/core/timing/profiler_group.cc index 320a20c2..9474757 100644 --- a/third_party/blink/renderer/core/timing/profiler_group.cc +++ b/third_party/blink/renderer/core/timing/profiler_group.cc
@@ -222,7 +222,7 @@ } void ProfilerGroup::WillBeDestroyed() { - while (!profilers_.IsEmpty()) { + while (!profilers_.empty()) { Profiler* profiler = profilers_.begin()->Get(); DCHECK(profiler); CancelProfiler(profiler);
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc index 615f47d2..7cac6ac 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc +++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -90,7 +90,7 @@ bool SoftNavigationHeuristics::IsCurrentTaskDescendantOfClickEventHandler( ScriptState* script_state) { - if (potential_soft_navigation_task_ids_.IsEmpty()) { + if (potential_soft_navigation_task_ids_.empty()) { return false; } ThreadScheduler* scheduler = ThreadScheduler::Current();
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc index 5757a1af..cd75fee 100644 --- a/third_party/blink/renderer/core/timing/window_performance.cc +++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -447,7 +447,7 @@ base::TimeTicks presentation_timestamp) { DCHECK(pending_presentation_promise_count_); --pending_presentation_promise_count_; - if (events_data_.IsEmpty()) + if (events_data_.empty()) return; if (!DomWindow() || !DomWindow()->document()) @@ -456,7 +456,7 @@ InteractiveDetector::From(*(DomWindow()->document())); DOMHighResTimeStamp end_time = MonotonicTimeToDOMHighResTimeStamp(presentation_timestamp); - while (!events_data_.IsEmpty()) { + while (!events_data_.empty()) { auto event_data = events_data_.front(); PerformanceEventTiming* entry = event_data->GetEventTiming(); uint64_t entry_frame_index = event_data->GetFrameIndex();
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc index 6e92cac..2378878d 100644 --- a/third_party/blink/renderer/core/workers/worker_thread.cc +++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -161,7 +161,7 @@ InitializingWorkerThreads().erase(this); WorkerThreads().erase(this); - DCHECK(child_threads_.IsEmpty()); + DCHECK(child_threads_.empty()); DCHECK_NE(ExitCode::kNotTerminated, exit_code_); base::UmaHistogramEnumeration("WorkerThread.ExitCode", exit_code_); } @@ -449,7 +449,7 @@ void WorkerThread::ChildThreadTerminatedOnWorkerThread(WorkerThread* child) { DCHECK(IsCurrentThread()); child_threads_.erase(child); - if (child_threads_.IsEmpty() && CheckRequestedToTerminate()) + if (child_threads_.empty() && CheckRequestedToTerminate()) PerformShutdownOnWorkerThread(); } @@ -777,7 +777,7 @@ // down this thread. ChildThreadTerminatedOnWorkerThread() is responsible // for completing shutdown on the worker thread after the last child shuts // down. - if (!child_threads_.IsEmpty()) + if (!child_threads_.empty()) return; inspector_task_runner_->Dispose();
diff --git a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc index 6dcfab9..d6557bdd4 100644 --- a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc +++ b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc
@@ -1638,7 +1638,7 @@ parser_paused_ = false; // First, execute any pending callbacks - while (!pending_callbacks_.IsEmpty()) { + while (!pending_callbacks_.empty()) { callback_ = pending_callbacks_.TakeFirst(); callback_->Call(this); @@ -1663,7 +1663,7 @@ // Finally, if finish() has been called and write() didn't result // in any further callbacks being queued, call end() - if (finish_called_ && pending_callbacks_.IsEmpty()) + if (finish_called_ && pending_callbacks_.empty()) end(); }
diff --git a/third_party/blink/renderer/core/xml/xpath_node_set.cc b/third_party/blink/renderer/core/xml/xpath_node_set.cc index 0d87760..723a3ef 100644 --- a/third_party/blink/renderer/core/xml/xpath_node_set.cc +++ b/third_party/blink/renderer/core/xml/xpath_node_set.cc
@@ -155,7 +155,7 @@ } } - DCHECK(parent_nodes.IsEmpty()); + DCHECK(parent_nodes.empty()); } void NodeSet::Sort() const {
diff --git a/third_party/blink/renderer/core/xml/xpath_parser.cc b/third_party/blink/renderer/core/xml/xpath_parser.cc index e55143bc..943b50b 100644 --- a/third_party/blink/renderer/core/xml/xpath_parser.cc +++ b/third_party/blink/renderer/core/xml/xpath_parser.cc
@@ -98,7 +98,7 @@ static bool IsAxisName(const String& name, Step::Axis& type) { DEFINE_STATIC_LOCAL(AxisNamesMap, axis_names, ()); - if (axis_names.IsEmpty()) + if (axis_names.empty()) SetUpAxisNamesMap(axis_names); AxisNamesMap::iterator it = axis_names.find(name);
diff --git a/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc b/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc index 36a0832..3f563c5 100644 --- a/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc +++ b/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc
@@ -240,7 +240,7 @@ static const char** XsltParamArrayFromParameterMap( XSLTProcessor::ParameterMap& parameters) { - if (parameters.IsEmpty()) + if (parameters.empty()) return nullptr; base::CheckedNumeric<size_t> size = parameters.size();
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index a61e853..895e971 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -790,7 +790,7 @@ // page's banner/contentInfo. static HashSet<QualifiedName>& GetLandmarkRolesNotAllowed() { DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, landmark_roles_not_allowed, ()); - if (landmark_roles_not_allowed.IsEmpty()) { + if (landmark_roles_not_allowed.empty()) { landmark_roles_not_allowed.insert(html_names::kArticleTag); landmark_roles_not_allowed.insert(html_names::kAsideTag); landmark_roles_not_allowed.insert(html_names::kNavTag);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index c462da1..822434a9 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -2509,8 +2509,8 @@ #if DCHECK_IS_ON() DCHECK_LE(++loop_counter, 100) << "Probable infinite loop detected."; #endif - } while (!nodes_with_pending_children_changed_.IsEmpty() || - !GetInvalidatedIds(document).IsEmpty()); + } while (!nodes_with_pending_children_changed_.empty() || + !GetInvalidatedIds(document).empty()); // Send events to RenderAccessibilityImpl, which serializes them and then // sends the serialized events and dirty objects to the browser process. @@ -2524,8 +2524,8 @@ !tree_update_callback_queue_popup_.empty() || !notifications_to_post_main_.empty() || !notifications_to_post_popup_.empty() || - !invalidated_ids_main_.IsEmpty() || - !invalidated_ids_popup_.IsEmpty() || relation_cache_->IsDirty(); + !invalidated_ids_main_.empty() || !invalidated_ids_popup_.empty() || + relation_cache_->IsDirty(); } void AXObjectCacheImpl::EmbeddingTokenChanged(HTMLFrameOwnerElement* element) { @@ -3839,7 +3839,7 @@ } void AXObjectCacheImpl::SerializeLocationChanges() { - if (changed_bounds_ids_.IsEmpty()) + if (changed_bounds_ids_.empty()) return; Vector<mojom::blink::LocationChangesPtr> changes; changes.ReserveCapacity(changed_bounds_ids_.size());
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc index c642dba1..8865c02 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
@@ -64,7 +64,7 @@ } bool AXRelationCache::IsDirty() const { - return !initialized_ || !owner_ids_to_update_.IsEmpty(); + return !initialized_ || !owner_ids_to_update_.empty(); } bool AXRelationCache::IsAriaOwned(const AXObject* child) const {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc b/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc index dc5fb7c..1020f08 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc
@@ -116,7 +116,7 @@ AXSparseAttributeSetterMap& GetAXSparseAttributeSetterMap() { DEFINE_STATIC_LOCAL(AXSparseAttributeSetterMap, ax_sparse_setter_map, ()); - if (ax_sparse_setter_map.IsEmpty()) { + if (ax_sparse_setter_map.empty()) { ax_sparse_setter_map.Set( html_names::kAriaActivedescendantAttr, WTF::BindRepeating(&SetObjectAttribute,
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc index b28e8f42..b922f75b 100644 --- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc +++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -1145,7 +1145,7 @@ } void InspectorAccessibilityAgent::RefreshFrontendNodes(TimerBase*) { - if (dirty_nodes_.IsEmpty()) + if (dirty_nodes_.empty()) return; auto nodes = std::make_unique<protocol::Array<protocol::Accessibility::AXNode>>(); @@ -1252,7 +1252,7 @@ DCHECK(EnabledAgents().Contains(frame)); auto it = EnabledAgents().find(frame); it->value->erase(this); - if (it->value->IsEmpty()) + if (it->value->empty()) EnabledAgents().erase(frame); for (auto& context : document_to_context_map_.Values()) { auto& cache = To<AXObjectCacheImpl>(context->GetAXObjectCache());
diff --git a/third_party/blink/renderer/modules/ad_auction/DEPS b/third_party/blink/renderer/modules/ad_auction/DEPS index 82f8e89..48a669f 100644 --- a/third_party/blink/renderer/modules/ad_auction/DEPS +++ b/third_party/blink/renderer/modules/ad_auction/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+base/unguessable_token.h", "+url/url_constants.h", ]
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl index 886c58c..f8daca89 100644 --- a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl +++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
@@ -12,6 +12,7 @@ sequence<USVString> interestGroupBuyers; any auctionSignals; any sellerSignals; + USVString directFromSellerSignals; unsigned long long sellerTimeout; unsigned short sellerExperimentGroupId; record<USVString, any> perBuyerSignals;
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index c9c6ccd..1384406 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -9,7 +9,9 @@ #include "base/check.h" #include "base/memory/scoped_refptr.h" #include "base/time/time.h" +#include "base/unguessable_token.h" #include "mojo/public/cpp/bindings/map_traits_wtf_hash_map.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h" @@ -44,6 +46,7 @@ #include "third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.h" #include "third_party/blink/renderer/modules/geolocation/geolocation_coordinates.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/weborigin/security_origin_hash.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -677,6 +680,117 @@ return true; } +// Attempts to build a DirectFromSellerSignalsSubresource. If there is no +// registered subresource URL `subresource_url` returns nullptr -- processing +// may continue with the next `subresource_url`. +mojom::blink::DirectFromSellerSignalsSubresourcePtr +TryToBuildDirectFromSellerSignalsSubresource( + const KURL& subresource_url, + const SecurityOrigin& seller, + ExceptionState& exception_state, + const AuctionAdConfig& input, + const ResourceFetcher& resource_fetcher) { + DCHECK(subresource_url.IsValid()); + DCHECK( + subresource_url.ProtocolIs(url::kHttpsScheme) && + seller.IsSameOriginWith(SecurityOrigin::Create(subresource_url).get())); + // NOTE: If subresource bundles are disabled, GetSubresourceBundleToken() will + // always return absl::nullopt. + absl::optional<base::UnguessableToken> token = + resource_fetcher.GetSubresourceBundleToken(subresource_url); + if (!token) + return nullptr; + absl::optional<KURL> bundle_url = + resource_fetcher.GetSubresourceBundleSourceUrl(subresource_url); + DCHECK(bundle_url->ProtocolIs(url::kHttpsScheme)); + DCHECK(seller.IsSameOriginWith(SecurityOrigin::Create(*bundle_url).get())); + auto mojo_bundle = mojom::blink::DirectFromSellerSignalsSubresource::New(); + mojo_bundle->token = *token; + mojo_bundle->bundle_url = *bundle_url; + return mojo_bundle; +} + +bool CopyDirectFromSellerSignalsFromIdlToMojo( + const ExecutionContext& context, + ExceptionState& exception_state, + const AuctionAdConfig& input, + const ResourceFetcher& resource_fetcher, + mojom::blink::AuctionAdConfig& output) { + if (!input.hasDirectFromSellerSignals()) + return true; + const KURL direct_from_seller_signals_prefix = + context.CompleteURL(input.directFromSellerSignals()); + if (!direct_from_seller_signals_prefix.IsValid()) { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "directFromSellerSignals", input.directFromSellerSignals(), + "cannot be resolved to a valid URL.")); + return false; + } + if (!direct_from_seller_signals_prefix.ProtocolIs(url::kHttpsScheme) || + !output.seller->IsSameOriginWith( + SecurityOrigin::Create(direct_from_seller_signals_prefix).get())) { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "directFromSellerSignals", input.directFromSellerSignals(), + "must match seller origin; only https scheme is supported.")); + return false; + } + if (!direct_from_seller_signals_prefix.Query().IsEmpty()) { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "directFromSellerSignals", input.directFromSellerSignals(), + "URL prefix must not have a query string.")); + return false; + } + auto mojo_direct_from_seller_signals = + mojom::blink::DirectFromSellerSignals::New(); + mojo_direct_from_seller_signals->prefix = direct_from_seller_signals_prefix; + + for (scoped_refptr<const SecurityOrigin> buyer : + *output.auction_ad_config_non_shared_params->interest_group_buyers) { + // Replace "/" with "%2F" to match the behavior of + // base::EscapeQueryParamValue(). Also, the subresource won't be found if + // the URL doesn't match. + const KURL subresource_url( + direct_from_seller_signals_prefix.GetString() + "?perBuyerSignals=" + + EncodeWithURLEscapeSequences(buyer->ToString()).Replace("/", "%2F")); + mojom::blink::DirectFromSellerSignalsSubresourcePtr maybe_mojo_bundle = + TryToBuildDirectFromSellerSignalsSubresource( + subresource_url, *output.seller, exception_state, input, + resource_fetcher); + if (!maybe_mojo_bundle) + continue; // The bundle wasn't found, try the next one. + mojo_direct_from_seller_signals->per_buyer_signals.insert( + buyer, std::move(maybe_mojo_bundle)); + } + + { + const KURL subresource_url(direct_from_seller_signals_prefix.GetString() + + "?sellerSignals"); + mojom::blink::DirectFromSellerSignalsSubresourcePtr maybe_mojo_bundle = + TryToBuildDirectFromSellerSignalsSubresource( + subresource_url, *output.seller, exception_state, input, + resource_fetcher); + // May be null if the signals weren't found. + mojo_direct_from_seller_signals->seller_signals = + std::move(maybe_mojo_bundle); + } + + { + const KURL subresource_url(direct_from_seller_signals_prefix.GetString() + + "?auctionSignals"); + mojom::blink::DirectFromSellerSignalsSubresourcePtr maybe_mojo_bundle = + TryToBuildDirectFromSellerSignalsSubresource( + subresource_url, *output.seller, exception_state, input, + resource_fetcher); + // May be null if the signals weren't found. + mojo_direct_from_seller_signals->auction_signals = + std::move(maybe_mojo_bundle); + } + + output.direct_from_seller_signals = + std::move(mojo_direct_from_seller_signals); + return true; +} + bool CopyPerBuyerSignalsFromIdlToMojo(const ScriptState& script_state, ExceptionState& exception_state, const AuctionAdConfig& input, @@ -863,6 +977,7 @@ ScriptState& script_state, const ExecutionContext& context, ExceptionState& exception_state, + const ResourceFetcher& resource_fetcher, const AuctionAdConfig& config) { auto mojo_config = mojom::blink::AuctionAdConfig::New(); mojo_config->auction_ad_config_non_shared_params = @@ -878,6 +993,8 @@ *mojo_config) || !CopySellerSignalsFromIdlToMojo(script_state, exception_state, config, *mojo_config) || + !CopyDirectFromSellerSignalsFromIdlToMojo( + context, exception_state, config, resource_fetcher, *mojo_config) || !CopyPerBuyerSignalsFromIdlToMojo(script_state, exception_state, config, *mojo_config) || !CopyPerBuyerTimeoutsFromIdlToMojo(script_state, exception_state, config, @@ -907,9 +1024,9 @@ return mojom::blink::AuctionAdConfigPtr(); } - auto mojo_component_auction = - IdlAuctionConfigToMojo(/*is_top_level=*/false, script_state, context, - exception_state, *idl_component_auction); + auto mojo_component_auction = IdlAuctionConfigToMojo( + /*is_top_level=*/false, script_state, context, exception_state, + resource_fetcher, *idl_component_auction); if (!mojo_component_auction) return mojom::blink::AuctionAdConfigPtr(); mojo_config->auction_ad_config_non_shared_params->component_auctions @@ -1301,7 +1418,9 @@ ExceptionState& exception_state) { ExecutionContext* context = ExecutionContext::From(script_state); auto mojo_config = IdlAuctionConfigToMojo( - /*is_top_level=*/true, *script_state, *context, exception_state, *config); + /*is_top_level=*/true, *script_state, *context, exception_state, + /*resource_fetcher=*/ + *GetSupplementable()->DomWindow()->document()->Fetcher(), *config); if (!mojo_config) return ScriptPromise();
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc index c8c1f35..b94b21a 100644 --- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc +++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
@@ -98,26 +98,30 @@ if (execution_context->IsWindow()) { Document* document = To<LocalDOMWindow>(execution_context)->document(); if (document->IsPrerendering()) { - document->AddPostPrerenderingActivationStep(WTF::BindOnce( - &BroadcastChannel::PostMessageInternal, WrapWeakPersistent(this), - std::move(value), - execution_context->GetSecurityOrigin()->IsolatedCopy())); + document->AddPostPrerenderingActivationStep( + WTF::BindOnce(&BroadcastChannel::PostMessageInternal, + WrapWeakPersistent(this), std::move(value), + execution_context->GetSecurityOrigin()->IsolatedCopy(), + execution_context->GetAgentClusterID())); return; } } PostMessageInternal(std::move(value), - execution_context->GetSecurityOrigin()->IsolatedCopy()); + execution_context->GetSecurityOrigin()->IsolatedCopy(), + execution_context->GetAgentClusterID()); } void BroadcastChannel::PostMessageInternal( scoped_refptr<SerializedScriptValue> value, - scoped_refptr<SecurityOrigin> sender_origin) { + scoped_refptr<SecurityOrigin> sender_origin, + const base::UnguessableToken sender_agent_cluster_id) { if (!receiver_.is_bound()) return; BlinkCloneableMessage msg; msg.message = std::move(value); msg.sender_origin = std::move(sender_origin); + msg.sender_agent_cluster_id = sender_agent_cluster_id; remote_client_->OnMessage(std::move(msg)); } @@ -155,9 +159,9 @@ void BroadcastChannel::OnMessage(BlinkCloneableMessage message) { // Queue a task to dispatch the event. MessageEvent* event; - if (!message.locked_agent_cluster_id || + if (!message.locked_to_sender_agent_cluster || GetExecutionContext()->IsSameAgentCluster( - *message.locked_agent_cluster_id)) { + message.sender_agent_cluster_id)) { event = MessageEvent::Create( nullptr, std::move(message.message), GetExecutionContext()->GetSecurityOrigin()->ToString());
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h index c0fdd5de..297fe15 100644 --- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h +++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
@@ -60,8 +60,10 @@ void Trace(Visitor*) const override; private: - void PostMessageInternal(scoped_refptr<SerializedScriptValue> value, - scoped_refptr<SecurityOrigin> sender_origin); + void PostMessageInternal( + scoped_refptr<SerializedScriptValue> value, + scoped_refptr<SecurityOrigin> sender_origin, + const base::UnguessableToken sender_agent_cluster_id); // mojom::blink::BroadcastChannelClient: void OnMessage(BlinkCloneableMessage) override;
diff --git a/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc b/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc index 95e3c034..1f41e9b 100644 --- a/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc +++ b/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc
@@ -90,8 +90,8 @@ // Disconnected from the browser process only when PressureObserverManager is // active and there is no other observers. - if (receiver_.is_bound() && registered_observers_[source_index].IsEmpty() && - registering_observers_[source_index].IsEmpty()) { + if (receiver_.is_bound() && registered_observers_[source_index].empty() && + registering_observers_[source_index].empty()) { // TODO(crbug.com/1342184): Consider other sources. // For now, "cpu" is the only source, so disconnect directly. receiver_.reset();
diff --git a/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc b/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc index 240f08ed..e425aedb 100644 --- a/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc +++ b/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc
@@ -354,7 +354,7 @@ HTMLVideoElement* PictureInPictureControllerImpl::AutoPictureInPictureElement() const { - return auto_picture_in_picture_elements_.IsEmpty() + return auto_picture_in_picture_elements_.empty() ? nullptr : auto_picture_in_picture_elements_.back(); }
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc index 0a70c47..42656c9b 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc +++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc
@@ -896,7 +896,7 @@ HeapDeque<Member<PendingAction>> pending_actions; pending_actions.Swap(pending_actions_); - while (!pending_actions.IsEmpty()) { + while (!pending_actions.empty()) { PendingAction* action = pending_actions.TakeFirst(); switch (action->GetType()) { case PendingAction::Type::kGenerateRequest: @@ -999,7 +999,7 @@ // Fail any pending events, except if it's a close request. action_timer_.Stop(); - while (!pending_actions_.IsEmpty()) { + while (!pending_actions_.empty()) { PendingAction* action = pending_actions_.TakeFirst(); if (action->GetType() == PendingAction::Type::kClose) { action->Result()->Complete(); @@ -1097,14 +1097,14 @@ // and we're not closed. DVLOG(MEDIA_KEY_SESSION_LOG_LEVEL) << __func__ << "(" << this << ")" - << (!pending_actions_.IsEmpty() ? " !pending_actions_.IsEmpty()" : "") + << (!pending_actions_.empty() ? " !pending_actions_.IsEmpty()" : "") << (async_event_queue_->HasPendingEvents() ? " async_event_queue_->HasPendingEvents()" : "") << ((media_keys_ && !is_closed_) ? " media_keys_ && !is_closed_" : ""); - return !pending_actions_.IsEmpty() || - async_event_queue_->HasPendingEvents() || (media_keys_ && !is_closed_); + return !pending_actions_.empty() || async_event_queue_->HasPendingEvents() || + (media_keys_ && !is_closed_); } void MediaKeySession::ContextDestroyed() {
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_keys.cc b/third_party/blink/renderer/modules/encryptedmedia/media_keys.cc index fa3a10b..fb826b4 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/media_keys.cc +++ b/third_party/blink/renderer/modules/encryptedmedia/media_keys.cc
@@ -499,7 +499,7 @@ HeapDeque<Member<PendingAction>> pending_actions; pending_actions.Swap(pending_actions_); - while (!pending_actions.IsEmpty()) { + while (!pending_actions.empty()) { PendingAction* action = pending_actions.TakeFirst(); switch (action->GetType()) { @@ -542,10 +542,10 @@ // Remain around if there are pending events. DVLOG(MEDIA_KEYS_LOG_LEVEL) << __func__ << "(" << this << ")" - << (!pending_actions_.IsEmpty() ? " !pending_actions_.isEmpty()" : "") + << (!pending_actions_.empty() ? " !pending_actions_.isEmpty()" : "") << (reserved_for_media_element_ ? " reserved_for_media_element_" : ""); - return !pending_actions_.IsEmpty() || reserved_for_media_element_; + return !pending_actions_.empty() || reserved_for_media_element_; } } // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc index 578e0cc..7270088 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc
@@ -36,7 +36,7 @@ return result; } - if (!entries_.IsEmpty()) { + if (!entries_.empty()) { FileSystemHandle* handle = entries_.TakeFirst(); ScriptValue result; switch (mode_) {
diff --git a/third_party/blink/renderer/modules/geolocation/geolocation.h b/third_party/blink/renderer/modules/geolocation/geolocation.h index 600ec42..30fec80 100644 --- a/third_party/blink/renderer/modules/geolocation/geolocation.h +++ b/third_party/blink/renderer/modules/geolocation/geolocation.h
@@ -150,7 +150,7 @@ } auto Contains(GeoNotifier* value) const { return set_.Contains(value); } - auto IsEmpty() const { return set_.IsEmpty(); } + auto IsEmpty() const { return set_.empty(); } auto InsertWithoutTimerCheck(GeoNotifier* value) { return set_.insert(value);
diff --git a/third_party/blink/renderer/modules/geolocation/geolocation_watchers.cc b/third_party/blink/renderer/modules/geolocation/geolocation_watchers.cc index 9e27110c..c660fc2 100644 --- a/third_party/blink/renderer/modules/geolocation/geolocation_watchers.cc +++ b/third_party/blink/renderer/modules/geolocation/geolocation_watchers.cc
@@ -64,7 +64,7 @@ } bool GeolocationWatchers::IsEmpty() const { - return id_to_notifier_map_.IsEmpty(); + return id_to_notifier_map_.empty(); } void GeolocationWatchers::Swap(GeolocationWatchers& other) {
diff --git a/third_party/blink/renderer/modules/hid/hid.cc b/third_party/blink/renderer/modules/hid/hid.cc index ce151b9a..18b4f366 100644 --- a/third_party/blink/renderer/modules/hid/hid.cc +++ b/third_party/blink/renderer/modules/hid/hid.cc
@@ -82,8 +82,8 @@ } HID::~HID() { - DCHECK(get_devices_promises_.IsEmpty()); - DCHECK(request_device_promises_.IsEmpty()); + DCHECK(get_devices_promises_.empty()); + DCHECK(request_device_promises_.empty()); } ExecutionContext* HID::GetExecutionContext() const {
diff --git a/third_party/blink/renderer/modules/hid/hid_device.cc b/third_party/blink/renderer/modules/hid/hid_device.cc index fabc22e..d49990c 100644 --- a/third_party/blink/renderer/modules/hid/hid_device.cc +++ b/third_party/blink/renderer/modules/hid/hid_device.cc
@@ -207,7 +207,7 @@ } HIDDevice::~HIDDevice() { - DCHECK(device_requests_.IsEmpty()); + DCHECK(device_requests_.empty()); } ExecutionContext* HIDDevice::GetExecutionContext() const {
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc index dab231d..562ef94 100644 --- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc +++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -168,7 +168,7 @@ DCHECK(!HasEventListeners()); // There should be no more outstanding |m_serviceRequests| at this point // since each of them holds a persistent handle to this object. - DCHECK(service_requests_.IsEmpty()); + DCHECK(service_requests_.empty()); } const AtomicString& ImageCapture::InterfaceName() const {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.cc b/third_party/blink/renderer/modules/indexeddb/idb_database.cc index a2e5f639..26590a0 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_database.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
@@ -165,7 +165,7 @@ version_change_transaction_ = nullptr; } - if (close_pending_ && transactions_.IsEmpty()) + if (close_pending_ && transactions_.empty()) CloseConnection(); } @@ -368,7 +368,7 @@ return nullptr; } - if (scope.IsEmpty()) { + if (scope.empty()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, "The storeNames parameter was empty."); return nullptr; @@ -429,13 +429,13 @@ close_pending_ = true; feature_handle_for_scheduler_.reset(); - if (transactions_.IsEmpty()) + if (transactions_.empty()) CloseConnection(); } void IDBDatabase::CloseConnection() { DCHECK(close_pending_); - DCHECK(transactions_.IsEmpty()); + DCHECK(transactions_.empty()); if (backend_) { backend_->Close();
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc b/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc index 9c08d7c7..5ada03b0 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
@@ -55,8 +55,8 @@ mojom::IDBTransactionDurability durability, IDBDatabase* db) { DCHECK_NE(mode, mojom::IDBTransactionMode::VersionChange); - DCHECK(!scope.IsEmpty()) << "Non-version transactions should operate on a " - "well-defined set of stores"; + DCHECK(!scope.empty()) << "Non-version transactions should operate on a " + "well-defined set of stores"; return MakeGarbageCollected<IDBTransaction>(script_state, std::move(transaction_backend), id, scope, mode, durability, db); @@ -99,8 +99,8 @@ SchedulingPolicy::Feature::kOutstandingIndexedDBTransaction, {SchedulingPolicy::DisableBackForwardCache()})) { DCHECK(database_); - DCHECK(!scope_.IsEmpty()) << "Non-versionchange transactions must operate " - "on a well-defined set of stores"; + DCHECK(!scope_.empty()) << "Non-versionchange transactions must operate " + "on a well-defined set of stores"; DCHECK(mode_ == mojom::IDBTransactionMode::ReadOnly || mode_ == mojom::IDBTransactionMode::ReadWrite) << "Invalid transaction mode"; @@ -134,7 +134,7 @@ TaskType::kDatabaseAccess)) { DCHECK(database_); DCHECK(open_db_request_); - DCHECK(scope_.IsEmpty()); + DCHECK(scope_.empty()); database_->TransactionCreated(this); } @@ -144,7 +144,7 @@ // ContextClient) only in order to be able call upon GetExecutionContext() // during this destructor. DCHECK(state_ == kFinished || !GetExecutionContext()); - DCHECK(request_list_.IsEmpty() || !GetExecutionContext()); + DCHECK(request_list_.empty() || !GetExecutionContext()); } void IDBTransaction::Trace(Visitor* visitor) const { @@ -328,7 +328,7 @@ DCHECK_NE(new_is_active, (state_ == kActive)); state_ = new_is_active ? kActive : kInactive; - if (!new_is_active && request_list_.IsEmpty() && transaction_backend()) + if (!new_is_active && request_list_.empty() && transaction_backend()) transaction_backend()->Commit(num_errors_handled_); }
diff --git a/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc b/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc index 67b41a50..218c8c0 100644 --- a/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc +++ b/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc
@@ -55,7 +55,7 @@ bool NavigatorManagedData::HasPendingActivity() const { // Prevents garbage collecting of this object when not hold by another // object but still has listeners registered. - return !pending_promises_.IsEmpty() || HasEventListeners(); + return !pending_promises_.empty() || HasEventListeners(); } void NavigatorManagedData::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.cc b/third_party/blink/renderer/modules/manifest/manifest_parser.cc index a2772ea..58ac6994 100644 --- a/third_party/blink/renderer/modules/manifest/manifest_parser.cc +++ b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
@@ -1139,7 +1139,7 @@ } entry->accept = ParseFileHandlerAccept(file_handler->GetJSONObject("accept")); - if (entry->accept.IsEmpty()) { + if (entry->accept.empty()) { AddErrorInfo("FileHandler ignored. Property 'accept' is invalid."); return absl::nullopt; }
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc index bc051c786..3778f3f 100644 --- a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc +++ b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
@@ -5251,7 +5251,7 @@ // Feature not enabled, should not be parsed. auto& manifest = ParseManifest(R"({ "translations": {"fr": {"name": "french name"}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(0u, GetErrorCount()); } { @@ -5260,21 +5260,21 @@ // Manifest does not contain a 'translations' field. { auto& manifest = ParseManifest(R"({ })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(0u, GetErrorCount()); } // Don't parse if translations object is empty. { auto& manifest = ParseManifest(R"({ "translations": {} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(0u, GetErrorCount()); } // Empty translation is ignored. { auto& manifest = ParseManifest(R"({ "translations": {"fr": {}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_FALSE(manifest->translations.Contains("fr")); EXPECT_EQ(0u, GetErrorCount()); } @@ -5284,7 +5284,7 @@ auto& manifest = ParseManifest( R"({ "translations": {"fr": {"name": "french name", "short_name": "fr name", "description": "french description"}} })"); - EXPECT_FALSE(manifest->translations.IsEmpty()); + EXPECT_FALSE(manifest->translations.empty()); EXPECT_TRUE(manifest->translations.Contains("fr")); EXPECT_EQ(manifest->translations.find("fr")->value->name, "french name"); EXPECT_EQ(manifest->translations.find("fr")->value->short_name, @@ -5297,7 +5297,7 @@ // Don't parse if the property isn't an object. { auto& manifest = ParseManifest(R"({ "translations": [] })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(1u, GetErrorCount()); EXPECT_EQ("property 'translations' ignored, object expected.", errors()[0]); @@ -5306,7 +5306,7 @@ // Ignore translation if it isn't an object. { auto& manifest = ParseManifest(R"({ "translations": {"fr": []} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(1u, GetErrorCount()); EXPECT_EQ("skipping translation, object expected.", errors()[0]); } @@ -5316,7 +5316,7 @@ auto& manifest = ParseManifest( R"({ "translations": {"fr": {"name": "french name"}, "es": {"name": "spanish name"}} })"); - EXPECT_FALSE(manifest->translations.IsEmpty()); + EXPECT_FALSE(manifest->translations.empty()); EXPECT_TRUE(manifest->translations.Contains("fr")); EXPECT_TRUE(manifest->translations.Contains("es")); EXPECT_EQ(manifest->translations.find("fr")->value->name, "french name"); @@ -5328,7 +5328,7 @@ { auto& manifest = ParseManifest( R"({ "translations": {"": {"name": "translated name"}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(1u, GetErrorCount()); EXPECT_EQ("skipping translation, non-empty locale string expected.", errors()[0]); @@ -5343,7 +5343,7 @@ { auto& manifest = ParseManifest(R"({ "translations": {"fr": {"name": {}}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(1u, GetErrorCount()); EXPECT_EQ( "property 'name' of 'translations' ignored, type string expected.", @@ -5354,7 +5354,7 @@ { auto& manifest = ParseManifest(R"({ "translations": {"fr": {"short_name": []}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(1u, GetErrorCount()); EXPECT_EQ( "property 'short_name' of 'translations' ignored, type string " @@ -5366,7 +5366,7 @@ { auto& manifest = ParseManifest(R"({ "translations": {"fr": {"description": 42}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_EQ(1u, GetErrorCount()); EXPECT_EQ( "property 'description' of 'translations' ignored, type string " @@ -5379,7 +5379,7 @@ auto& manifest = ParseManifest( R"({ "translations": {"fr": {"name": "", "short_name": "", "description": ""}} })"); - EXPECT_TRUE(manifest->translations.IsEmpty()); + EXPECT_TRUE(manifest->translations.empty()); EXPECT_FALSE(manifest->translations.Contains("fr")); EXPECT_EQ(3u, GetErrorCount()); EXPECT_EQ("property 'name' of 'translations' is an empty string.",
diff --git a/third_party/blink/renderer/modules/media/audio/audio_output_ipc_factory.cc b/third_party/blink/renderer/modules/media/audio/audio_output_ipc_factory.cc index 4911851..2eb020c 100644 --- a/third_party/blink/renderer/modules/media/audio/audio_output_ipc_factory.cc +++ b/third_party/blink/renderer/modules/media/audio/audio_output_ipc_factory.cc
@@ -32,7 +32,7 @@ Impl(const Impl&) = delete; Impl& operator=(const Impl&) = delete; - ~Impl() { DCHECK(factory_remotes_.IsEmpty()); } + ~Impl() { DCHECK(factory_remotes_.empty()); } mojom::blink::RendererAudioOutputStreamFactory* GetRemoteFactory( const blink::LocalFrameToken& frame_token) const;
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc index 24d957ac..9fe6a46 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
@@ -307,7 +307,7 @@ void GestureDoubleTapAt(gfx::PointF pos); bool HasAvailabilityCallbacks(RemotePlayback& remote_playback) { - return !remote_playback.availability_callbacks_.IsEmpty(); + return !remote_playback.availability_callbacks_.empty(); } const String GetDisplayedTime(MediaControlTimeDisplayElement* display) {
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc index ac46258..e03da8a7 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
@@ -736,7 +736,7 @@ // Alpha can't be discarded if any sink uses alpha, or if the only sinks // connected are kDependsOnOtherSinks. const bool can_discard_alpha = - alpha_using_sinks_.IsEmpty() && !alpha_discarding_sinks_.IsEmpty(); + alpha_using_sinks_.empty() && !alpha_discarding_sinks_.empty(); source_->SetCanDiscardAlpha(can_discard_alpha); if (is_screencast_) StartTimerForRequestingFrames(); @@ -774,7 +774,7 @@ secure_tracker_.is_capturing_secure()); const bool can_discard_alpha = sinks_.empty() || - (alpha_using_sinks_.IsEmpty() && !alpha_discarding_sinks_.IsEmpty()); + (alpha_using_sinks_.empty() && !alpha_discarding_sinks_.empty()); source_->SetCanDiscardAlpha(can_discard_alpha); // Restart the timer with existing sinks. if (is_screencast_)
diff --git a/third_party/blink/renderer/modules/payments/secure_payment_confirmation_request.idl b/third_party/blink/renderer/modules/payments/secure_payment_confirmation_request.idl index 0d2c73f..f63010e 100644 --- a/third_party/blink/renderer/modules/payments/secure_payment_confirmation_request.idl +++ b/third_party/blink/renderer/modules/payments/secure_payment_confirmation_request.idl
@@ -5,21 +5,15 @@ // https://w3c.github.io/secure-payment-confirmation/#sctn-securepaymentconfirmationrequest-dictionary dictionary SecurePaymentConfirmationRequest { - required sequence<BufferSource> credentialIds; - - // Opaque data about the current transaction provided by the issuer. As the - // issuer is the RP of the credential, `challenge` provides protection - // against replay attacks. required BufferSource challenge; - + required USVString rpId; + required sequence<BufferSource> credentialIds; required PaymentCredentialInstrument instrument; unsigned long timeout; USVString payeeName; USVString payeeOrigin; - - // The relying party, which must be the relying party of a given credential - // ID for it to match. - required USVString rpId; + // TODO(crbug.com/1365339): add 'extensions' member. + sequence<USVString> locale; // Whether or not to show an opt-out flow in the SPC UX. [RuntimeEnabled=SecurePaymentConfirmationOptOut, MeasureAs=SecurePaymentConfirmationOptOut] boolean showOptOut;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtp_contributing_source_cache.cc b/third_party/blink/renderer/modules/peerconnection/rtp_contributing_source_cache.cc index 5c8e3e1..7e486c30 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtp_contributing_source_cache.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtp_contributing_source_cache.cc
@@ -153,7 +153,7 @@ // Receivers whose cache to update. Vector<RTCRtpReceiverPlatform*> receivers; - if (cached_sources_by_receiver->IsEmpty()) { + if (cached_sources_by_receiver->empty()) { // If the cache is empty then we only update the cache for this one // receiver. This avoids updating the cache for all receivers in cases where // the app is only interested in a single receiver per kind.
diff --git a/third_party/blink/renderer/modules/permissions/permission_status_listener.cc b/third_party/blink/renderer/modules/permissions/permission_status_listener.cc index 424314c..f0a4e6ee 100644 --- a/third_party/blink/renderer/modules/permissions/permission_status_listener.cc +++ b/third_party/blink/renderer/modules/permissions/permission_status_listener.cc
@@ -71,7 +71,7 @@ } void PermissionStatusListener::AddObserver(Observer* observer) { - if (observers_.IsEmpty()) + if (observers_.empty()) StartListening(); observers_.insert(observer); @@ -80,7 +80,7 @@ void PermissionStatusListener::RemoveObserver(Observer* observer) { observers_.erase(observer); - if (observers_.IsEmpty()) + if (observers_.empty()) StopListening(); }
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc index bb5f1184..58dff91a 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -522,7 +522,7 @@ if (!target_connection_.is_bound()) return; - while (!messages_.IsEmpty() && !blob_loader_) { + while (!messages_.empty() && !blob_loader_) { Message* message = messages_.front().Get(); switch (message->type) { case kMessageTypeText: @@ -637,7 +637,7 @@ } void PresentationConnection::DidFinishLoadingBlob(DOMArrayBuffer* buffer) { - DCHECK(!messages_.IsEmpty()); + DCHECK(!messages_.empty()); DCHECK_EQ(messages_.front()->type, kMessageTypeBlob); DCHECK(buffer); if (!base::CheckedNumeric<wtf_size_t>(buffer->ByteLength()).IsValid()) { @@ -658,7 +658,7 @@ } void PresentationConnection::DidFailLoadingBlob(FileErrorCode error_code) { - DCHECK(!messages_.IsEmpty()); + DCHECK(!messages_.empty()); DCHECK_EQ(messages_.front()->type, kMessageTypeBlob); // TODO(crbug.com/1036565): generate error message? // Ignore the current failed blob item and continue with next items.
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc index acf8e2a..9a67da8 100644 --- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc +++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
@@ -262,7 +262,7 @@ } bool RemotePlayback::HasPendingActivity() const { - return HasEventListeners() || !availability_callbacks_.IsEmpty() || + return HasEventListeners() || !availability_callbacks_.empty() || prompt_promise_resolver_; } @@ -339,7 +339,7 @@ if (iter == availability_callbacks_.end()) return false; availability_callbacks_.erase(iter); - if (availability_callbacks_.IsEmpty()) + if (availability_callbacks_.empty()) StopListeningForAvailability(); return true; @@ -641,7 +641,7 @@ if (is_listening_) return; - if (availability_urls_.empty() || availability_callbacks_.IsEmpty()) + if (availability_urls_.empty() || availability_callbacks_.empty()) return; PresentationController* controller =
diff --git a/third_party/blink/renderer/modules/sanitizer_api/config_util.cc b/third_party/blink/renderer/modules/sanitizer_api/config_util.cc index 9370323..530ee8f 100644 --- a/third_party/blink/renderer/modules/sanitizer_api/config_util.cc +++ b/third_party/blink/renderer/modules/sanitizer_api/config_util.cc
@@ -155,11 +155,11 @@ config->setAllowElements(ToAPI(impl.allow_elements_)); } - if (!impl.drop_elements_.IsEmpty()) { + if (!impl.drop_elements_.empty()) { config->setDropElements(ToAPI(impl.drop_elements_)); } - if (!impl.block_elements_.IsEmpty()) { + if (!impl.block_elements_.empty()) { config->setBlockElements(ToAPI(impl.block_elements_)); } @@ -167,7 +167,7 @@ config->setAllowAttributes(ToAPI(impl.allow_attributes_)); } - if (!impl.drop_attributes_.IsEmpty()) { + if (!impl.drop_attributes_.empty()) { config->setDropAttributes(ToAPI(impl.drop_attributes_)); }
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker.cc b/third_party/blink/renderer/modules/service_worker/service_worker.cc index 39d69e2..c5e8418 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker.cc
@@ -98,11 +98,8 @@ if (exception_state.HadException()) return; - if (msg.message->IsLockedToAgentCluster()) { - msg.locked_agent_cluster_id = GetExecutionContext()->GetAgentClusterID(); - } else { - msg.locked_agent_cluster_id = absl::nullopt; - } + msg.sender_agent_cluster_id = GetExecutionContext()->GetAgentClusterID(); + msg.locked_to_sender_agent_cluster = msg.message->IsLockedToAgentCluster(); // Defer postMessage() from a prerendered page until page activation. // https://wicg.github.io/nav-speculation/prerendering.html#patch-service-workers
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_client.cc b/third_party/blink/renderer/modules/service_worker/service_worker_client.cc index 44618033..47d5a542 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_client.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_client.cc
@@ -112,11 +112,8 @@ if (exception_state.HadException()) return; - if (msg.message->IsLockedToAgentCluster()) { - msg.locked_agent_cluster_id = context->GetAgentClusterID(); - } else { - msg.locked_agent_cluster_id = absl::nullopt; - } + msg.sender_agent_cluster_id = context->GetAgentClusterID(); + msg.locked_to_sender_agent_cluster = msg.message->IsLockedToAgentCluster(); To<ServiceWorkerGlobalScope>(context) ->GetServiceWorkerHost()
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_container.cc b/third_party/blink/renderer/modules/service_worker/service_worker_container.cc index 98e8f7d..d0aa0c5 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_container.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_container.cc
@@ -673,9 +673,9 @@ } } if (!event) { - if (!msg.locked_agent_cluster_id || + if (!msg.locked_to_sender_agent_cluster || GetExecutionContext()->IsSameAgentCluster( - *msg.locked_agent_cluster_id)) { + msg.sender_agent_cluster_id)) { event = MessageEvent::Create( ports, std::move(msg.message), GetExecutionContext()->GetSecurityOrigin()->ToString(),
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc index 80607e3..bf21e39 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -1401,9 +1401,9 @@ } } if (!event_to_dispatch) { - if (!msg.locked_agent_cluster_id || + if (!msg.locked_to_sender_agent_cluster || GetExecutionContext()->IsSameAgentCluster( - *msg.locked_agent_cluster_id)) { + msg.sender_agent_cluster_id)) { observer = MakeGarbageCollected<WaitUntilObserver>( this, WaitUntilObserver::kMessage, event_id); event_to_dispatch = ExtendableMessageEvent::Create( @@ -1437,9 +1437,10 @@ } } if (!event_to_dispatch) { - if (!msg.locked_agent_cluster_id || + DCHECK(!msg.locked_to_sender_agent_cluster || msg.sender_agent_cluster_id); + if (!msg.locked_to_sender_agent_cluster || GetExecutionContext()->IsSameAgentCluster( - *msg.locked_agent_cluster_id)) { + msg.sender_agent_cluster_id)) { observer = MakeGarbageCollected<WaitUntilObserver>( this, WaitUntilObserver::kMessage, event_id); event_to_dispatch = ExtendableMessageEvent::Create(
diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis.cc b/third_party/blink/renderer/modules/speech/speech_synthesis.cc index 9e7e4bb8..21a17923 100644 --- a/third_party/blink/renderer/modules/speech/speech_synthesis.cc +++ b/third_party/blink/renderer/modules/speech/speech_synthesis.cc
@@ -298,7 +298,7 @@ } // Start the next utterance if we just finished one and one was pending. - if (should_start_speaking && !utterance_queue_.IsEmpty()) + if (should_start_speaking && !utterance_queue_.empty()) StartSpeakingImmediately(); } @@ -337,7 +337,7 @@ } SpeechSynthesisUtterance* SpeechSynthesis::CurrentSpeechUtterance() const { - if (utterance_queue_.IsEmpty()) + if (utterance_queue_.empty()) return nullptr; return utterance_queue_.front();
diff --git a/third_party/blink/renderer/modules/speech/testing/mojom_speech_synthesis_mock.cc b/third_party/blink/renderer/modules/speech/testing/mojom_speech_synthesis_mock.cc index be834a0c..869e5fc7 100644 --- a/third_party/blink/renderer/modules/speech/testing/mojom_speech_synthesis_mock.cc +++ b/third_party/blink/renderer/modules/speech/testing/mojom_speech_synthesis_mock.cc
@@ -75,7 +75,7 @@ current_utterance_.reset(); current_client_.reset(); - if (queued_requests_.IsEmpty()) + if (queued_requests_.empty()) return; SpeechRequest next_request = queued_requests_.TakeFirst();
diff --git a/third_party/blink/renderer/modules/storage/cached_storage_area.cc b/third_party/blink/renderer/modules/storage/cached_storage_area.cc index 747421a0..6804df89 100644 --- a/third_party/blink/renderer/modules/storage/cached_storage_area.cc +++ b/third_party/blink/renderer/modules/storage/cached_storage_area.cc
@@ -156,8 +156,8 @@ // backend from the exact point at which the impending |DeleteAll()| // operation takes place. The first event observed after this will always // be a corresponding |AllDeleted()| from |source|. - DCHECK(pending_mutations_by_source_.IsEmpty()); - DCHECK(pending_mutations_by_key_.IsEmpty()); + DCHECK(pending_mutations_by_source_.empty()); + DCHECK(pending_mutations_by_key_.empty()); receiver_.reset(); new_observer = receiver_.BindNewPipeAndPassRemote(); } @@ -537,7 +537,7 @@ return nullptr; OwnedPendingMutationQueue& mutations_for_source = source_queue_iter->value; - DCHECK(!mutations_for_source.IsEmpty()); + DCHECK(!mutations_for_source.empty()); std::unique_ptr<PendingMutation> mutation = std::move(mutations_for_source.front()); mutations_for_source.pop_front();
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc index 0adcf68..a07bfa7a 100644 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc +++ b/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc
@@ -67,14 +67,14 @@ // 3.1. Ask the underlying operating system to release the wake lock of type // type and let success be true if the operation succeeded, or else // false. - if (wake_lock_sentinels_.IsEmpty() && wake_lock_.is_bound()) { + if (wake_lock_sentinels_.empty() && wake_lock_.is_bound()) { wake_lock_->CancelWakeLock(); wake_lock_.reset(); } } void WakeLockManager::ClearWakeLocks() { - while (!wake_lock_sentinels_.IsEmpty()) + while (!wake_lock_sentinels_.empty()) (*wake_lock_sentinels_.begin())->DoRelease(); }
diff --git a/third_party/blink/renderer/modules/webaudio/audio_node_output.cc b/third_party/blink/renderer/modules/webaudio/audio_node_output.cc index b44a648..2734d13 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_node_output.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_node_output.cc
@@ -51,8 +51,8 @@ GetDeferredTaskHandler().RemoveMarkedAudioNodeOutput(this); DisconnectAll(); - DCHECK(inputs_.IsEmpty()); - DCHECK(params_.IsEmpty()); + DCHECK(inputs_.empty()); + DCHECK(params_.empty()); } void AudioNodeOutput::SetNumberOfChannels(unsigned number_of_channels) { @@ -163,7 +163,7 @@ for (AudioNodeInput* input : inputs) { AudioNodeWiring::Disconnect(*this, *input); } - DCHECK(inputs_.IsEmpty()); + DCHECK(inputs_.empty()); } void AudioNodeOutput::DisconnectAllParams() { @@ -175,7 +175,7 @@ for (AudioParamHandler* param : params) { AudioNodeWiring::Disconnect(*this, *param); } - DCHECK(params_.IsEmpty()); + DCHECK(params_.empty()); } void AudioNodeOutput::DisconnectAll() {
diff --git a/third_party/blink/renderer/modules/webaudio/setsinkid_resolver.cc b/third_party/blink/renderer/modules/webaudio/setsinkid_resolver.cc index 843600f..29ead04 100644 --- a/third_party/blink/renderer/modules/webaudio/setsinkid_resolver.cc +++ b/third_party/blink/renderer/modules/webaudio/setsinkid_resolver.cc
@@ -93,7 +93,7 @@ resolvers.pop_front(); - if (!resolvers.IsEmpty()) { + if (!resolvers.empty()) { resolvers.front()->Start(); } }
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc index 5bfe5fb..a0d6973 100644 --- a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc +++ b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc
@@ -253,7 +253,7 @@ DVLOG(3) << __func__; DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!IsClosed()); - while (!pending_request_ && !requests_.IsEmpty()) { + while (!pending_request_ && !requests_.empty()) { Request* request = requests_.front(); // Skip processing for requests that are canceled by a recent reset(). @@ -835,7 +835,7 @@ template <typename Traits> bool DecoderTemplate<Traits>::HasPendingActivity() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return pending_request_ || !requests_.IsEmpty(); + return pending_request_ || !requests_.empty(); } template <typename Traits>
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame.cc b/third_party/blink/renderer/modules/webcodecs/video_frame.cc index dccdae9..928689ae 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
@@ -229,7 +229,7 @@ CanvasResourceProviderCache(const CanvasResourceProviderCache&) = delete; CanvasResourceProvider* CreateProvider(const SkImageInfo& info) { - if (info_to_provider_.IsEmpty()) + if (info_to_provider_.empty()) PostMonitoringTask(); last_access_time_ = base::TimeTicks::Now();
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc index fc0cd4e..3644c0f 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc
@@ -67,7 +67,7 @@ DCHECK_GT(it_frame->value, 0); if (--it_frame->value == 0) { frame_map.erase(it_frame); - if (frame_map.IsEmpty()) + if (frame_map.empty()) map_.erase(it_source); } }
diff --git a/third_party/blink/renderer/modules/webdatabase/database.cc b/third_party/blink/renderer/modules/webdatabase/database.cc index b3e1c48..24b2161d 100644 --- a/third_party/blink/renderer/modules/webdatabase/database.cc +++ b/third_party/blink/renderer/modules/webdatabase/database.cc
@@ -344,7 +344,7 @@ // Transaction phase 1 cleanup. See comment on "What happens if a // transaction is interrupted?" at the top of SQLTransactionBackend.cpp. SQLTransactionBackend* transaction = nullptr; - while (!transaction_queue_.IsEmpty()) { + while (!transaction_queue_.empty()) { transaction = transaction_queue_.TakeFirst(); transaction->NotifyDatabaseThreadIsShuttingDown(); } @@ -388,7 +388,7 @@ void Database::ScheduleTransaction() { SQLTransactionBackend* transaction = nullptr; - if (is_transaction_queue_enabled_ && !transaction_queue_.IsEmpty()) + if (is_transaction_queue_enabled_ && !transaction_queue_.empty()) transaction = transaction_queue_.TakeFirst(); if (transaction && GetDatabaseContext()->DatabaseThreadAvailable()) {
diff --git a/third_party/blink/renderer/modules/webdatabase/database_thread.cc b/third_party/blink/renderer/modules/webdatabase/database_thread.cc index f2f718d3..a6bafa0 100644 --- a/third_party/blink/renderer/modules/webdatabase/database_thread.cc +++ b/third_party/blink/renderer/modules/webdatabase/database_thread.cc
@@ -50,7 +50,7 @@ } DatabaseThread::~DatabaseThread() { - DCHECK(open_database_set_.IsEmpty()); + DCHECK(open_database_set_.empty()); DCHECK(!thread_); }
diff --git a/third_party/blink/renderer/modules/webdatabase/database_tracker.cc b/third_party/blink/renderer/modules/webdatabase/database_tracker.cc index eb76509..715377cb 100644 --- a/third_party/blink/renderer/modules/webdatabase/database_tracker.cc +++ b/third_party/blink/renderer/modules/webdatabase/database_tracker.cc
@@ -138,10 +138,10 @@ return; database_set->erase(found); - if (database_set->IsEmpty()) { + if (database_set->empty()) { name_map->erase(name); delete database_set; - if (name_map->IsEmpty()) { + if (name_map->empty()) { open_database_map_->erase(origin_string); delete name_map; }
diff --git a/third_party/blink/renderer/modules/webdatabase/sql_transaction_backend.cc b/third_party/blink/renderer/modules/webdatabase/sql_transaction_backend.cc index 15b3b4a..3ab8bed 100644 --- a/third_party/blink/renderer/modules/webdatabase/sql_transaction_backend.cc +++ b/third_party/blink/renderer/modules/webdatabase/sql_transaction_backend.cc
@@ -714,7 +714,7 @@ current_statement_backend_ = nullptr; base::AutoLock locker(statement_lock_); - if (!statement_queue_.IsEmpty()) + if (!statement_queue_.empty()) current_statement_backend_ = statement_queue_.TakeFirst(); }
diff --git a/third_party/blink/renderer/modules/webdatabase/sql_transaction_coordinator.cc b/third_party/blink/renderer/modules/webdatabase/sql_transaction_coordinator.cc index b35743c..7e7ac3d 100644 --- a/third_party/blink/renderer/modules/webdatabase/sql_transaction_coordinator.cc +++ b/third_party/blink/renderer/modules/webdatabase/sql_transaction_coordinator.cc
@@ -49,7 +49,7 @@ void SQLTransactionCoordinator::ProcessPendingTransactions( CoordinationInfo& info) { - if (info.active_write_transaction || info.pending_transactions.IsEmpty()) + if (info.active_write_transaction || info.pending_transactions.empty()) return; SQLTransactionBackend* first_pending_transaction = @@ -59,9 +59,9 @@ first_pending_transaction = info.pending_transactions.TakeFirst(); info.active_read_transactions.insert(first_pending_transaction); first_pending_transaction->LockAcquired(); - } while (!info.pending_transactions.IsEmpty() && + } while (!info.pending_transactions.empty() && info.pending_transactions.front()->IsReadOnly()); - } else if (info.active_read_transactions.IsEmpty()) { + } else if (info.active_read_transactions.empty()) { info.pending_transactions.pop_front(); info.active_write_transaction = first_pending_transaction; first_pending_transaction->LockAcquired(); @@ -138,7 +138,7 @@ // Clean up transactions that have NOT reached "lockAcquired": // Transaction phase 3 cleanup. See comment on "What happens if a // transaction is interrupted?" at the top of SQLTransactionBackend.cpp. - while (!info.pending_transactions.IsEmpty()) { + while (!info.pending_transactions.empty()) { SQLTransactionBackend* transaction = info.pending_transactions.TakeFirst(); transaction->NotifyDatabaseThreadIsShuttingDown();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_context_group.cc b/third_party/blink/renderer/modules/webgl/webgl_context_group.cc index 079d4723..a054373 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_context_group.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_context_group.cc
@@ -30,7 +30,7 @@ WebGLContextGroup::WebGLContextGroup() : number_of_context_losses_(0) {} gpu::gles2::GLES2Interface* WebGLContextGroup::GetAGLInterface() { - DCHECK(!contexts_.IsEmpty()); + DCHECK(!contexts_.empty()); return (*contexts_.begin())->ContextGL(); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index f905d53..509fdba 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -270,7 +270,7 @@ } WebGLRenderingContextBase* WebGLRenderingContextBase::OldestContext() { - if (ActiveContexts().IsEmpty()) + if (ActiveContexts().empty()) return nullptr; WebGLRenderingContextBase* candidate = *(ActiveContexts().begin()); @@ -287,7 +287,7 @@ } WebGLRenderingContextBase* WebGLRenderingContextBase::OldestEvictedContext() { - if (ForciblyEvictedContexts().IsEmpty()) + if (ForciblyEvictedContexts().empty()) return nullptr; WebGLRenderingContextBase* candidate = nullptr;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc b/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc index a57afad..72c4df8 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc
@@ -29,7 +29,7 @@ GPUSupportedFeatures* MakeFeatureNameSet(const DawnProcTable& procs, WGPUAdapter adapter) { GPUSupportedFeatures* features = MakeGarbageCollected<GPUSupportedFeatures>(); - DCHECK(features->FeatureNameSet().IsEmpty()); + DCHECK(features->FeatureNameSet().empty()); size_t feature_count = procs.adapterEnumerateFeatures(adapter, nullptr); DCHECK(feature_count <= std::numeric_limits<wtf_size_t>::max());
diff --git a/third_party/blink/renderer/modules/webshare/navigator_share.cc b/third_party/blink/renderer/modules/webshare/navigator_share.cc index 5a92fc4..a8b2a81 100644 --- a/third_party/blink/renderer/modules/webshare/navigator_share.cc +++ b/third_party/blink/renderer/modules/webshare/navigator_share.cc
@@ -234,7 +234,7 @@ // the platform-specific bug, it is explicitly skipping section §2.1.2 step 2 of // the Web Share spec. https://www.w3.org/TR/web-share/#share-method #if !BUILDFLAG(IS_ANDROID) - if (!clients_.IsEmpty()) { + if (!clients_.empty()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, "A earlier share had not yet completed."); return ScriptPromise();
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket.cc b/third_party/blink/renderer/modules/websockets/dom_websocket.cc index e10bb80..63533e2d 100644 --- a/third_party/blink/renderer/modules/websockets/dom_websocket.cc +++ b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
@@ -81,7 +81,7 @@ void DOMWebSocket::EventQueue::Dispatch(Event* event) { switch (state_) { case kActive: - DCHECK(events_.IsEmpty()); + DCHECK(events_.empty()); target_->DispatchEvent(*event); break; case kPaused: @@ -89,14 +89,14 @@ events_.push_back(event); break; case kStopped: - DCHECK(events_.IsEmpty()); + DCHECK(events_.empty()); // Do nothing. break; } } bool DOMWebSocket::EventQueue::IsEmpty() const { - return events_.IsEmpty(); + return events_.empty(); } void DOMWebSocket::EventQueue::Pause() { @@ -135,7 +135,7 @@ HeapDeque<Member<Event>> events; events.Swap(events_); - while (!events.IsEmpty()) { + while (!events.empty()) { if (state_ == kStopped || state_ == kPaused || state_ == kUnpausePosted) break; DCHECK_EQ(state_, kActive); @@ -143,7 +143,7 @@ // |this| can be stopped here. } if (state_ == kPaused || state_ == kUnpausePosted) { - while (!events_.IsEmpty()) + while (!events_.empty()) events.push_back(events_.TakeFirst()); events.Swap(events_); }
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc index f649673..5545334 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
@@ -801,7 +801,7 @@ // TODO(yhirano): This should be DCHECK_EQ(GetState(), State::kOpen). DCHECK(GetState() == State::kOpen || GetState() == State::kConnecting); DCHECK(!execution_context_->IsContextDestroyed()); - while (!messages_.IsEmpty() && !blob_loader_ && !wait_for_writable_) { + while (!messages_.empty() && !blob_loader_ && !wait_for_writable_) { Message& message = messages_.front(); network::mojom::blink::WebSocketMessageType message_type = network::mojom::blink::WebSocketMessageType::BINARY;
diff --git a/third_party/blink/renderer/modules/webusb/usb.cc b/third_party/blink/renderer/modules/webusb/usb.cc index 075a165..6dc0bb6 100644 --- a/third_party/blink/renderer/modules/webusb/usb.cc +++ b/third_party/blink/renderer/modules/webusb/usb.cc
@@ -112,8 +112,8 @@ USB::~USB() { // |service_| may still be valid but there should be no more outstanding // requests to them because each holds a persistent handle to this object. - DCHECK(get_devices_requests_.IsEmpty()); - DCHECK(get_permission_requests_.IsEmpty()); + DCHECK(get_devices_requests_.empty()); + DCHECK(get_permission_requests_.empty()); } ScriptPromise USB::getDevices(ScriptState* script_state,
diff --git a/third_party/blink/renderer/modules/webusb/usb_device.cc b/third_party/blink/renderer/modules/webusb/usb_device.cc index 3e886c3..f5a204e 100644 --- a/third_party/blink/renderer/modules/webusb/usb_device.cc +++ b/third_party/blink/renderer/modules/webusb/usb_device.cc
@@ -138,7 +138,7 @@ USBDevice::~USBDevice() { // |m_device| may still be valid but there should be no more outstanding // requests because each holds a persistent handle to this object. - DCHECK(device_requests_.IsEmpty()); + DCHECK(device_requests_.empty()); } bool USBDevice::IsInterfaceClaimed(wtf_size_t configuration_index,
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc index 9919e78..e7167b9 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc +++ b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
@@ -57,8 +57,8 @@ // of ids for iteration purposes. current_callback_ids is the set of ids for // callbacks we will call, and is kept in sync with current_callbacks_ but // safe to iterate over. - DCHECK(current_callback_frame_requests_.IsEmpty()); - DCHECK(current_callback_async_tasks_.IsEmpty()); + DCHECK(current_callback_frame_requests_.empty()); + DCHECK(current_callback_async_tasks_.empty()); current_callback_frame_requests_.swap(callback_frame_requests_); current_callback_async_tasks_.swap(callback_async_tasks_);
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc index aab146c..655aa52b 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.cc +++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -189,7 +189,7 @@ } DVLOG(2) << __func__ << ": result_set.size()=" << result_set.size(); - DCHECK(!result_set.IsEmpty()); + DCHECK(!result_set.empty()); Vector<device::mojom::blink::EntityTypeForHitTest> result; CopyToVector(result_set, result); @@ -1111,7 +1111,7 @@ anchor_ids_to_anchors_.swap(updated_anchors); - DCHECK(anchor_ids_to_pending_anchor_promises_.IsEmpty()) + DCHECK(anchor_ids_to_pending_anchor_promises_.empty()) << "All anchors should be updated in the frame in which they were " "created, got " << anchor_ids_to_pending_anchor_promises_.size()
diff --git a/third_party/blink/renderer/modules/xr/xr_system.cc b/third_party/blink/renderer/modules/xr/xr_system.cc index 96c41a7..609400fb 100644 --- a/third_party/blink/renderer/modules/xr/xr_system.cc +++ b/third_party/blink/renderer/modules/xr/xr_system.cc
@@ -1753,7 +1753,7 @@ for (const auto& query : support_queries) { OnSupportsSessionReturned(query, false); } - DCHECK(outstanding_support_queries_.IsEmpty()); + DCHECK(outstanding_support_queries_.empty()); HeapHashSet<Member<PendingRequestSessionQuery>> request_queries = outstanding_request_queries_; @@ -1762,7 +1762,7 @@ query, device::mojom::blink::RequestSessionResult::NewFailureReason( device::mojom::RequestSessionError::INVALID_CLIENT)); } - DCHECK(outstanding_support_queries_.IsEmpty()); + DCHECK(outstanding_support_queries_.empty()); } void XRSystem::OnEnvironmentProviderDisconnect() {
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc b/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc index a9fd6d2f..b7ba5a76 100644 --- a/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc +++ b/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc
@@ -375,9 +375,8 @@ // we need to age and park strings after the renderer becomes idle, meaning // that this has to run when the idle tasks are not. As a consequence, it // is important to make sure that this will not reschedule tasks forever. - bool reschedule = - (!unparked_strings_.IsEmpty() || !parked_strings_.IsEmpty()) && - can_make_progress; + bool reschedule = (!unparked_strings_.empty() || !parked_strings_.empty()) && + can_make_progress; if (reschedule) ScheduleAgingTaskIfNeeded(); }
diff --git a/third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.cc b/third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.cc index 9292dad..190d537 100644 --- a/third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.cc +++ b/third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.cc
@@ -128,7 +128,7 @@ V8DOMActivityLogger* V8DOMActivityLogger::CurrentActivityLoggerIfIsolatedWorldForMainThread() { DCHECK(IsMainThread()); - if (DomActivityLoggersForIsolatedWorld().IsEmpty()) + if (DomActivityLoggersForIsolatedWorld().empty()) return nullptr; return CurrentActivityLoggerIfIsolatedWorld( V8PerIsolateData::MainThreadIsolate());
diff --git a/third_party/blink/renderer/platform/bindings/v8_global_value_map.h b/third_party/blink/renderer/platform/bindings/v8_global_value_map.h index ba0aa04..72dfe03 100644 --- a/third_party/blink/renderer/platform/bindings/v8_global_value_map.h +++ b/third_party/blink/renderer/platform/bindings/v8_global_value_map.h
@@ -32,7 +32,7 @@ typedef HashMap<KeyType, v8::PersistentContainerValue> Impl; typedef typename Impl::iterator Iterator; static size_t Size(const Impl* impl) { return impl->size(); } - static bool Empty(Impl* impl) { return impl->IsEmpty(); } + static bool Empty(Impl* impl) { return impl->empty(); } static void Swap(Impl& impl, Impl& other) { impl.swap(other); } static Iterator Begin(Impl* impl) { return impl->begin(); } static Iterator End(Impl* impl) { return impl->end(); }
diff --git a/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc b/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc index 41926ea5..bf4cb01 100644 --- a/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc +++ b/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc
@@ -154,7 +154,7 @@ base::ReadOnlySharedMemoryRegion shared_memory_region) { font_table_matcher_ = std::make_unique<FontTableMatcher>(shared_memory_region.Map()); - while (!pending_callbacks_.IsEmpty()) { + while (!pending_callbacks_.empty()) { NotifyFontUniqueNameLookupReady callback = pending_callbacks_.TakeFirst(); std::move(callback).Run(); }
diff --git a/third_party/blink/renderer/platform/fonts/font_platform_data_cache.cc b/third_party/blink/renderer/platform/fonts/font_platform_data_cache.cc index 89915ee1..c946499 100644 --- a/third_party/blink/renderer/platform/fonts/font_platform_data_cache.cc +++ b/third_party/blink/renderer/platform/fonts/font_platform_data_cache.cc
@@ -190,8 +190,8 @@ // Take a different size instance of the same font before adding an entry to // `size_to_data_map`. FontPlatformData* const another_size = - size_to_data_map_.IsEmpty() ? nullptr - : size_to_data_map_.begin()->value.get(); + size_to_data_map_.empty() ? nullptr + : size_to_data_map_.begin()->value.get(); const auto add_result = size_to_data_map_.insert(rounded_size, nullptr); std::unique_ptr<FontPlatformData>* found = &add_result.stored_value->value; if (!add_result.is_new_entry) @@ -218,7 +218,7 @@ sizes_to_remove.push_back(entry.key); } size_to_data_map_.RemoveAll(sizes_to_remove); - return size_to_data_map_.IsEmpty(); + return size_to_data_map_.empty(); } void FontPlatformDataCache::SizedFontPlatformDataSet::Set(
diff --git a/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.h b/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.h index d569e5f..26272f7 100644 --- a/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.h +++ b/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.h
@@ -66,7 +66,7 @@ explicit OpenTypeVerticalData(sk_sp<SkTypeface>); void LoadMetrics(sk_sp<SkTypeface>); - bool HasVORG() const { return !vert_origin_y_.IsEmpty(); } + bool HasVORG() const { return !vert_origin_y_.empty(); } HashMap<Glyph, Glyph> vertical_glyph_map_; Vector<uint16_t> advance_widths_;
diff --git a/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc b/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc index ee4ad76..3024665 100644 --- a/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc +++ b/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc
@@ -170,7 +170,7 @@ DCHECK(lookup_mode_ == blink::mojom::UniqueFontLookupMode::kRetrieveTable); font_table_matcher_ = std::make_unique<FontTableMatcher>(shared_memory_region.Map()); - while (!pending_callbacks_.IsEmpty()) { + while (!pending_callbacks_.empty()) { NotifyFontUniqueNameLookupReady callback = pending_callbacks_.TakeFirst(); std::move(callback).Run(); }
diff --git a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc index fd7a8f3..c4ef449 100644 --- a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc +++ b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc
@@ -117,16 +117,16 @@ void AnimationWorkletMutatorDispatcherImpl::MutateSynchronously( std::unique_ptr<AnimationWorkletDispatcherInput> mutator_input) { TRACE_EVENT0("cc", "AnimationWorkletMutatorDispatcherImpl::mutate"); - if (mutator_map_.IsEmpty() || !mutator_input) + if (mutator_map_.empty() || !mutator_input) return; base::ElapsedTimer timer; DCHECK(client_); DCHECK(host_queue_->BelongsToCurrentThread()); - DCHECK(mutator_input_map_.IsEmpty()); + DCHECK(mutator_input_map_.empty()); DCHECK(outputs_->get().empty()); mutator_input_map_ = CreateInputMap(*mutator_input); - if (mutator_input_map_.IsEmpty()) + if (mutator_input_map_.empty()) return; base::WaitableEvent event; @@ -153,11 +153,11 @@ AsyncMutationCompleteCallback done_callback) { DCHECK(client_); DCHECK(host_queue_->BelongsToCurrentThread()); - if (mutator_map_.IsEmpty() || !mutator_input) + if (mutator_map_.empty() || !mutator_input) return false; base::TimeTicks request_time = NowTicks(); - if (!mutator_input_map_.IsEmpty()) { + if (!mutator_input_map_.empty()) { // Still running mutations from a previous frame. switch (queuing_strategy) { case MutateQueuingStrategy::kDrop: @@ -185,7 +185,7 @@ } mutator_input_map_ = CreateInputMap(*mutator_input); - if (mutator_input_map_.IsEmpty()) + if (mutator_input_map_.empty()) return false; MutateAsynchronouslyInternal(request_time, std::move(done_callback)); @@ -283,7 +283,7 @@ } bool AnimationWorkletMutatorDispatcherImpl::HasMutators() { - return !mutator_map_.IsEmpty(); + return !mutator_map_.empty(); } AnimationWorkletMutatorDispatcherImpl::InputMap
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index bfe3584..7af59f2a 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -465,7 +465,7 @@ } if (raster_interface) { - while (!pending_raster_timers_.IsEmpty()) { + while (!pending_raster_timers_.empty()) { RasterTimer rt = pending_raster_timers_.TakeFirst(); raster_interface->DeleteQueriesEXT(1, &rt.gl_query_id); } @@ -483,7 +483,7 @@ } // Finish up any pending queries that are complete - while (!pending_raster_timers_.IsEmpty()) { + while (!pending_raster_timers_.empty()) { auto it = pending_raster_timers_.begin(); GLuint complete = 1; raster_interface->GetQueryObjectuivEXT(
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index ba12cf6c..f1469a1 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -722,7 +722,7 @@ scoped_refptr<DrawingBuffer::ColorBuffer> DrawingBuffer::CreateOrRecycleColorBuffer() { DCHECK(state_restorer_); - if (!recycled_color_buffer_queue_.IsEmpty()) { + if (!recycled_color_buffer_queue_.empty()) { scoped_refptr<ColorBuffer> recycled = recycled_color_buffer_queue_.TakeLast(); if (recycled->receive_sync_token.HasData())
diff --git a/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc index f0211c4..4f093862 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc
@@ -480,7 +480,7 @@ scoped_refptr<XRWebGLDrawingBuffer::ColorBuffer> XRWebGLDrawingBuffer::CreateOrRecycleColorBuffer() { - if (!recycled_color_buffer_queue_.IsEmpty()) { + if (!recycled_color_buffer_queue_.empty()) { scoped_refptr<ColorBuffer> recycled = recycled_color_buffer_queue_.TakeLast(); if (recycled->receive_sync_token.HasData()) {
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc b/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc index f04269a..a2b521d 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc
@@ -737,7 +737,7 @@ memory_usage += current_subsequences_.map.Capacity() * sizeof(decltype(current_subsequences_.map)::value_type); memory_usage += current_subsequences_.tree.CapacityInBytes(); - DCHECK(new_subsequences_.map.IsEmpty()); + DCHECK(new_subsequences_.map.empty()); memory_usage += new_subsequences_.map.Capacity() * sizeof(decltype(new_subsequences_.map)::value_type); memory_usage += new_subsequences_.tree.CapacityInBytes();
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h index 90ec303..6e1396b1 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h
@@ -298,7 +298,7 @@ } String NodesAsTreeString() { - if (nodes_.IsEmpty()) + if (nodes_.empty()) return ""; StringBuilder string_builder; BuildTreeString(string_builder, RootNode(), 0);
diff --git a/third_party/blink/renderer/platform/heap/test/heap_test.cc b/third_party/blink/renderer/platform/heap/test/heap_test.cc index 5bd15a80..6f5c729 100644 --- a/third_party/blink/renderer/platform/heap/test/heap_test.cc +++ b/third_party/blink/renderer/platform/heap/test/heap_test.cc
@@ -546,7 +546,7 @@ } TestSupportingGC::PreciselyCollectGarbage(); - EXPECT_TRUE(weak_map->IsEmpty()); + EXPECT_TRUE(weak_map->empty()); } test::YieldCurrentThread(); }
diff --git a/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc b/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc index e646efa..a3f1bf2a 100644 --- a/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc +++ b/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc
@@ -1435,7 +1435,7 @@ // Destroy the link between original HeapLinkedHashSet object and its backing // store. wrapper->Swap(); - DCHECK(wrapper->hash_set_.IsEmpty()); + DCHECK(wrapper->hash_set_.empty()); PreciselyCollectGarbage();
diff --git a/third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.cc b/third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.cc index 1ba71ff..2b6bfcb 100644 --- a/third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.cc +++ b/third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.cc
@@ -109,7 +109,7 @@ // 2) Move and transfer the ownership of the WebMemoryAllocatorDump wrappers. const size_t expected_final_size = memory_allocator_dumps_.size() + other->memory_allocator_dumps_.size(); - while (!other->memory_allocator_dumps_.IsEmpty()) { + while (!other->memory_allocator_dumps_.empty()) { auto first_entry = other->memory_allocator_dumps_.begin(); base::trace_event::MemoryAllocatorDump* memory_allocator_dump = first_entry->key; @@ -118,7 +118,7 @@ other->memory_allocator_dumps_.Take(memory_allocator_dump)); } DCHECK_EQ(expected_final_size, memory_allocator_dumps_.size()); - DCHECK(other->memory_allocator_dumps_.IsEmpty()); + DCHECK(other->memory_allocator_dumps_.empty()); } void WebProcessMemoryDump::AddOwnershipEdge(
diff --git a/third_party/blink/renderer/platform/loader/fetch/buffering_bytes_consumer.cc b/third_party/blink/renderer/platform/loader/fetch/buffering_bytes_consumer.cc index 0d7f186e..148882f 100644 --- a/third_party/blink/renderer/platform/loader/fetch/buffering_bytes_consumer.cc +++ b/third_party/blink/renderer/platform/loader/fetch/buffering_bytes_consumer.cc
@@ -70,7 +70,7 @@ // drain the underlying |bytes_consumer_| anyway. MaybeStartBuffering(); - if (buffer_.IsEmpty()) { + if (buffer_.empty()) { if (buffering_state_ != BufferingState::kStarted) return bytes_consumer_->BeginRead(buffer, available); @@ -87,7 +87,7 @@ if (has_seen_error_) return Result::kError; - if (buffer_.IsEmpty()) + if (buffer_.empty()) return has_seen_end_of_data_ ? Result::kDone : Result::kShouldWait; } @@ -98,7 +98,7 @@ } BytesConsumer::Result BufferingBytesConsumer::EndRead(size_t read_size) { - if (buffer_.IsEmpty()) { + if (buffer_.empty()) { if (buffering_state_ != BufferingState::kStarted) return bytes_consumer_->EndRead(read_size); @@ -118,7 +118,7 @@ buffer_.pop_front(); } - if (buffer_.IsEmpty() && has_seen_end_of_data_) { + if (buffer_.empty() && has_seen_end_of_data_) { ClearClient(); return Result::kDone; } @@ -157,7 +157,7 @@ } BytesConsumer::PublicState BufferingBytesConsumer::GetPublicState() const { - if (buffer_.IsEmpty()) + if (buffer_.empty()) return bytes_consumer_->GetPublicState(); return PublicState::kReadableOrWaiting; }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.cc b/third_party/blink/renderer/platform/loader/fetch/resource.cc index 7e7619f..d5aa717 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource.cc
@@ -203,7 +203,7 @@ } // No integrity attributes to check? Then we're passing. - if (IntegrityMetadata().IsEmpty()) { + if (IntegrityMetadata().empty()) { integrity_disposition_ = ResourceIntegrityDisposition::kPassed; return; } @@ -283,7 +283,7 @@ void Resource::TriggerNotificationForFinishObservers( base::SingleThreadTaskRunner* task_runner) { - if (finish_observers_.IsEmpty()) + if (finish_observers_.empty()) return; auto* new_collections = @@ -382,7 +382,7 @@ bool Resource::MustRefetchDueToIntegrityMetadata( const FetchParameters& params) const { - if (params.IntegrityMetadata().IsEmpty()) + if (params.IntegrityMetadata().empty()) return false; return !IntegrityMetadata::SetsEqual(IntegrityMetadata(), @@ -537,11 +537,11 @@ if (HasClientsOrObservers()) { builder.Append("hasClients("); builder.AppendNumber(clients_.size()); - if (!clients_awaiting_callback_.IsEmpty()) { + if (!clients_awaiting_callback_.empty()) { builder.Append(", AwaitingCallback="); builder.AppendNumber(clients_awaiting_callback_.size()); } - if (!finished_clients_.IsEmpty()) { + if (!finished_clients_.empty()) { builder.Append(", Finished="); builder.AppendNumber(finished_clients_.size()); } @@ -627,7 +627,7 @@ else clients_.erase(client); - if (clients_awaiting_callback_.IsEmpty() && + if (clients_awaiting_callback_.empty() && async_finish_pending_clients_task_.IsActive()) { async_finish_pending_clients_task_.Cancel(); } @@ -724,11 +724,11 @@ // It is still possible for the above loop to finish a new client // synchronously. If there's no client waiting we should deschedule. bool scheduled = async_finish_pending_clients_task_.IsActive(); - if (scheduled && clients_awaiting_callback_.IsEmpty()) + if (scheduled && clients_awaiting_callback_.empty()) async_finish_pending_clients_task_.Cancel(); // Prevent the case when there are clients waiting but no callback scheduled. - DCHECK(clients_awaiting_callback_.IsEmpty() || scheduled); + DCHECK(clients_awaiting_callback_.empty() || scheduled); } Resource::MatchStatus Resource::CanReuse(const FetchParameters& params) const {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.h b/third_party/blink/renderer/platform/loader/fetch/resource.h index c66b5ff..a6112a3 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource.h
@@ -444,8 +444,8 @@ void MarkClientFinished(ResourceClient*); virtual bool HasClientsOrObservers() const { - return !clients_.IsEmpty() || !clients_awaiting_callback_.IsEmpty() || - !finished_clients_.IsEmpty() || !finish_observers_.IsEmpty(); + return !clients_.empty() || !clients_awaiting_callback_.empty() || + !finished_clients_.empty() || !finish_observers_.empty(); } virtual void DestroyDecodedDataForFailedRevalidation() {}
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index 10178d8..bad13d1a 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -1821,7 +1821,7 @@ // first choice font failed to load). StopFetching(); - if (!loaders_.IsEmpty() || !non_blocking_loaders_.IsEmpty()) { + if (!loaders_.empty() || !non_blocking_loaders_.empty()) { // There are some keepalive requests. // The use of WrapPersistent creates a reference cycle intentionally, // to keep the ResourceFetcher and ResourceLoaders alive until the requests @@ -1880,7 +1880,7 @@ // If preloads_ is not empty here, it's full of link // preloads, as speculative preloads should have already been cleared when // parsing finished. - if (preloads_.IsEmpty() && early_hints_preloaded_resources_.IsEmpty()) + if (preloads_.empty() && early_hints_preloaded_resources_.empty()) return; unused_preloads_timer_ = PostDelayedCancellableTask( *freezable_task_runner_, FROM_HERE, @@ -2146,7 +2146,7 @@ else NOTREACHED(); - if (loaders_.IsEmpty() && non_blocking_loaders_.IsEmpty()) + if (loaders_.empty() && non_blocking_loaders_.empty()) keepalive_loaders_task_handle_.Cancel(); }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc index db0d376..61ec58c 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -414,7 +414,7 @@ } void ResourceLoadScheduler::ShowConsoleMessageIfNeeded() { - if (is_console_info_shown_ || pending_request_map_.IsEmpty()) + if (is_console_info_shown_ || pending_request_map_.empty()) return; const base::Time limit = clock_->Now() - base::Seconds(60);
diff --git a/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc b/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc index e7634c8..62ac30a 100644 --- a/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc
@@ -298,7 +298,7 @@ public: explicit Buffer(ResponseBodyLoader* owner) : owner_(owner) {} - bool IsEmpty() const { return buffered_data_.IsEmpty(); } + bool IsEmpty() const { return buffered_data_.empty(); } // Add |buffer| to |buffered_data_|. void AddChunk(const char* buffer, size_t available) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/source_keyed_cached_metadata_handler.cc b/third_party/blink/renderer/platform/loader/fetch/source_keyed_cached_metadata_handler.cc index 3bfaf19..4bb439d0 100644 --- a/third_party/blink/renderer/platform/loader/fetch/source_keyed_cached_metadata_handler.cc +++ b/third_party/blink/renderer/platform/loader/fetch/source_keyed_cached_metadata_handler.cc
@@ -119,7 +119,7 @@ void SourceKeyedCachedMetadataHandler::OnMemoryDump( WebProcessMemoryDump* pmd, const String& dump_prefix) const { - if (cached_metadata_map_.IsEmpty()) + if (cached_metadata_map_.empty()) return; const String dump_name = dump_prefix + "/inline"; @@ -243,7 +243,7 @@ if (!sender_) return; - if (cached_metadata_map_.IsEmpty()) { + if (cached_metadata_map_.empty()) { sender_->Send(code_cache_host, nullptr, 0); } else { Vector<uint8_t> serialized_data;
diff --git a/third_party/blink/renderer/platform/loader/subresource_integrity.cc b/third_party/blink/renderer/platform/loader/subresource_integrity.cc index 2df65e9..2f39d2f 100644 --- a/third_party/blink/renderer/platform/loader/subresource_integrity.cc +++ b/third_party/blink/renderer/platform/loader/subresource_integrity.cc
@@ -179,8 +179,8 @@ "of the integrity algorithms."); // metadata_set is non-empty, so we are guaranteed to always have a result. - // This is effectively an implemenation of std::max_element (C++17). - DCHECK(!metadata_set.IsEmpty()); + // This is effectively an implementation of std::max_element (C++17). + DCHECK(!metadata_set.empty()); auto iter = metadata_set.begin(); IntegrityAlgorithm max_algorithm = iter->second; ++iter; @@ -298,7 +298,7 @@ ReportInfo* report_info) { // We expect a "clean" metadata_set, since metadata_set should only be filled // once. - DCHECK(metadata_set.IsEmpty()); + DCHECK(metadata_set.empty()); Vector<UChar> characters; attribute.StripWhiteSpace().AppendTo(characters);
diff --git a/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.cc b/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.cc index 87ee30d..7e71b9d 100644 --- a/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.cc +++ b/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.cc
@@ -20,7 +20,7 @@ size_t* available) { DCHECK(!is_in_two_phase_read_); ++notification_token_; - if (commands_.IsEmpty()) { + if (commands_.empty()) { switch (state_) { case BytesConsumer::InternalState::kReadable: case BytesConsumer::InternalState::kWaiting: @@ -64,7 +64,7 @@ BytesConsumer::Result ReplayingBytesConsumer::EndRead(size_t read) { DCHECK(is_in_two_phase_read_); - DCHECK(!commands_.IsEmpty()); + DCHECK(!commands_.empty()); is_in_two_phase_read_ = false; const Command& command = commands_[0];
diff --git a/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.h b/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.h index 84b19e0..1c74dd3 100644 --- a/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.h +++ b/third_party/blink/renderer/platform/loader/testing/replaying_bytes_consumer.h
@@ -65,7 +65,7 @@ String DebugName() const override { return "ReplayingBytesConsumer"; } bool IsCancelled() const { return is_cancelled_; } - bool IsCommandsEmpty() { return commands_.IsEmpty(); } + bool IsCommandsEmpty() { return commands_.empty(); } void TriggerOnStateChange() { client_->OnStateChange(); } void Trace(Visitor*) const override;
diff --git a/third_party/blink/renderer/platform/network/network_state_notifier.h b/third_party/blink/renderer/platform/network/network_state_notifier.h index 79b97af..7159ec4 100644 --- a/third_party/blink/renderer/platform/network/network_state_notifier.h +++ b/third_party/blink/renderer/platform/network/network_state_notifier.h
@@ -127,8 +127,8 @@ NetworkStateNotifier& operator=(const NetworkStateNotifier&) = delete; ~NetworkStateNotifier() { - DCHECK(connection_observers_.IsEmpty()); - DCHECK(on_line_state_observers_.IsEmpty()); + DCHECK(connection_observers_.empty()); + DCHECK(on_line_state_observers_.empty()); } // Can be called on any thread.
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc index c86972c..f41d872 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -1058,7 +1058,7 @@ absl::optional<std::vector<gfx::Size>> expected_resolutions; if (!failed_timestamp_match_) { // Pop timestamps until we have a match. - while (!pending_frames_.IsEmpty()) { + while (!pending_frames_.empty()) { auto& front_frame = pending_frames_.front(); const bool end_of_picture = !metadata.vp9 || metadata.vp9->end_of_picture; if (front_frame.media_timestamp_ == metadata.timestamp) {
diff --git a/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h b/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h index d5ea50f..0f0c760 100644 --- a/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h +++ b/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h
@@ -121,7 +121,7 @@ size_t PrimarySize() const { return entries_by_primary_.size(); } // The number of elements in the map which have secondary keys. size_t SecondarySize() const { return entries_by_secondary_.size(); } - bool empty() const { return entries_by_primary_.IsEmpty(); } + bool empty() const { return entries_by_primary_.empty(); } private: struct Entry {
diff --git a/third_party/blink/renderer/platform/scheduler/common/event_loop.cc b/third_party/blink/renderer/platform/scheduler/common/event_loop.cc index 77bbf2e3..3592955 100644 --- a/third_party/blink/renderer/platform/scheduler/common/event_loop.cc +++ b/third_party/blink/renderer/platform/scheduler/common/event_loop.cc
@@ -24,7 +24,7 @@ } EventLoop::~EventLoop() { - DCHECK(schedulers_.IsEmpty()); + DCHECK(schedulers_.empty()); } void EventLoop::EnqueueMicrotask(base::OnceClosure task) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index 69831d1..8cfbd8b6 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -2670,7 +2670,7 @@ } bool MainThreadSchedulerImpl::AllPagesFrozen() const { - if (main_thread_only().page_schedulers.IsEmpty()) + if (main_thread_only().page_schedulers.empty()) return false; for (const auto* scheduler : main_thread_only().page_schedulers) { if (!scheduler->IsFrozen())
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc index a1d485d..4e136c9 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
@@ -132,7 +132,7 @@ TRACE_EVENT_OBJECT_DELETED_WITH_ID( TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); - DCHECK(worker_schedulers_.IsEmpty()); + DCHECK(worker_schedulers_.empty()); } scoped_refptr<SingleThreadIdleTaskRunner>
diff --git a/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc b/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc index 4cba1212..ede3d72 100644 --- a/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc +++ b/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc
@@ -119,7 +119,7 @@ void WebURLLoaderMockFactoryImpl::ServeAsynchronousRequests() { // Serving a request might trigger more requests, so we cannot iterate on // pending_loaders_ as it might get modified. - while (!pending_loaders_.IsEmpty()) { + while (!pending_loaders_.empty()) { LoaderToRequestMap::iterator iter = pending_loaders_.begin(); base::WeakPtr<WebURLLoaderMock> loader(iter->key->GetWeakPtr()); std::unique_ptr<network::ResourceRequest> request = std::move(iter->value);
diff --git a/third_party/blink/renderer/platform/text/bidi_resolver_test.cc b/third_party/blink/renderer/platform/text/bidi_resolver_test.cc index 93f5174..c2a4c80 100644 --- a/third_party/blink/renderer/platform/text/bidi_resolver_test.cc +++ b/third_party/blink/renderer/platform/text/bidi_resolver_test.cc
@@ -175,7 +175,7 @@ bidi_test::ParagraphDirection paragraph_direction, const std::string& line, size_t line_number) { - if (!skipped_code_points_.IsEmpty()) { + if (!skipped_code_points_.empty()) { for (size_t i = 0; i < input.size(); i++) { if (skipped_code_points_.Contains(input[i])) { tests_skipped_++;
diff --git a/third_party/blink/renderer/platform/text/segmented_string.h b/third_party/blink/renderer/platform/text/segmented_string.h index 741df3e..b2b95dc2 100644 --- a/third_party/blink/renderer/platform/text/segmented_string.h +++ b/third_party/blink/renderer/platform/text/segmented_string.h
@@ -343,7 +343,7 @@ return result; } - bool IsComposite() const { return !substrings_.IsEmpty(); } + bool IsComposite() const { return !substrings_.empty(); } SegmentedSubstring current_string_; int number_of_characters_consumed_prior_to_current_string_;
diff --git a/third_party/blink/renderer/platform/text/web_entities.cc b/third_party/blink/renderer/platform/text/web_entities.cc index b438f5e35..79920bf 100644 --- a/third_party/blink/renderer/platform/text/web_entities.cc +++ b/third_party/blink/renderer/platform/text/web_entities.cc
@@ -37,7 +37,7 @@ namespace blink { WebEntities::WebEntities(bool xml_entities) { - DCHECK(entities_map_.IsEmpty()); + DCHECK(entities_map_.empty()); entities_map_.Set(0x003c, "lt"); entities_map_.Set(0x003e, "gt"); entities_map_.Set(0x0026, "amp");
diff --git a/third_party/blink/renderer/platform/wtf/deque.h b/third_party/blink/renderer/platform/wtf/deque.h index 85cf4e8..8e6a44d 100644 --- a/third_party/blink/renderer/platform/wtf/deque.h +++ b/third_party/blink/renderer/platform/wtf/deque.h
@@ -80,7 +80,7 @@ wtf_size_t size() const { return start_ <= end_ ? end_ - start_ : end_ + buffer_.capacity() - start_; } - bool IsEmpty() const { return start_ == end_; } + bool empty() const { return start_ == end_; } iterator begin() { return iterator(this, start_); } iterator end() { return iterator(this, end_); } @@ -141,7 +141,6 @@ void push_back(U&&); void pop_back(); void pop_front(); - bool empty() const { return IsEmpty(); } template <typename... Args> void emplace_back(Args&&...); template <typename... Args> @@ -417,7 +416,7 @@ "be finalized."); if ((!INLINE_CAPACITY && !buffer_.Buffer())) return; - if (!IsEmpty() && + if (!empty() && !(Allocator::kIsGarbageCollected && buffer_.HasOutOfLineBuffer())) DestroyAll(); @@ -600,7 +599,7 @@ template <typename T, wtf_size_t inlineCapacity, typename Allocator> inline void Deque<T, inlineCapacity, Allocator>::pop_front() { - DCHECK(!IsEmpty()); + DCHECK(!empty()); TypeOperations::Destruct(&buffer_.Buffer()[start_], &buffer_.Buffer()[start_ + 1]); buffer_.ClearUnusedSlots(&buffer_.Buffer()[start_], @@ -613,7 +612,7 @@ template <typename T, wtf_size_t inlineCapacity, typename Allocator> inline void Deque<T, inlineCapacity, Allocator>::pop_back() { - DCHECK(!IsEmpty()); + DCHECK(!empty()); if (!end_) end_ = buffer_.capacity() - 1; else
diff --git a/third_party/blink/renderer/platform/wtf/deque_test.cc b/third_party/blink/renderer/platform/wtf/deque_test.cc index 17da6eb..817cd5f 100644 --- a/third_party/blink/renderer/platform/wtf/deque_test.cc +++ b/third_party/blink/renderer/platform/wtf/deque_test.cc
@@ -36,7 +36,7 @@ TEST(DequeTest, Basic) { Deque<int> int_deque; - EXPECT_TRUE(int_deque.IsEmpty()); + EXPECT_TRUE(int_deque.empty()); EXPECT_EQ(0ul, int_deque.size()); }
diff --git a/third_party/blink/renderer/platform/wtf/doubly_linked_list.h b/third_party/blink/renderer/platform/wtf/doubly_linked_list.h index 69a08fb..e5c9d03 100644 --- a/third_party/blink/renderer/platform/wtf/doubly_linked_list.h +++ b/third_party/blink/renderer/platform/wtf/doubly_linked_list.h
@@ -82,7 +82,7 @@ DoublyLinkedList(const DoublyLinkedList&) = delete; DoublyLinkedList& operator=(const DoublyLinkedList&) = delete; - bool IsEmpty() const; + bool empty() const; wtf_size_t size() const; // This is O(n). void Clear(); @@ -137,7 +137,7 @@ } template <typename T, typename PointerType> -inline bool DoublyLinkedList<T, PointerType>::IsEmpty() const { +inline bool DoublyLinkedList<T, PointerType>::empty() const { return !head_; }
diff --git a/third_party/blink/renderer/platform/wtf/doubly_linked_list_test.cc b/third_party/blink/renderer/platform/wtf/doubly_linked_list_test.cc index d650168..8dc1c4f 100644 --- a/third_party/blink/renderer/platform/wtf/doubly_linked_list_test.cc +++ b/third_party/blink/renderer/platform/wtf/doubly_linked_list_test.cc
@@ -44,13 +44,13 @@ }; void DoublyLinkedListTest::SetUp() { - EXPECT_TRUE(list_.IsEmpty()); + EXPECT_TRUE(list_.empty()); EXPECT_EQ(0ul, list_.size()); EXPECT_EQ(0ul, test_node_counter); } void DoublyLinkedListTest::TearDown() { - while (!list_.IsEmpty()) + while (!list_.empty()) delete list_.RemoveHead(); EXPECT_EQ(0ul, test_node_counter); } @@ -76,7 +76,7 @@ result.is_new_entry ? current_size + 1 : current_size); EXPECT_EQ(test_node_counter, result.is_new_entry ? current_size + 1 : current_size); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); return result; } @@ -87,7 +87,7 @@ auto* node_heap = list_.RemoveHead(); EXPECT_EQ(0ul, list_.size()); EXPECT_EQ(1ul, test_node_counter); - EXPECT_TRUE(list_.IsEmpty()); + EXPECT_TRUE(list_.empty()); delete node_heap; EXPECT_EQ(0ul, test_node_counter); @@ -95,7 +95,7 @@ list_.InsertAfter(std::make_unique<TestNode>(0), nullptr); EXPECT_EQ(1ul, list_.size()); EXPECT_EQ(1ul, test_node_counter); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); delete list_.RemoveHead(); TestNode node_stack(-1); @@ -103,12 +103,12 @@ EXPECT_EQ(1ul, list_.size()); EXPECT_EQ(1ul, test_node_counter); EXPECT_EQ(list_.Head(), list_.Tail()); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); list_.Remove(&node_stack); EXPECT_EQ(0ul, list_.size()); EXPECT_EQ(1ul, test_node_counter); - EXPECT_TRUE(list_.IsEmpty()); + EXPECT_TRUE(list_.empty()); } TEST_F(DoublyLinkedListTest, InsertRandom) { @@ -122,7 +122,7 @@ EXPECT_EQ(num_items, list_.size()); EXPECT_EQ(num_items, test_node_counter); EXPECT_NE(list_.Head(), list_.Tail()); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_TRUE(IsSorted()); } @@ -138,7 +138,7 @@ EXPECT_EQ(num_items, list_.size()); EXPECT_EQ(num_items, test_node_counter); EXPECT_NE(list_.Head(), list_.Tail()); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_TRUE(IsSorted()); } @@ -151,7 +151,7 @@ list_.InsertAfter(std::make_unique<TestNode>(10), begin_result.node); EXPECT_EQ(2ul, list_.size()); EXPECT_EQ(2ul, test_node_counter); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_TRUE(IsSorted()); EXPECT_EQ(end_result.node, list_.Tail()); @@ -184,7 +184,7 @@ auto result = list_.InsertAfter(std::make_unique<TestNode>(0), nullptr); EXPECT_EQ(1ul, list_.size()); EXPECT_EQ(1ul, test_node_counter); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_TRUE(IsSorted()); EXPECT_TRUE(result.is_new_entry); EXPECT_EQ(result.node, list_.Head()); @@ -193,7 +193,7 @@ result = list_.InsertAfter(std::make_unique<TestNode>(0), list_.Head()); EXPECT_EQ(2ul, list_.size()); EXPECT_EQ(2ul, test_node_counter); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_FALSE(IsSorted()); EXPECT_TRUE(result.is_new_entry); EXPECT_NE(result.node, list_.Head()); @@ -202,7 +202,7 @@ result = list_.InsertAfter(std::make_unique<TestNode>(1), list_.Head()); EXPECT_EQ(3ul, list_.size()); EXPECT_EQ(3ul, test_node_counter); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_FALSE(IsSorted()); EXPECT_TRUE(result.is_new_entry); EXPECT_NE(result.node, list_.Head()); @@ -211,7 +211,7 @@ result = list_.InsertAfter(std::make_unique<TestNode>(1), list_.Tail()); EXPECT_EQ(4ul, list_.size()); EXPECT_EQ(4ul, test_node_counter); - EXPECT_FALSE(list_.IsEmpty()); + EXPECT_FALSE(list_.empty()); EXPECT_FALSE(IsSorted()); EXPECT_TRUE(result.is_new_entry); EXPECT_NE(result.node, list_.Head());
diff --git a/third_party/blink/renderer/platform/wtf/hash_counted_set.h b/third_party/blink/renderer/platform/wtf/hash_counted_set.h index a977cfc..1ece827 100644 --- a/third_party/blink/renderer/platform/wtf/hash_counted_set.h +++ b/third_party/blink/renderer/platform/wtf/hash_counted_set.h
@@ -69,7 +69,7 @@ unsigned size() const { return impl_.size(); } unsigned Capacity() const { return impl_.capacity(); } - bool IsEmpty() const { return impl_.IsEmpty(); } + bool empty() const { return impl_.empty(); } // Iterators iterate over pairs of values (called key) and counts (called // value).
diff --git a/third_party/blink/renderer/platform/wtf/hash_map.h b/third_party/blink/renderer/platform/wtf/hash_map.h index 3a616714..f2b4c790 100644 --- a/third_party/blink/renderer/platform/wtf/hash_map.h +++ b/third_party/blink/renderer/platform/wtf/hash_map.h
@@ -136,7 +136,7 @@ impl_.ReserveCapacityForSize(size); } - bool IsEmpty() const; + bool empty() const; // iterators iterate over pairs of keys and values iterator begin(); @@ -409,8 +409,8 @@ typename W, typename X, typename Y> -inline bool HashMap<T, U, V, W, X, Y>::IsEmpty() const { - return impl_.IsEmpty(); +inline bool HashMap<T, U, V, W, X, Y>::empty() const { + return impl_.empty(); } template <typename T,
diff --git a/third_party/blink/renderer/platform/wtf/hash_map_test.cc b/third_party/blink/renderer/platform/wtf/hash_map_test.cc index 2bcf370..7d8f844f 100644 --- a/third_party/blink/renderer/platform/wtf/hash_map_test.cc +++ b/third_party/blink/renderer/platform/wtf/hash_map_test.cc
@@ -180,7 +180,7 @@ map.erase(raw_ptr); EXPECT_EQ(1, DummyRefCounted::ref_invokes_count_); EXPECT_TRUE(is_deleted); - EXPECT_TRUE(map.IsEmpty()); + EXPECT_TRUE(map.empty()); } TEST(HashMaptest, RemoveAdd) { @@ -205,7 +205,7 @@ map.erase(1); EXPECT_EQ(1, DummyRefCounted::ref_invokes_count_); EXPECT_TRUE(is_deleted); - EXPECT_TRUE(map.IsEmpty()); + EXPECT_TRUE(map.empty()); // Add and remove until the deleted slot is reused. for (int i = 1; i < 100; i++) { @@ -582,7 +582,7 @@ TEST(HashMapTest, InitializerList) { HashMap<int, int> empty({}); - EXPECT_TRUE(empty.IsEmpty()); + EXPECT_TRUE(empty.empty()); HashMap<int, int> one({{1, 11}}); EXPECT_EQ(one.size(), 1u); @@ -604,7 +604,7 @@ one_two_three.insert(9999, 99999); empty = {}; - EXPECT_TRUE(empty.IsEmpty()); + EXPECT_TRUE(empty.empty()); one = {{1, 11}}; EXPECT_EQ(one.size(), 1u);
diff --git a/third_party/blink/renderer/platform/wtf/hash_set.h b/third_party/blink/renderer/platform/wtf/hash_set.h index 8cbfa36..195b3fe 100644 --- a/third_party/blink/renderer/platform/wtf/hash_set.h +++ b/third_party/blink/renderer/platform/wtf/hash_set.h
@@ -87,7 +87,7 @@ unsigned size() const; unsigned Capacity() const; - bool IsEmpty() const; + bool empty() const; void ReserveCapacityForSize(unsigned size) { impl_.ReserveCapacityForSize(size); @@ -235,8 +235,8 @@ } template <typename T, typename U, typename V, typename W> -inline bool HashSet<T, U, V, W>::IsEmpty() const { - return impl_.IsEmpty(); +inline bool HashSet<T, U, V, W>::empty() const { + return impl_.empty(); } template <typename T, typename U, typename V, typename W>
diff --git a/third_party/blink/renderer/platform/wtf/hash_set_test.cc b/third_party/blink/renderer/platform/wtf/hash_set_test.cc index f3b0e385..1c8f7d7 100644 --- a/third_party/blink/renderer/platform/wtf/hash_set_test.cc +++ b/third_party/blink/renderer/platform/wtf/hash_set_test.cc
@@ -192,7 +192,7 @@ set.clear(); EXPECT_TRUE(deleted2); - EXPECT_TRUE(set.IsEmpty()); + EXPECT_TRUE(set.empty()); deleted1 = false; deleted2 = false; @@ -217,7 +217,7 @@ own_ptr1 = inner_set.Take(ptr1); EXPECT_EQ(1UL, inner_set.size()); own_ptr2 = inner_set.TakeAny(); - EXPECT_TRUE(inner_set.IsEmpty()); + EXPECT_TRUE(inner_set.empty()); } EXPECT_FALSE(deleted1); EXPECT_FALSE(deleted2); @@ -250,7 +250,7 @@ set.erase(raw_ptr); EXPECT_TRUE(is_deleted); - EXPECT_TRUE(set.IsEmpty()); + EXPECT_TRUE(set.empty()); EXPECT_EQ(1, DummyRefCounted::ref_invokes_count_); } @@ -383,7 +383,7 @@ TEST(HashSetTest, InitializerList) { HashSet<int> empty({}); - EXPECT_TRUE(empty.IsEmpty()); + EXPECT_TRUE(empty.empty()); HashSet<int> one({1}); EXPECT_EQ(1u, one.size()); @@ -401,7 +401,7 @@ one_two_three.insert(9999); empty = {}; - EXPECT_TRUE(empty.IsEmpty()); + EXPECT_TRUE(empty.empty()); one = {1}; EXPECT_EQ(1u, one.size());
diff --git a/third_party/blink/renderer/platform/wtf/hash_table.h b/third_party/blink/renderer/platform/wtf/hash_table.h index 6817ebee..ccc61f9 100644 --- a/third_party/blink/renderer/platform/wtf/hash_table.h +++ b/third_party/blink/renderer/platform/wtf/hash_table.h
@@ -768,10 +768,10 @@ // for begin. This is more efficient because we don't have to skip all the // empty and deleted buckets, and iterating an empty table is a common case // that's worth optimizing. - iterator begin() { return IsEmpty() ? end() : MakeIterator(table_); } + iterator begin() { return empty() ? end() : MakeIterator(table_); } iterator end() { return MakeKnownGoodIterator(table_ + table_size_); } const_iterator begin() const { - return IsEmpty() ? end() : MakeConstIterator(table_); + return empty() ? end() : MakeConstIterator(table_); } const_iterator end() const { return MakeKnownGoodConstIterator(table_ + table_size_); @@ -785,7 +785,7 @@ DCHECK(!AccessForbidden()); return table_size_; } - bool IsEmpty() const { + bool empty() const { DCHECK(!AccessForbidden()); return !key_count_; } @@ -2370,7 +2370,7 @@ template <typename Collection1, typename Collection2> inline void RemoveAll(Collection1& collection, const Collection2& to_be_removed) { - if (collection.IsEmpty() || to_be_removed.IsEmpty()) + if (collection.empty() || to_be_removed.empty()) return; typedef typename Collection2::const_iterator CollectionIterator; CollectionIterator end(to_be_removed.end());
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set.h b/third_party/blink/renderer/platform/wtf/linked_hash_set.h index 62b9f938..a0f7121 100644 --- a/third_party/blink/renderer/platform/wtf/linked_hash_set.h +++ b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
@@ -148,7 +148,7 @@ DCHECK(value_to_index_.size() == list_.size()); return list_.size(); } - bool IsEmpty() const { return list_.empty(); } + bool empty() const { return list_.empty(); } iterator begin() { return MakeIterator(list_.begin()); } const_iterator begin() const { return MakeIterator(list_.cbegin()); } @@ -404,13 +404,13 @@ template <typename T, typename TraitsArg, typename HashArg, typename Allocator> inline void LinkedHashSet<T, TraitsArg, HashArg, Allocator>::RemoveFirst() { - DCHECK(!IsEmpty()); + DCHECK(!empty()); erase(begin()); } template <typename T, typename TraitsArg, typename HashArg, typename Allocator> inline void LinkedHashSet<T, TraitsArg, HashArg, Allocator>::pop_back() { - DCHECK(!IsEmpty()); + DCHECK(!empty()); erase(--end()); }
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc b/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc index 599f215..7f33854 100644 --- a/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc +++ b/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc
@@ -28,7 +28,7 @@ int counter3 = 0; Set set1; EXPECT_EQ(set1.size(), 0u); - EXPECT_TRUE(set1.IsEmpty()); + EXPECT_TRUE(set1.empty()); set1.insert(ValueInstanceCount<int>(&counter1, 1)); set1.insert(ValueInstanceCount<int>(&counter2, 2)); set1.insert(ValueInstanceCount<int>(&counter3, 3)); @@ -62,7 +62,7 @@ using Set = LinkedHashSet<int*>; Set set1; EXPECT_EQ(set1.size(), 0u); - EXPECT_TRUE(set1.IsEmpty()); + EXPECT_TRUE(set1.empty()); std::unique_ptr<int> int1 = std::make_unique<int>(1); std::unique_ptr<int> int2 = std::make_unique<int>(2); std::unique_ptr<int> int3 = std::make_unique<int>(3); @@ -108,7 +108,7 @@ using Set = LinkedHashSet<String>; Set set1; EXPECT_EQ(set1.size(), 0u); - EXPECT_TRUE(set1.IsEmpty()); + EXPECT_TRUE(set1.empty()); set1.insert("1"); set1.insert("2"); set1.insert("3"); @@ -156,7 +156,7 @@ int counter3 = 0; Set set1; EXPECT_EQ(set1.size(), 0u); - EXPECT_TRUE(set1.IsEmpty()); + EXPECT_TRUE(set1.empty()); set1.insert(ValueInstanceCount<int>(&counter1, 1)); set1.insert(ValueInstanceCount<int>(&counter2, 2)); set1.insert(ValueInstanceCount<int>(&counter3, 3)); @@ -193,7 +193,7 @@ int counter3 = 0; Set set1; EXPECT_EQ(set1.size(), 0u); - EXPECT_TRUE(set1.IsEmpty()); + EXPECT_TRUE(set1.empty()); set1.insert(ValueInstanceCount<String>(&counter1, "1")); set1.insert(ValueInstanceCount<String>(&counter2, "2")); set1.insert(ValueInstanceCount<String>(&counter3, "3")); @@ -242,7 +242,7 @@ using Set = LinkedHashSet<int, CustomHashTraitsForInt>; Set set; EXPECT_EQ(set.size(), 0u); - EXPECT_TRUE(set.IsEmpty()); + EXPECT_TRUE(set.empty()); set.PrependOrMoveToFirst(1); EXPECT_EQ(set.front(), 1); @@ -591,7 +591,7 @@ EXPECT_EQ(*it, 2); set.RemoveFirst(); - EXPECT_TRUE(set.IsEmpty()); + EXPECT_TRUE(set.empty()); } TEST(LinkedHashSetTest, pop_back) {
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index f4b60d4..9600d6f 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -189834,7 +189834,7 @@ ] ], "svg-rotate-angle-45-001.html": [ - "2a65532cfcaa477763445f5965f43ce06584551e", + "ff5173753694d97ed5df47c190dc56575db48173", [ null, [ @@ -189847,7 +189847,7 @@ ] ], "svg-rotate-angle-45-011.html": [ - "2d8011ae9aaaf02a8d67fd53eebbbaa45270bc80", + "94f1bf5121bfc09e5166217cc819284b1cec8a2f", [ null, [ @@ -189860,7 +189860,7 @@ ] ], "svg-rotate-angle-45-022.html": [ - "8d4df9904c3ca674aa811fda3d33e0993002316a", + "b4d7019a90ee45762134ddbeca5f86fc785a7739", [ null, [ @@ -319735,7 +319735,7 @@ [] ], "test-helper.js": [ - "a40711193114dff0f83aac80e221618ee4ae6e90", + "fa9ec20c62be2aa9158abd32e1732689457c3f4d", [] ] },
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-001.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-001.html index 2a65532..ff51737 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-001.html
@@ -22,8 +22,8 @@ <body> <p>The test passes if there is a green square and no red.</p> <svg> - <path d="M 142,2 210,71 142,139 73,71 Z" fill="red"/> - <rect x="100" y="-100" width="100" height="100" fill="green" transform="rotate(45)"/> + <path d="M 106,37 175,106 106,175 37,106 Z" fill="red"/> + <rect x="100" y="-50" width="100" height="100" fill="green" transform="rotate(45)"/> </svg> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-011.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-011.html index 2d8011ae..94f1bf5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-011.html +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-011.html
@@ -22,8 +22,8 @@ <body> <p>The test passes if there is a green square and no red.</p> <svg> - <path d="M 142,2 210,71 142,139 73,71 Z" fill="red"/> - <rect x="100" y="-100" width="100" height="100" fill="green" transform="rotate(405)"/> + <path d="M 106,37 175,106 106,175 37,106 Z" fill="red"/> + <rect x="100" y="-50" width="100" height="100" fill="green" transform="rotate(405)"/> </svg> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-022.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-022.html index 8d4df99..b4d7019a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-022.html +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/rotate/svg-rotate-angle-45-022.html
@@ -22,8 +22,8 @@ <body> <p>The test passes if there is a green square and no red.</p> <svg> - <path d="M 142,2 210,71 142,139 73,71 Z" fill="red"/> - <rect x="100" y="-100" width="100" height="100" fill="green" transform="rotate(450e-1)"/> + <path d="M 106,37 175,106 106,175 37,106 Z" fill="red"/> + <rect x="100" y="-50" width="100" height="100" fill="green" transform="rotate(450e-1)"/> </svg> </body> </html>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied-non-standard.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied-non-standard.https.html new file mode 100644 index 0000000..34e08d5cd --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied-non-standard.https.html
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<title>Permission API in fenced frames should always return denied</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/utils.js"></script> +<script src="/common/utils.js"></script> + +<body> + <script> + // See https://cs.chromium.org/chromium/src/third_party/blink/renderer/modules/permissions/permission_descriptor.idl for valid permission names. + non_standard_permission_list = + ['accessibility-events', + 'clipboard-read', + 'clipboard-write', + 'payment-handler', + 'idle-detection', + 'periodic-background-sync', + 'system-wake-lock', + 'storage-access', + 'window-placement', + 'local-fonts']; + + non_standard_permission_list.forEach(function (permission_name) { + promise_test(async t => { + const permission_key = token(); + + attachFencedFrame(generateURL( + 'resources/permission-api-denied-inner.html', + [permission_key, permission_name])); + const actual_result = await nextValueFromServer(permission_key); + console.log(permission_name + ' ' + actual_result); + assert_equals( + actual_result, 'result: denied', + 'permission API should return denied for ' + permission_name + + ' in fenced frames.'); + }); + }); + </script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied.https.html index 0018f8e..cd97ebd 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied.https.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/permission-api-denied.https.html
@@ -10,7 +10,7 @@ <body> <script> // See https://cs.chromium.org/chromium/src/third_party/blink/renderer/modules/permissions/permission_descriptor.idl for valid permission names. - permission_list = + standard_permission_list = ['geolocation', 'notifications', 'push', @@ -26,20 +26,9 @@ 'magnetometer', 'screen-wake-lock', 'nfc', - 'display-capture', - // Non-standard: - 'accessibility-events', - 'clipboard-read', - 'clipboard-write', - 'payment-handler', - 'idle-detection', - 'periodic-background-sync', - 'system-wake-lock', - 'storage-access', - 'window-placement', - 'local-fonts']; + 'display-capture']; - permission_list.forEach(function (permission_name) { + standard_permission_list.forEach(function (permission_name) { promise_test(async t => { const permission_key = token(); @@ -47,10 +36,11 @@ 'resources/permission-api-denied-inner.html', [permission_key, permission_name])); const actual_result = await nextValueFromServer(permission_key); - console.log(permission_name + actual_result); + console.log(permission_name + ' ' + actual_result); assert_equals( actual_result, 'result: denied', - 'permission API should return denied for ' + permission_name + ' in fenced frames.'); + 'permission API should return denied for ' + permission_name + + ' in fenced frames.'); }); }); </script>
diff --git a/third_party/ipcz/src/queueing_test.cc b/third_party/ipcz/src/queueing_test.cc index 85ba3dc..1f628e0 100644 --- a/third_party/ipcz/src/queueing_test.cc +++ b/third_party/ipcz/src/queueing_test.cc
@@ -179,7 +179,8 @@ Close(b); } -MULTINODE_TEST(QueueingTest, TwoPhaseFeedback) { +// TODO(https://crbug.com/1361670): Fix flakiness and re-enable this test. +MULTINODE_TEST(QueueingTest, DISABLED_TwoPhaseFeedback) { IpczHandle c = SpawnTestNode<TwoPhaseFeedbackClient>(); WaitForDirectRemoteLink(c); EXPECT_EQ(IPCZ_RESULT_OK, Put(c, "hello?"));
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium index f2fd577..f16e9c57 100644 --- a/third_party/metrics_proto/README.chromium +++ b/third_party/metrics_proto/README.chromium
@@ -1,8 +1,8 @@ Name: Metrics Protos Short Name: metrics_proto URL: This is the canonical public repository -Version: 473330419 -Date: 2022/09/09 UTC +Version: 474686524 +Date: 2022/09/15 UTC License: BSD Security Critical: Yes
diff --git a/third_party/metrics_proto/structured_data.proto b/third_party/metrics_proto/structured_data.proto index 09bb1fb..f150ee1 100644 --- a/third_party/metrics_proto/structured_data.proto +++ b/third_party/metrics_proto/structured_data.proto
@@ -12,7 +12,7 @@ // One structured metrics event, containing several hashed and unhashed metrics // related to a single event type, tied to a single pseudonymous user. // -// Next tag: 5 +// Next tag: 6 message StructuredEventProto { // A per-client, per-profile, per-project ID that is used only for structured // metrics. For projects recorded from Chrome OS's platform2 repository, this @@ -69,6 +69,10 @@ RAW_STRING = 2; } optional EventType event_type = 4; + + // The project name hash is the first 8 bytes of the MD5 hash of the project + // name that is defined in src/tools/metrics/structured/structured.xml. + optional fixed64 project_name_hash = 5; } // The top-level proto for structured metrics. One StructuredDataProto is
diff --git a/third_party/mocha/README.chromium b/third_party/mocha/README.chromium index e5bee35..080119a 100644 --- a/third_party/mocha/README.chromium +++ b/third_party/mocha/README.chromium
@@ -1,7 +1,7 @@ Name: Mocha Short Name: mocha URL: https://github.com/mochajs/mocha -Version: 6.1.4 +Version: 10.0.0 License: MIT License File: NOT_SHIPPED Security Critical: no
diff --git a/third_party/mocha/mocha.js b/third_party/mocha/mocha.js index 508a306..620e1abe 100644 --- a/third_party/mocha/mocha.js +++ b/third_party/mocha/mocha.js
@@ -1,16694 +1,3557 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ -(function (process,global){ -'use strict'; +// mocha@10.0.0 in javascript ES2018 +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.mocha = factory()); +})(this, (function () { 'use strict'; -/* eslint no-unused-vars: off */ -/* eslint-env commonjs */ + var global$2 = (typeof global !== "undefined" ? global : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {}); -/** - * Shim process.stdout. - */ + var global$1 = (typeof global$2 !== "undefined" ? global$2 : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {}); -process.stdout = require('browser-stdout')({label: false}); + // shim for using process in browser + // based off https://github.com/defunctzombie/node-process/blob/master/browser.js -var Mocha = require('./lib/mocha'); - -/** - * Create a Mocha instance. - * - * @return {undefined} - */ - -var mocha = new Mocha({reporter: 'html'}); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date; -var setTimeout = global.setTimeout; -var setInterval = global.setInterval; -var clearTimeout = global.clearTimeout; -var clearInterval = global.clearInterval; - -var uncaughtExceptionHandlers = []; - -var originalOnerrorHandler = global.onerror; - -/** - * Remove uncaughtException listener. - * Revert to original onerror handler if previously defined. - */ - -process.removeListener = function(e, fn) { - if (e === 'uncaughtException') { - if (originalOnerrorHandler) { - global.onerror = originalOnerrorHandler; - } else { - global.onerror = function() {}; - } - var i = uncaughtExceptionHandlers.indexOf(fn); - if (i !== -1) { - uncaughtExceptionHandlers.splice(i, 1); - } + function defaultSetTimout$1() { + throw new Error('setTimeout has not been defined'); } -}; - -/** - * Implements uncaughtException listener. - */ - -process.on = function(e, fn) { - if (e === 'uncaughtException') { - global.onerror = function(err, url, line) { - fn(new Error(err + ' (' + url + ':' + line + ')')); - return !mocha.allowUncaught; - }; - uncaughtExceptionHandlers.push(fn); + function defaultClearTimeout$1 () { + throw new Error('clearTimeout has not been defined'); } -}; - -// The BDD UI is registered by default, but no UI will be functional in the -// browser without an explicit call to the overridden `mocha.ui` (see below). -// Ensure that this default UI does not expose its methods to the global scope. -mocha.suite.removeAllListeners('pre-require'); - -var immediateQueue = []; -var immediateTimeout; - -function timeslice() { - var immediateStart = new Date().getTime(); - while (immediateQueue.length && new Date().getTime() - immediateStart < 100) { - immediateQueue.shift()(); + var cachedSetTimeout$1 = defaultSetTimout$1; + var cachedClearTimeout$1 = defaultClearTimeout$1; + if (typeof global$1.setTimeout === 'function') { + cachedSetTimeout$1 = setTimeout; } - if (immediateQueue.length) { - immediateTimeout = setTimeout(timeslice, 0); - } else { - immediateTimeout = null; - } -} - -/** - * High-performance override of Runner.immediately. - */ - -Mocha.Runner.immediately = function(callback) { - immediateQueue.push(callback); - if (!immediateTimeout) { - immediateTimeout = setTimeout(timeslice, 0); - } -}; - -/** - * Function to allow assertion libraries to throw errors directly into mocha. - * This is useful when running tests in a browser because window.onerror will - * only receive the 'message' attribute of the Error. - */ -mocha.throwError = function(err) { - uncaughtExceptionHandlers.forEach(function(fn) { - fn(err); - }); - throw err; -}; - -/** - * Override ui to ensure that the ui functions are initialized. - * Normally this would happen in Mocha.prototype.loadFiles. - */ - -mocha.ui = function(ui) { - Mocha.prototype.ui.call(this, ui); - this.suite.emit('pre-require', global, null, this); - return this; -}; - -/** - * Setup mocha with the given setting options. - */ - -mocha.setup = function(opts) { - if (typeof opts === 'string') { - opts = {ui: opts}; - } - for (var opt in opts) { - if (opts.hasOwnProperty(opt)) { - this[opt](opts[opt]); - } - } - return this; -}; - -/** - * Run mocha, returning the Runner. - */ - -mocha.run = function(fn) { - var options = mocha.options; - mocha.globals('location'); - - var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) { - mocha.grep(query.grep); - } - if (query.fgrep) { - mocha.fgrep(query.fgrep); - } - if (query.invert) { - mocha.invert(); + if (typeof global$1.clearTimeout === 'function') { + cachedClearTimeout$1 = clearTimeout; } - return Mocha.prototype.run.call(mocha, function(err) { - // The DOM Document is not available in Web Workers. - var document = global.document; - if ( - document && - document.getElementById('mocha') && - options.noHighlighting !== true - ) { - Mocha.utils.highlightTags('code'); - } - if (fn) { - fn(err); - } - }); -}; - -/** - * Expose the process shim. - * https://github.com/mochajs/mocha/pull/916 - */ - -Mocha.process = process; - -/** - * Expose mocha. - */ - -global.Mocha = Mocha; -global.mocha = mocha; - -// this allows test/acceptance/required-tokens.js to pass; thus, -// you can now do `const describe = require('mocha').describe` in a -// browser context (assuming browserification). should fix #880 -module.exports = global; - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./lib/mocha":14,"_process":69,"browser-stdout":41}],2:[function(require,module,exports){ -(function (process,global){ -'use strict'; - -/** - * Web Notifications module. - * @module Growl - */ - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ -var Date = global.Date; -var setTimeout = global.setTimeout; -var EVENT_RUN_END = require('../runner').constants.EVENT_RUN_END; - -/** - * Checks if browser notification support exists. - * - * @public - * @see {@link https://caniuse.com/#feat=notifications|Browser support (notifications)} - * @see {@link https://caniuse.com/#feat=promises|Browser support (promises)} - * @see {@link Mocha#growl} - * @see {@link Mocha#isGrowlCapable} - * @return {boolean} whether browser notification support exists - */ -exports.isCapable = function() { - var hasNotificationSupport = 'Notification' in window; - var hasPromiseSupport = typeof Promise === 'function'; - return process.browser && hasNotificationSupport && hasPromiseSupport; -}; - -/** - * Implements browser notifications as a pseudo-reporter. - * - * @public - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/notification|Notification API} - * @see {@link https://developers.google.com/web/fundamentals/push-notifications/display-a-notification|Displaying a Notification} - * @see {@link Growl#isPermitted} - * @see {@link Mocha#_growl} - * @param {Runner} runner - Runner instance. - */ -exports.notify = function(runner) { - var promise = isPermitted(); - - /** - * Attempt notification. - */ - var sendNotification = function() { - // If user hasn't responded yet... "No notification for you!" (Seinfeld) - Promise.race([promise, Promise.resolve(undefined)]) - .then(canNotify) - .then(function() { - display(runner); - }) - .catch(notPermitted); - }; - - runner.once(EVENT_RUN_END, sendNotification); -}; - -/** - * Checks if browser notification is permitted by user. - * - * @private - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Notification/permission|Notification.permission} - * @see {@link Mocha#growl} - * @see {@link Mocha#isGrowlPermitted} - * @returns {Promise<boolean>} promise determining if browser notification - * permissible when fulfilled. - */ -function isPermitted() { - var permitted = { - granted: function allow() { - return Promise.resolve(true); - }, - denied: function deny() { - return Promise.resolve(false); - }, - default: function ask() { - return Notification.requestPermission().then(function(permission) { - return permission === 'granted'; - }); - } - }; - - return permitted[Notification.permission](); -} - -/** - * @summary - * Determines if notification should proceed. - * - * @description - * Notification shall <strong>not</strong> proceed unless `value` is true. - * - * `value` will equal one of: - * <ul> - * <li><code>true</code> (from `isPermitted`)</li> - * <li><code>false</code> (from `isPermitted`)</li> - * <li><code>undefined</code> (from `Promise.race`)</li> - * </ul> - * - * @private - * @param {boolean|undefined} value - Determines if notification permissible. - * @returns {Promise<undefined>} Notification can proceed - */ -function canNotify(value) { - if (!value) { - var why = value === false ? 'blocked' : 'unacknowledged'; - var reason = 'not permitted by user (' + why + ')'; - return Promise.reject(new Error(reason)); - } - return Promise.resolve(); -} - -/** - * Displays the notification. - * - * @private - * @param {Runner} runner - Runner instance. - */ -function display(runner) { - var stats = runner.stats; - var symbol = { - cross: '\u274C', - tick: '\u2705' - }; - var logo = require('../../package').notifyLogo; - var _message; - var message; - var title; - - if (stats.failures) { - _message = stats.failures + ' of ' + stats.tests + ' tests failed'; - message = symbol.cross + ' ' + _message; - title = 'Failed'; - } else { - _message = stats.passes + ' tests passed in ' + stats.duration + 'ms'; - message = symbol.tick + ' ' + _message; - title = 'Passed'; - } - - // Send notification - var options = { - badge: logo, - body: message, - dir: 'ltr', - icon: logo, - lang: 'en-US', - name: 'mocha', - requireInteraction: false, - timestamp: Date.now() - }; - var notification = new Notification(title, options); - - // Autoclose after brief delay (makes various browsers act same) - var FORCE_DURATION = 4000; - setTimeout(notification.close.bind(notification), FORCE_DURATION); -} - -/** - * As notifications are tangential to our purpose, just log the error. - * - * @private - * @param {Error} err - Why notification didn't happen. - */ -function notPermitted(err) { - console.error('notification error:', err.message); -} - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../../package":90,"../runner":34,"_process":69}],3:[function(require,module,exports){ -'use strict'; - -/** - * Expose `Progress`. - */ - -module.exports = Progress; - -/** - * Initialize a new `Progress` indicator. - */ -function Progress() { - this.percent = 0; - this.size(0); - this.fontSize(11); - this.font('helvetica, arial, sans-serif'); -} - -/** - * Set progress size to `size`. - * - * @public - * @param {number} size - * @return {Progress} Progress instance. - */ -Progress.prototype.size = function(size) { - this._size = size; - return this; -}; - -/** - * Set text to `text`. - * - * @public - * @param {string} text - * @return {Progress} Progress instance. - */ -Progress.prototype.text = function(text) { - this._text = text; - return this; -}; - -/** - * Set font size to `size`. - * - * @public - * @param {number} size - * @return {Progress} Progress instance. - */ -Progress.prototype.fontSize = function(size) { - this._fontSize = size; - return this; -}; - -/** - * Set font to `family`. - * - * @param {string} family - * @return {Progress} Progress instance. - */ -Progress.prototype.font = function(family) { - this._font = family; - return this; -}; - -/** - * Update percentage to `n`. - * - * @param {number} n - * @return {Progress} Progress instance. - */ -Progress.prototype.update = function(n) { - this.percent = n; - return this; -}; - -/** - * Draw on `ctx`. - * - * @param {CanvasRenderingContext2d} ctx - * @return {Progress} Progress instance. - */ -Progress.prototype.draw = function(ctx) { - try { - var percent = Math.min(this.percent, 100); - var size = this._size; - var half = size / 2; - var x = half; - var y = half; - var rad = half - 1; - var fontSize = this._fontSize; - - ctx.font = fontSize + 'px ' + this._font; - - var angle = Math.PI * 2 * (percent / 100); - ctx.clearRect(0, 0, size, size); - - // outer circle - ctx.strokeStyle = '#9f9f9f'; - ctx.beginPath(); - ctx.arc(x, y, rad, 0, angle, false); - ctx.stroke(); - - // inner circle - ctx.strokeStyle = '#eee'; - ctx.beginPath(); - ctx.arc(x, y, rad - 1, 0, angle, true); - ctx.stroke(); - - // text - var text = this._text || (percent | 0) + '%'; - var w = ctx.measureText(text).width; - - ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1); - } catch (ignore) { - // don't fail if we can't render progress - } - return this; -}; - -},{}],4:[function(require,module,exports){ -(function (global){ -'use strict'; - -exports.isatty = function isatty() { - return true; -}; - -exports.getWindowSize = function getWindowSize() { - if ('innerHeight' in global) { - return [global.innerHeight, global.innerWidth]; - } - // In a Web Worker, the DOM Window is not available. - return [640, 480]; -}; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],5:[function(require,module,exports){ -'use strict'; -/** - * @module Context - */ -/** - * Expose `Context`. - */ - -module.exports = Context; - -/** - * Initialize a new `Context`. - * - * @private - */ -function Context() {} - -/** - * Set or get the context `Runnable` to `runnable`. - * - * @private - * @param {Runnable} runnable - * @return {Context} context - */ -Context.prototype.runnable = function(runnable) { - if (!arguments.length) { - return this._runnable; - } - this.test = this._runnable = runnable; - return this; -}; - -/** - * Set or get test timeout `ms`. - * - * @private - * @param {number} ms - * @return {Context} self - */ -Context.prototype.timeout = function(ms) { - if (!arguments.length) { - return this.runnable().timeout(); - } - this.runnable().timeout(ms); - return this; -}; - -/** - * Set test timeout `enabled`. - * - * @private - * @param {boolean} enabled - * @return {Context} self - */ -Context.prototype.enableTimeouts = function(enabled) { - if (!arguments.length) { - return this.runnable().enableTimeouts(); - } - this.runnable().enableTimeouts(enabled); - return this; -}; - -/** - * Set or get test slowness threshold `ms`. - * - * @private - * @param {number} ms - * @return {Context} self - */ -Context.prototype.slow = function(ms) { - if (!arguments.length) { - return this.runnable().slow(); - } - this.runnable().slow(ms); - return this; -}; - -/** - * Mark a test as skipped. - * - * @private - * @throws Pending - */ -Context.prototype.skip = function() { - this.runnable().skip(); -}; - -/** - * Set or get a number of allowed retries on failed tests - * - * @private - * @param {number} n - * @return {Context} self - */ -Context.prototype.retries = function(n) { - if (!arguments.length) { - return this.runnable().retries(); - } - this.runnable().retries(n); - return this; -}; - -},{}],6:[function(require,module,exports){ -'use strict'; -/** - * @module Errors - */ -/** - * Factory functions to create throwable error objects - */ - -/** - * Creates an error object to be thrown when no files to be tested could be found using specified pattern. - * - * @public - * @param {string} message - Error message to be displayed. - * @param {string} pattern - User-specified argument value. - * @returns {Error} instance detailing the error condition - */ -function createNoFilesMatchPatternError(message, pattern) { - var err = new Error(message); - err.code = 'ERR_MOCHA_NO_FILES_MATCH_PATTERN'; - err.pattern = pattern; - return err; -} - -/** - * Creates an error object to be thrown when the reporter specified in the options was not found. - * - * @public - * @param {string} message - Error message to be displayed. - * @param {string} reporter - User-specified reporter value. - * @returns {Error} instance detailing the error condition - */ -function createInvalidReporterError(message, reporter) { - var err = new TypeError(message); - err.code = 'ERR_MOCHA_INVALID_REPORTER'; - err.reporter = reporter; - return err; -} - -/** - * Creates an error object to be thrown when the interface specified in the options was not found. - * - * @public - * @param {string} message - Error message to be displayed. - * @param {string} ui - User-specified interface value. - * @returns {Error} instance detailing the error condition - */ -function createInvalidInterfaceError(message, ui) { - var err = new Error(message); - err.code = 'ERR_MOCHA_INVALID_INTERFACE'; - err.interface = ui; - return err; -} - -/** - * Creates an error object to be thrown when a behavior, option, or parameter is unsupported. - * - * @public - * @param {string} message - Error message to be displayed. - * @returns {Error} instance detailing the error condition - */ -function createUnsupportedError(message) { - var err = new Error(message); - err.code = 'ERR_MOCHA_UNSUPPORTED'; - return err; -} - -/** - * Creates an error object to be thrown when an argument is missing. - * - * @public - * @param {string} message - Error message to be displayed. - * @param {string} argument - Argument name. - * @param {string} expected - Expected argument datatype. - * @returns {Error} instance detailing the error condition - */ -function createMissingArgumentError(message, argument, expected) { - return createInvalidArgumentTypeError(message, argument, expected); -} - -/** - * Creates an error object to be thrown when an argument did not use the supported type - * - * @public - * @param {string} message - Error message to be displayed. - * @param {string} argument - Argument name. - * @param {string} expected - Expected argument datatype. - * @returns {Error} instance detailing the error condition - */ -function createInvalidArgumentTypeError(message, argument, expected) { - var err = new TypeError(message); - err.code = 'ERR_MOCHA_INVALID_ARG_TYPE'; - err.argument = argument; - err.expected = expected; - err.actual = typeof argument; - return err; -} - -/** - * Creates an error object to be thrown when an argument did not use the supported value - * - * @public - * @param {string} message - Error message to be displayed. - * @param {string} argument - Argument name. - * @param {string} value - Argument value. - * @param {string} [reason] - Why value is invalid. - * @returns {Error} instance detailing the error condition - */ -function createInvalidArgumentValueError(message, argument, value, reason) { - var err = new TypeError(message); - err.code = 'ERR_MOCHA_INVALID_ARG_VALUE'; - err.argument = argument; - err.value = value; - err.reason = typeof reason !== 'undefined' ? reason : 'is invalid'; - return err; -} - -/** - * Creates an error object to be thrown when an exception was caught, but the `Error` is falsy or undefined. - * - * @public - * @param {string} message - Error message to be displayed. - * @returns {Error} instance detailing the error condition - */ -function createInvalidExceptionError(message, value) { - var err = new Error(message); - err.code = 'ERR_MOCHA_INVALID_EXCEPTION'; - err.valueType = typeof value; - err.value = value; - return err; -} - -module.exports = { - createInvalidArgumentTypeError: createInvalidArgumentTypeError, - createInvalidArgumentValueError: createInvalidArgumentValueError, - createInvalidExceptionError: createInvalidExceptionError, - createInvalidInterfaceError: createInvalidInterfaceError, - createInvalidReporterError: createInvalidReporterError, - createMissingArgumentError: createMissingArgumentError, - createNoFilesMatchPatternError: createNoFilesMatchPatternError, - createUnsupportedError: createUnsupportedError -}; - -},{}],7:[function(require,module,exports){ -'use strict'; - -var Runnable = require('./runnable'); -var inherits = require('./utils').inherits; - -/** - * Expose `Hook`. - */ - -module.exports = Hook; - -/** - * Initialize a new `Hook` with the given `title` and callback `fn` - * - * @class - * @extends Runnable - * @param {String} title - * @param {Function} fn - */ -function Hook(title, fn) { - Runnable.call(this, title, fn); - this.type = 'hook'; -} - -/** - * Inherit from `Runnable.prototype`. - */ -inherits(Hook, Runnable); - -/** - * Get or set the test `err`. - * - * @memberof Hook - * @public - * @param {Error} err - * @return {Error} - */ -Hook.prototype.error = function(err) { - if (!arguments.length) { - err = this._error; - this._error = null; - return err; - } - - this._error = err; -}; - -},{"./runnable":33,"./utils":38}],8:[function(require,module,exports){ -'use strict'; - -var Test = require('../test'); -var EVENT_FILE_PRE_REQUIRE = require('../suite').constants - .EVENT_FILE_PRE_REQUIRE; - -/** - * BDD-style interface: - * - * describe('Array', function() { - * describe('#indexOf()', function() { - * it('should return -1 when not present', function() { - * // ... - * }); - * - * it('should return the index when present', function() { - * // ... - * }); - * }); - * }); - * - * @param {Suite} suite Root suite. - */ -module.exports = function bddInterface(suite) { - var suites = [suite]; - - suite.on(EVENT_FILE_PRE_REQUIRE, function(context, file, mocha) { - var common = require('./common')(suites, context, mocha); - - context.before = common.before; - context.after = common.after; - context.beforeEach = common.beforeEach; - context.afterEach = common.afterEach; - context.run = mocha.options.delay && common.runWithSuite(suite); - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.describe = context.context = function(title, fn) { - return common.suite.create({ - title: title, - file: file, - fn: fn - }); - }; - - /** - * Pending describe. - */ - - context.xdescribe = context.xcontext = context.describe.skip = function( - title, - fn - ) { - return common.suite.skip({ - title: title, - file: file, - fn: fn - }); - }; - - /** - * Exclusive suite. - */ - - context.describe.only = function(title, fn) { - return common.suite.only({ - title: title, - file: file, - fn: fn - }); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.it = context.specify = function(title, fn) { - var suite = suites[0]; - if (suite.isPending()) { - fn = null; + function runTimeout$1(fun) { + if (cachedSetTimeout$1 === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); } - var test = new Test(title, fn); - test.file = file; - suite.addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.it.only = function(title, fn) { - return common.test.only(mocha, context.it(title, fn)); - }; - - /** - * Pending test case. - */ - - context.xit = context.xspecify = context.it.skip = function(title) { - return context.it(title); - }; - - /** - * Number of attempts to retry. - */ - context.it.retries = function(n) { - context.retries(n); - }; - }); -}; - -module.exports.description = 'BDD or RSpec style [default]'; - -},{"../suite":36,"../test":37,"./common":9}],9:[function(require,module,exports){ -'use strict'; - -var Suite = require('../suite'); -var errors = require('../errors'); -var createMissingArgumentError = errors.createMissingArgumentError; - -/** - * Functions common to more than one interface. - * - * @param {Suite[]} suites - * @param {Context} context - * @param {Mocha} mocha - * @return {Object} An object containing common functions. - */ -module.exports = function(suites, context, mocha) { - /** - * Check if the suite should be tested. - * - * @private - * @param {Suite} suite - suite to check - * @returns {boolean} - */ - function shouldBeTested(suite) { - return ( - !mocha.options.grep || - (mocha.options.grep && - mocha.options.grep.test(suite.fullTitle()) && - !mocha.options.invert) - ); - } - - return { - /** - * This is only present if flag --delay is passed into Mocha. It triggers - * root suite execution. - * - * @param {Suite} suite The root suite. - * @return {Function} A function which runs the root suite - */ - runWithSuite: function runWithSuite(suite) { - return function run() { - suite.run(); - }; - }, - - /** - * Execute before running tests. - * - * @param {string} name - * @param {Function} fn - */ - before: function(name, fn) { - suites[0].beforeAll(name, fn); - }, - - /** - * Execute after running tests. - * - * @param {string} name - * @param {Function} fn - */ - after: function(name, fn) { - suites[0].afterAll(name, fn); - }, - - /** - * Execute before each test case. - * - * @param {string} name - * @param {Function} fn - */ - beforeEach: function(name, fn) { - suites[0].beforeEach(name, fn); - }, - - /** - * Execute after each test case. - * - * @param {string} name - * @param {Function} fn - */ - afterEach: function(name, fn) { - suites[0].afterEach(name, fn); - }, - - suite: { - /** - * Create an exclusive Suite; convenience function - * See docstring for create() below. - * - * @param {Object} opts - * @returns {Suite} - */ - only: function only(opts) { - opts.isOnly = true; - return this.create(opts); - }, - - /** - * Create a Suite, but skip it; convenience function - * See docstring for create() below. - * - * @param {Object} opts - * @returns {Suite} - */ - skip: function skip(opts) { - opts.pending = true; - return this.create(opts); - }, - - /** - * Creates a suite. - * - * @param {Object} opts Options - * @param {string} opts.title Title of Suite - * @param {Function} [opts.fn] Suite Function (not always applicable) - * @param {boolean} [opts.pending] Is Suite pending? - * @param {string} [opts.file] Filepath where this Suite resides - * @param {boolean} [opts.isOnly] Is Suite exclusive? - * @returns {Suite} - */ - create: function create(opts) { - var suite = Suite.create(suites[0], opts.title); - suite.pending = Boolean(opts.pending); - suite.file = opts.file; - suites.unshift(suite); - if (opts.isOnly) { - if (mocha.options.forbidOnly && shouldBeTested(suite)) { - throw new Error('`.only` forbidden'); - } - - suite.parent.appendOnlySuite(suite); - } - if (suite.pending) { - if (mocha.options.forbidPending && shouldBeTested(suite)) { - throw new Error('Pending test forbidden'); - } - } - if (typeof opts.fn === 'function') { - opts.fn.call(suite); - suites.shift(); - } else if (typeof opts.fn === 'undefined' && !suite.pending) { - throw createMissingArgumentError( - 'Suite "' + - suite.fullTitle() + - '" was defined but no callback was supplied. ' + - 'Supply a callback or explicitly skip the suite.', - 'callback', - 'function' - ); - } else if (!opts.fn && suite.pending) { - suites.shift(); - } - - return suite; + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout$1 === defaultSetTimout$1 || !cachedSetTimeout$1) && setTimeout) { + cachedSetTimeout$1 = setTimeout; + return setTimeout(fun, 0); } - }, - - test: { - /** - * Exclusive test-case. - * - * @param {Object} mocha - * @param {Function} test - * @returns {*} - */ - only: function(mocha, test) { - test.parent.appendOnlyTest(test); - return test; - }, - - /** - * Pending test case. - * - * @param {string} title - */ - skip: function(title) { - context.test(title); - }, - - /** - * Number of retry attempts - * - * @param {number} n - */ - retries: function(n) { - context.retries(n); - } - } - }; -}; - -},{"../errors":6,"../suite":36}],10:[function(require,module,exports){ -'use strict'; -var Suite = require('../suite'); -var Test = require('../test'); - -/** - * Exports-style (as Node.js module) interface: - * - * exports.Array = { - * '#indexOf()': { - * 'should return -1 when the value is not present': function() { - * - * }, - * - * 'should return the correct index when the value is present': function() { - * - * } - * } - * }; - * - * @param {Suite} suite Root suite. - */ -module.exports = function(suite) { - var suites = [suite]; - - suite.on(Suite.constants.EVENT_FILE_REQUIRE, visit); - - function visit(obj, file) { - var suite; - for (var key in obj) { - if (typeof obj[key] === 'function') { - var fn = obj[key]; - switch (key) { - case 'before': - suites[0].beforeAll(fn); - break; - case 'after': - suites[0].afterAll(fn); - break; - case 'beforeEach': - suites[0].beforeEach(fn); - break; - case 'afterEach': - suites[0].afterEach(fn); - break; - default: - var test = new Test(key, fn); - test.file = file; - suites[0].addTest(test); - } - } else { - suite = Suite.create(suites[0], key); - suites.unshift(suite); - visit(obj[key], file); - suites.shift(); - } - } - } -}; - -module.exports.description = 'Node.js module ("exports") style'; - -},{"../suite":36,"../test":37}],11:[function(require,module,exports){ -'use strict'; - -exports.bdd = require('./bdd'); -exports.tdd = require('./tdd'); -exports.qunit = require('./qunit'); -exports.exports = require('./exports'); - -},{"./bdd":8,"./exports":10,"./qunit":12,"./tdd":13}],12:[function(require,module,exports){ -'use strict'; - -var Test = require('../test'); -var EVENT_FILE_PRE_REQUIRE = require('../suite').constants - .EVENT_FILE_PRE_REQUIRE; - -/** - * QUnit-style interface: - * - * suite('Array'); - * - * test('#length', function() { - * var arr = [1,2,3]; - * ok(arr.length == 3); - * }); - * - * test('#indexOf()', function() { - * var arr = [1,2,3]; - * ok(arr.indexOf(1) == 0); - * ok(arr.indexOf(2) == 1); - * ok(arr.indexOf(3) == 2); - * }); - * - * suite('String'); - * - * test('#length', function() { - * ok('foo'.length == 3); - * }); - * - * @param {Suite} suite Root suite. - */ -module.exports = function qUnitInterface(suite) { - var suites = [suite]; - - suite.on(EVENT_FILE_PRE_REQUIRE, function(context, file, mocha) { - var common = require('./common')(suites, context, mocha); - - context.before = common.before; - context.after = common.after; - context.beforeEach = common.beforeEach; - context.afterEach = common.afterEach; - context.run = mocha.options.delay && common.runWithSuite(suite); - /** - * Describe a "suite" with the given `title`. - */ - - context.suite = function(title) { - if (suites.length > 1) { - suites.shift(); - } - return common.suite.create({ - title: title, - file: file, - fn: false - }); - }; - - /** - * Exclusive Suite. - */ - - context.suite.only = function(title) { - if (suites.length > 1) { - suites.shift(); - } - return common.suite.only({ - title: title, - file: file, - fn: false - }); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn) { - var test = new Test(title, fn); - test.file = file; - suites[0].addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.test.only = function(title, fn) { - return common.test.only(mocha, context.test(title, fn)); - }; - - context.test.skip = common.test.skip; - context.test.retries = common.test.retries; - }); -}; - -module.exports.description = 'QUnit style'; - -},{"../suite":36,"../test":37,"./common":9}],13:[function(require,module,exports){ -'use strict'; - -var Test = require('../test'); -var EVENT_FILE_PRE_REQUIRE = require('../suite').constants - .EVENT_FILE_PRE_REQUIRE; - -/** - * TDD-style interface: - * - * suite('Array', function() { - * suite('#indexOf()', function() { - * suiteSetup(function() { - * - * }); - * - * test('should return -1 when not present', function() { - * - * }); - * - * test('should return the index when present', function() { - * - * }); - * - * suiteTeardown(function() { - * - * }); - * }); - * }); - * - * @param {Suite} suite Root suite. - */ -module.exports = function(suite) { - var suites = [suite]; - - suite.on(EVENT_FILE_PRE_REQUIRE, function(context, file, mocha) { - var common = require('./common')(suites, context, mocha); - - context.setup = common.beforeEach; - context.teardown = common.afterEach; - context.suiteSetup = common.before; - context.suiteTeardown = common.after; - context.run = mocha.options.delay && common.runWithSuite(suite); - - /** - * Describe a "suite" with the given `title` and callback `fn` containing - * nested suites and/or tests. - */ - context.suite = function(title, fn) { - return common.suite.create({ - title: title, - file: file, - fn: fn - }); - }; - - /** - * Pending suite. - */ - context.suite.skip = function(title, fn) { - return common.suite.skip({ - title: title, - file: file, - fn: fn - }); - }; - - /** - * Exclusive test-case. - */ - context.suite.only = function(title, fn) { - return common.suite.only({ - title: title, - file: file, - fn: fn - }); - }; - - /** - * Describe a specification or test-case with the given `title` and - * callback `fn` acting as a thunk. - */ - context.test = function(title, fn) { - var suite = suites[0]; - if (suite.isPending()) { - fn = null; - } - var test = new Test(title, fn); - test.file = file; - suite.addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.test.only = function(title, fn) { - return common.test.only(mocha, context.test(title, fn)); - }; - - context.test.skip = common.test.skip; - context.test.retries = common.test.retries; - }); -}; - -module.exports.description = - 'traditional "suite"/"test" instead of BDD\'s "describe"/"it"'; - -},{"../suite":36,"../test":37,"./common":9}],14:[function(require,module,exports){ -(function (process,global){ -'use strict'; - -/*! - * mocha - * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca> - * MIT Licensed - */ - -var escapeRe = require('escape-string-regexp'); -var path = require('path'); -var builtinReporters = require('./reporters'); -var growl = require('./growl'); -var utils = require('./utils'); -var mocharc = require('./mocharc.json'); -var errors = require('./errors'); -var Suite = require('./suite'); -var createStatsCollector = require('./stats-collector'); -var createInvalidReporterError = errors.createInvalidReporterError; -var createInvalidInterfaceError = errors.createInvalidInterfaceError; -var EVENT_FILE_PRE_REQUIRE = Suite.constants.EVENT_FILE_PRE_REQUIRE; -var EVENT_FILE_POST_REQUIRE = Suite.constants.EVENT_FILE_POST_REQUIRE; -var EVENT_FILE_REQUIRE = Suite.constants.EVENT_FILE_REQUIRE; -var sQuote = utils.sQuote; - -exports = module.exports = Mocha; - -/** - * To require local UIs and reporters when running in node. - */ - -if (!process.browser) { - var cwd = process.cwd(); - module.paths.push(cwd, path.join(cwd, 'node_modules')); -} - -/** - * Expose internals. - */ - -/** - * @public - * @class utils - * @memberof Mocha - */ -exports.utils = utils; -exports.interfaces = require('./interfaces'); -/** - * @public - * @memberof Mocha - */ -exports.reporters = builtinReporters; -exports.Runnable = require('./runnable'); -exports.Context = require('./context'); -/** - * - * @memberof Mocha - */ -exports.Runner = require('./runner'); -exports.Suite = Suite; -exports.Hook = require('./hook'); -exports.Test = require('./test'); - -/** - * Constructs a new Mocha instance with `options`. - * - * @public - * @class Mocha - * @param {Object} [options] - Settings object. - * @param {boolean} [options.allowUncaught] - Propagate uncaught errors? - * @param {boolean} [options.asyncOnly] - Force `done` callback or promise? - * @param {boolean} [options.bail] - Bail after first test failure? - * @param {boolean} [options.checkLeaks] - If true, check leaks. - * @param {boolean} [options.delay] - Delay root suite execution? - * @param {boolean} [options.enableTimeouts] - Enable timeouts? - * @param {string} [options.fgrep] - Test filter given string. - * @param {boolean} [options.forbidOnly] - Tests marked `only` fail the suite? - * @param {boolean} [options.forbidPending] - Pending tests fail the suite? - * @param {boolean} [options.fullStackTrace] - Full stacktrace upon failure? - * @param {string[]} [options.global] - Variables expected in global scope. - * @param {RegExp|string} [options.grep] - Test filter given regular expression. - * @param {boolean} [options.growl] - Enable desktop notifications? - * @param {boolean} [options.hideDiff] - Suppress diffs from failures? - * @param {boolean} [options.ignoreLeaks] - Ignore global leaks? - * @param {boolean} [options.invert] - Invert test filter matches? - * @param {boolean} [options.noHighlighting] - Disable syntax highlighting? - * @param {string} [options.reporter] - Reporter name. - * @param {Object} [options.reporterOption] - Reporter settings object. - * @param {number} [options.retries] - Number of times to retry failed tests. - * @param {number} [options.slow] - Slow threshold value. - * @param {number|string} [options.timeout] - Timeout threshold value. - * @param {string} [options.ui] - Interface name. - * @param {boolean} [options.color] - Color TTY output from reporter? - * @param {boolean} [options.useInlineDiffs] - Use inline diffs? - */ -function Mocha(options) { - options = utils.assign({}, mocharc, options || {}); - this.files = []; - this.options = options; - // root suite - this.suite = new exports.Suite('', new exports.Context(), true); - - if ('useColors' in options) { - utils.deprecate( - 'useColors is DEPRECATED and will be removed from a future version of Mocha. Instead, use the "color" option' - ); - options.color = 'color' in options ? options.color : options.useColors; - } - - this.grep(options.grep) - .fgrep(options.fgrep) - .ui(options.ui) - .bail(options.bail) - .reporter(options.reporter, options.reporterOptions) - .useColors(options.color) - .slow(options.slow) - .useInlineDiffs(options.inlineDiffs) - .globals(options.globals); - - if ('enableTimeouts' in options) { - utils.deprecate( - 'enableTimeouts is DEPRECATED and will be removed from a future version of Mocha. Instead, use "timeout: false" to disable timeouts.' - ); - if (options.enableTimeouts === false) { - this.timeout(0); - } - } - - // this guard exists because Suite#timeout does not consider `undefined` to be valid input - if (typeof options.timeout !== 'undefined') { - this.timeout(options.timeout === false ? 0 : options.timeout); - } - - if ('retries' in options) { - this.retries(options.retries); - } - - if ('diff' in options) { - this.hideDiff(!options.diff); - } - - [ - 'allowUncaught', - 'asyncOnly', - 'checkLeaks', - 'delay', - 'forbidOnly', - 'forbidPending', - 'fullTrace', - 'growl', - 'invert' - ].forEach(function(opt) { - if (options[opt]) { - this[opt](); - } - }, this); -} - -/** - * Enables or disables bailing on the first failure. - * - * @public - * @see {@link https://mochajs.org/#-b---bail|CLI option} - * @param {boolean} [bail=true] - Whether to bail on first error. - * @returns {Mocha} this - * @chainable - */ -Mocha.prototype.bail = function(bail) { - if (!arguments.length) { - bail = true; - } - this.suite.bail(bail); - return this; -}; - -/** - * @summary - * Adds `file` to be loaded for execution. - * - * @description - * Useful for generic setup code that must be included within test suite. - * - * @public - * @see {@link https://mochajs.org/#--file-file|CLI option} - * @param {string} file - Pathname of file to be loaded. - * @returns {Mocha} this - * @chainable - */ -Mocha.prototype.addFile = function(file) { - this.files.push(file); - return this; -}; - -/** - * Sets reporter to `reporter`, defaults to "spec". - * - * @public - * @see {@link https://mochajs.org/#-r---reporter-name|CLI option} - * @see {@link https://mochajs.org/#reporters|Reporters} - * @param {String|Function} reporter - Reporter name or constructor. - * @param {Object} [reporterOptions] - Options used to configure the reporter. - * @returns {Mocha} this - * @chainable - * @throws {Error} if requested reporter cannot be loaded - * @example - * - * // Use XUnit reporter and direct its output to file - * mocha.reporter('xunit', { output: '/path/to/testspec.xunit.xml' }); - */ -Mocha.prototype.reporter = function(reporter, reporterOptions) { - if (typeof reporter === 'function') { - this._reporter = reporter; - } else { - reporter = reporter || 'spec'; - var _reporter; - // Try to load a built-in reporter. - if (builtinReporters[reporter]) { - _reporter = builtinReporters[reporter]; - } - // Try to load reporters from process.cwd() and node_modules - if (!_reporter) { try { - _reporter = require(reporter); - } catch (err) { - if ( - err.code !== 'MODULE_NOT_FOUND' || - err.message.indexOf('Cannot find module') !== -1 - ) { - // Try to load reporters from a path (absolute or relative) + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout$1(fun, 0); + } catch(e){ try { - _reporter = require(path.resolve(process.cwd(), reporter)); - } catch (_err) { - _err.code !== 'MODULE_NOT_FOUND' || - _err.message.indexOf('Cannot find module') !== -1 - ? console.warn(sQuote(reporter) + ' reporter not found') - : console.warn( - sQuote(reporter) + - ' reporter blew up with error:\n' + - err.stack - ); + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout$1.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout$1.call(this, fun, 0); } - } else { - console.warn( - sQuote(reporter) + ' reporter blew up with error:\n' + err.stack - ); - } } - } - if (!_reporter) { - throw createInvalidReporterError( - 'invalid reporter ' + sQuote(reporter), - reporter - ); - } - this._reporter = _reporter; - } - this.options.reporterOptions = reporterOptions; - return this; -}; -/** - * Sets test UI `name`, defaults to "bdd". - * - * @public - * @see {@link https://mochajs.org/#-u---ui-name|CLI option} - * @see {@link https://mochajs.org/#interfaces|Interface DSLs} - * @param {string|Function} [ui=bdd] - Interface name or class. - * @returns {Mocha} this - * @chainable - * @throws {Error} if requested interface cannot be loaded - */ -Mocha.prototype.ui = function(ui) { - var bindInterface; - if (typeof ui === 'function') { - bindInterface = ui; - } else { - ui = ui || 'bdd'; - bindInterface = exports.interfaces[ui]; - if (!bindInterface) { + + } + function runClearTimeout$1(marker) { + if (cachedClearTimeout$1 === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout$1 === defaultClearTimeout$1 || !cachedClearTimeout$1) && clearTimeout) { + cachedClearTimeout$1 = clearTimeout; + return clearTimeout(marker); + } try { - bindInterface = require(ui); - } catch (err) { - throw createInvalidInterfaceError( - 'invalid interface ' + sQuote(ui), - ui - ); + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout$1(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout$1.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout$1.call(this, marker); + } } - } + + + } - bindInterface(this.suite); + var queue$1 = []; + var draining$1 = false; + var currentQueue$1; + var queueIndex$1 = -1; - this.suite.on(EVENT_FILE_PRE_REQUIRE, function(context) { - exports.afterEach = context.afterEach || context.teardown; - exports.after = context.after || context.suiteTeardown; - exports.beforeEach = context.beforeEach || context.setup; - exports.before = context.before || context.suiteSetup; - exports.describe = context.describe || context.suite; - exports.it = context.it || context.test; - exports.xit = context.xit || (context.test && context.test.skip); - exports.setup = context.setup || context.beforeEach; - exports.suiteSetup = context.suiteSetup || context.before; - exports.suiteTeardown = context.suiteTeardown || context.after; - exports.suite = context.suite || context.describe; - exports.teardown = context.teardown || context.afterEach; - exports.test = context.test || context.it; - exports.run = context.run; - }); - - return this; -}; - -/** - * Loads `files` prior to execution. - * - * @description - * The implementation relies on Node's `require` to execute - * the test interface functions and will be subject to its cache. - * - * @private - * @see {@link Mocha#addFile} - * @see {@link Mocha#run} - * @see {@link Mocha#unloadFiles} - * @param {Function} [fn] - Callback invoked upon completion. - */ -Mocha.prototype.loadFiles = function(fn) { - var self = this; - var suite = this.suite; - this.files.forEach(function(file) { - file = path.resolve(file); - suite.emit(EVENT_FILE_PRE_REQUIRE, global, file, self); - suite.emit(EVENT_FILE_REQUIRE, require(file), file, self); - suite.emit(EVENT_FILE_POST_REQUIRE, global, file, self); - }); - fn && fn(); -}; - -/** - * Removes a previously loaded file from Node's `require` cache. - * - * @private - * @static - * @see {@link Mocha#unloadFiles} - * @param {string} file - Pathname of file to be unloaded. - */ -Mocha.unloadFile = function(file) { - delete require.cache[require.resolve(file)]; -}; - -/** - * Unloads `files` from Node's `require` cache. - * - * @description - * This allows files to be "freshly" reloaded, providing the ability - * to reuse a Mocha instance programmatically. - * - * <strong>Intended for consumers — not used internally</strong> - * - * @public - * @see {@link Mocha.unloadFile} - * @see {@link Mocha#loadFiles} - * @see {@link Mocha#run} - * @returns {Mocha} this - * @chainable - */ -Mocha.prototype.unloadFiles = function() { - this.files.forEach(Mocha.unloadFile); - return this; -}; - -/** - * Sets `grep` filter after escaping RegExp special characters. - * - * @public - * @see {@link Mocha#grep} - * @param {string} str - Value to be converted to a regexp. - * @returns {Mocha} this - * @chainable - * @example - * - * // Select tests whose full title begins with `"foo"` followed by a period - * mocha.fgrep('foo.'); - */ -Mocha.prototype.fgrep = function(str) { - if (!str) { - return this; - } - return this.grep(new RegExp(escapeRe(str))); -}; - -/** - * @summary - * Sets `grep` filter used to select specific tests for execution. - * - * @description - * If `re` is a regexp-like string, it will be converted to regexp. - * The regexp is tested against the full title of each test (i.e., the - * name of the test preceded by titles of each its ancestral suites). - * As such, using an <em>exact-match</em> fixed pattern against the - * test name itself will not yield any matches. - * <br> - * <strong>Previous filter value will be overwritten on each call!</strong> - * - * @public - * @see {@link https://mochajs.org/#-g---grep-pattern|CLI option} - * @see {@link Mocha#fgrep} - * @see {@link Mocha#invert} - * @param {RegExp|String} re - Regular expression used to select tests. - * @return {Mocha} this - * @chainable - * @example - * - * // Select tests whose full title contains `"match"`, ignoring case - * mocha.grep(/match/i); - * @example - * - * // Same as above but with regexp-like string argument - * mocha.grep('/match/i'); - * @example - * - * // ## Anti-example - * // Given embedded test `it('only-this-test')`... - * mocha.grep('/^only-this-test$/'); // NO! Use `.only()` to do this! - */ -Mocha.prototype.grep = function(re) { - if (utils.isString(re)) { - // extract args if it's regex-like, i.e: [string, pattern, flag] - var arg = re.match(/^\/(.*)\/(g|i|)$|.*/); - this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); - } else { - this.options.grep = re; - } - return this; -}; - -/** - * Inverts `grep` matches. - * - * @public - * @see {@link Mocha#grep} - * @return {Mocha} this - * @chainable - * @example - * - * // Select tests whose full title does *not* contain `"match"`, ignoring case - * mocha.grep(/match/i).invert(); - */ -Mocha.prototype.invert = function() { - this.options.invert = true; - return this; -}; - -/** - * Enables or disables ignoring global leaks. - * - * @public - * @see {@link Mocha#checkLeaks} - * @param {boolean} ignoreLeaks - Whether to ignore global leaks. - * @return {Mocha} this - * @chainable - * @example - * - * // Ignore global leaks - * mocha.ignoreLeaks(true); - */ -Mocha.prototype.ignoreLeaks = function(ignoreLeaks) { - this.options.ignoreLeaks = Boolean(ignoreLeaks); - return this; -}; - -/** - * Enables checking for global variables leaked while running tests. - * - * @public - * @see {@link https://mochajs.org/#--check-leaks|CLI option} - * @see {@link Mocha#ignoreLeaks} - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.checkLeaks = function() { - this.options.ignoreLeaks = false; - return this; -}; - -/** - * Displays full stack trace upon test failure. - * - * @public - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.fullTrace = function() { - this.options.fullStackTrace = true; - return this; -}; - -/** - * Enables desktop notification support if prerequisite software installed. - * - * @public - * @see {@link Mocha#isGrowlCapable} - * @see {@link Mocha#_growl} - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.growl = function() { - this.options.growl = this.isGrowlCapable(); - if (!this.options.growl) { - var detail = process.browser - ? 'notification support not available in this browser...' - : 'notification support prerequisites not installed...'; - console.error(detail + ' cannot enable!'); - } - return this; -}; - -/** - * @summary - * Determines if Growl support seems likely. - * - * @description - * <strong>Not available when run in browser.</strong> - * - * @private - * @see {@link Growl#isCapable} - * @see {@link Mocha#growl} - * @return {boolean} whether Growl support can be expected - */ -Mocha.prototype.isGrowlCapable = growl.isCapable; - -/** - * Implements desktop notifications using a pseudo-reporter. - * - * @private - * @see {@link Mocha#growl} - * @see {@link Growl#notify} - * @param {Runner} runner - Runner instance. - */ -Mocha.prototype._growl = growl.notify; - -/** - * Specifies whitelist of variable names to be expected in global scope. - * - * @public - * @see {@link https://mochajs.org/#--globals-names|CLI option} - * @see {@link Mocha#checkLeaks} - * @param {String[]|String} globals - Accepted global variable name(s). - * @return {Mocha} this - * @chainable - * @example - * - * // Specify variables to be expected in global scope - * mocha.globals(['jQuery', 'MyLib']); - */ -Mocha.prototype.globals = function(globals) { - this.options.globals = (this.options.globals || []) - .concat(globals) - .filter(Boolean); - return this; -}; - -/** - * Enables or disables TTY color output by screen-oriented reporters. - * - * @public - * @param {boolean} colors - Whether to enable color output. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.useColors = function(colors) { - if (colors !== undefined) { - this.options.useColors = colors; - } - return this; -}; - -/** - * Determines if reporter should use inline diffs (rather than +/-) - * in test failure output. - * - * @public - * @param {boolean} inlineDiffs - Whether to use inline diffs. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.useInlineDiffs = function(inlineDiffs) { - this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; - return this; -}; - -/** - * Determines if reporter should include diffs in test failure output. - * - * @public - * @param {boolean} hideDiff - Whether to hide diffs. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.hideDiff = function(hideDiff) { - this.options.hideDiff = hideDiff !== undefined && hideDiff; - return this; -}; - -/** - * @summary - * Sets timeout threshold value. - * - * @description - * A string argument can use shorthand (such as "2s") and will be converted. - * If the value is `0`, timeouts will be disabled. - * - * @public - * @see {@link https://mochajs.org/#-t---timeout-ms|CLI option} - * @see {@link https://mochajs.org/#--no-timeouts|CLI option} - * @see {@link https://mochajs.org/#timeouts|Timeouts} - * @see {@link Mocha#enableTimeouts} - * @param {number|string} msecs - Timeout threshold value. - * @return {Mocha} this - * @chainable - * @example - * - * // Sets timeout to one second - * mocha.timeout(1000); - * @example - * - * // Same as above but using string argument - * mocha.timeout('1s'); - */ -Mocha.prototype.timeout = function(msecs) { - this.suite.timeout(msecs); - return this; -}; - -/** - * Sets the number of times to retry failed tests. - * - * @public - * @see {@link https://mochajs.org/#retry-tests|Retry Tests} - * @param {number} retry - Number of times to retry failed tests. - * @return {Mocha} this - * @chainable - * @example - * - * // Allow any failed test to retry one more time - * mocha.retries(1); - */ -Mocha.prototype.retries = function(n) { - this.suite.retries(n); - return this; -}; - -/** - * Sets slowness threshold value. - * - * @public - * @see {@link https://mochajs.org/#-s---slow-ms|CLI option} - * @param {number} msecs - Slowness threshold value. - * @return {Mocha} this - * @chainable - * @example - * - * // Sets "slow" threshold to half a second - * mocha.slow(500); - * @example - * - * // Same as above but using string argument - * mocha.slow('0.5s'); - */ -Mocha.prototype.slow = function(msecs) { - this.suite.slow(msecs); - return this; -}; - -/** - * Enables or disables timeouts. - * - * @public - * @see {@link https://mochajs.org/#-t---timeout-ms|CLI option} - * @see {@link https://mochajs.org/#--no-timeouts|CLI option} - * @param {boolean} enableTimeouts - Whether to enable timeouts. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.enableTimeouts = function(enableTimeouts) { - this.suite.enableTimeouts( - arguments.length && enableTimeouts !== undefined ? enableTimeouts : true - ); - return this; -}; - -/** - * Forces all tests to either accept a `done` callback or return a promise. - * - * @public - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.asyncOnly = function() { - this.options.asyncOnly = true; - return this; -}; - -/** - * Disables syntax highlighting (in browser). - * - * @public - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.noHighlighting = function() { - this.options.noHighlighting = true; - return this; -}; - -/** - * Enables uncaught errors to propagate (in browser). - * - * @public - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.allowUncaught = function() { - this.options.allowUncaught = true; - return this; -}; - -/** - * @summary - * Delays root suite execution. - * - * @description - * Used to perform asynch operations before any suites are run. - * - * @public - * @see {@link https://mochajs.org/#delayed-root-suite|delayed root suite} - * @returns {Mocha} this - * @chainable - */ -Mocha.prototype.delay = function delay() { - this.options.delay = true; - return this; -}; - -/** - * Causes tests marked `only` to fail the suite. - * - * @public - * @returns {Mocha} this - * @chainable - */ -Mocha.prototype.forbidOnly = function() { - this.options.forbidOnly = true; - return this; -}; - -/** - * Causes pending tests and tests marked `skip` to fail the suite. - * - * @public - * @returns {Mocha} this - * @chainable - */ -Mocha.prototype.forbidPending = function() { - this.options.forbidPending = true; - return this; -}; - -/** - * Mocha version as specified by "package.json". - * - * @name Mocha#version - * @type string - * @readonly - */ -Object.defineProperty(Mocha.prototype, 'version', { - value: require('../package.json').version, - configurable: false, - enumerable: true, - writable: false -}); - -/** - * Callback to be invoked when test execution is complete. - * - * @callback DoneCB - * @param {number} failures - Number of failures that occurred. - */ - -/** - * Runs root suite and invokes `fn()` when complete. - * - * @description - * To run tests multiple times (or to run tests in files that are - * already in the `require` cache), make sure to clear them from - * the cache first! - * - * @public - * @see {@link Mocha#loadFiles} - * @see {@link Mocha#unloadFiles} - * @see {@link Runner#run} - * @param {DoneCB} [fn] - Callback invoked when test execution completed. - * @return {Runner} runner instance - */ -Mocha.prototype.run = function(fn) { - if (this.files.length) { - this.loadFiles(); - } - var suite = this.suite; - var options = this.options; - options.files = this.files; - var runner = new exports.Runner(suite, options.delay); - createStatsCollector(runner); - var reporter = new this._reporter(runner, options); - runner.ignoreLeaks = options.ignoreLeaks !== false; - runner.fullStackTrace = options.fullStackTrace; - runner.asyncOnly = options.asyncOnly; - runner.allowUncaught = options.allowUncaught; - runner.forbidOnly = options.forbidOnly; - runner.forbidPending = options.forbidPending; - if (options.grep) { - runner.grep(options.grep, options.invert); - } - if (options.globals) { - runner.globals(options.globals); - } - if (options.growl) { - this._growl(runner); - } - if (options.useColors !== undefined) { - exports.reporters.Base.useColors = options.useColors; - } - exports.reporters.Base.inlineDiffs = options.useInlineDiffs; - exports.reporters.Base.hideDiff = options.hideDiff; - - function done(failures) { - fn = fn || utils.noop; - if (reporter.done) { - reporter.done(failures, fn); - } else { - fn(failures); - } - } - - return runner.run(done); -}; - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../package.json":90,"./context":5,"./errors":6,"./growl":2,"./hook":7,"./interfaces":11,"./mocharc.json":15,"./reporters":21,"./runnable":33,"./runner":34,"./stats-collector":35,"./suite":36,"./test":37,"./utils":38,"_process":69,"escape-string-regexp":49,"path":42}],15:[function(require,module,exports){ -module.exports={ - "diff": true, - "extension": ["js"], - "opts": "./test/mocha.opts", - "package": "./package.json", - "reporter": "spec", - "slow": 75, - "timeout": 2000, - "ui": "bdd" -} - -},{}],16:[function(require,module,exports){ -'use strict'; - -module.exports = Pending; - -/** - * Initialize a new `Pending` error with the given message. - * - * @param {string} message - */ -function Pending(message) { - this.message = message; -} - -},{}],17:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Base - */ -/** - * Module dependencies. - */ - -var tty = require('tty'); -var diff = require('diff'); -var milliseconds = require('ms'); -var utils = require('../utils'); -var supportsColor = process.browser ? null : require('supports-color'); -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; - -/** - * Expose `Base`. - */ - -exports = module.exports = Base; - -/** - * Check if both stdio streams are associated with a tty. - */ - -var isatty = tty.isatty(1) && tty.isatty(2); - -/** - * Enable coloring by default, except in the browser interface. - */ - -exports.useColors = - !process.browser && - (supportsColor.stdout || process.env.MOCHA_COLORS !== undefined); - -/** - * Inline diffs instead of +/- - */ - -exports.inlineDiffs = false; - -/** - * Default color map. - */ - -exports.colors = { - pass: 90, - fail: 31, - 'bright pass': 92, - 'bright fail': 91, - 'bright yellow': 93, - pending: 36, - suite: 0, - 'error title': 0, - 'error message': 31, - 'error stack': 90, - checkmark: 32, - fast: 90, - medium: 33, - slow: 31, - green: 32, - light: 90, - 'diff gutter': 90, - 'diff added': 32, - 'diff removed': 31 -}; - -/** - * Default symbol map. - */ - -exports.symbols = { - ok: '✓', - err: '✖', - dot: '․', - comma: ',', - bang: '!' -}; - -// With node.js on Windows: use symbols available in terminal default fonts -if (process.platform === 'win32') { - exports.symbols.ok = '\u221A'; - exports.symbols.err = '\u00D7'; - exports.symbols.dot = '.'; -} - -/** - * Color `str` with the given `type`, - * allowing colors to be disabled, - * as well as user-defined color - * schemes. - * - * @private - * @param {string} type - * @param {string} str - * @return {string} - */ -var color = (exports.color = function(type, str) { - if (!exports.useColors) { - return String(str); - } - return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; -}); - -/** - * Expose term window size, with some defaults for when stderr is not a tty. - */ - -exports.window = { - width: 75 -}; - -if (isatty) { - exports.window.width = process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1]; -} - -/** - * Expose some basic cursor interactions that are common among reporters. - */ - -exports.cursor = { - hide: function() { - isatty && process.stdout.write('\u001b[?25l'); - }, - - show: function() { - isatty && process.stdout.write('\u001b[?25h'); - }, - - deleteLine: function() { - isatty && process.stdout.write('\u001b[2K'); - }, - - beginningOfLine: function() { - isatty && process.stdout.write('\u001b[0G'); - }, - - CR: function() { - if (isatty) { - exports.cursor.deleteLine(); - exports.cursor.beginningOfLine(); - } else { - process.stdout.write('\r'); - } - } -}; - -function showDiff(err) { - return ( - err && - err.showDiff !== false && - sameType(err.actual, err.expected) && - err.expected !== undefined - ); -} - -function stringifyDiffObjs(err) { - if (!utils.isString(err.actual) || !utils.isString(err.expected)) { - err.actual = utils.stringify(err.actual); - err.expected = utils.stringify(err.expected); - } -} - -/** - * Returns a diff between 2 strings with coloured ANSI output. - * - * @description - * The diff will be either inline or unified dependent on the value - * of `Base.inlineDiff`. - * - * @param {string} actual - * @param {string} expected - * @return {string} Diff - */ -var generateDiff = (exports.generateDiff = function(actual, expected) { - return exports.inlineDiffs - ? inlineDiff(actual, expected) - : unifiedDiff(actual, expected); -}); - -/** - * Outputs the given `failures` as a list. - * - * @public - * @memberof Mocha.reporters.Base - * @variation 1 - * @param {Object[]} failures - Each is Test instance with corresponding - * Error property - */ -exports.list = function(failures) { - console.log(); - failures.forEach(function(test, i) { - // format - var fmt = - color('error title', ' %s) %s:\n') + - color('error message', ' %s') + - color('error stack', '\n%s\n'); - - // msg - var msg; - var err = test.err; - var message; - if (err.message && typeof err.message.toString === 'function') { - message = err.message + ''; - } else if (typeof err.inspect === 'function') { - message = err.inspect() + ''; - } else { - message = ''; - } - var stack = err.stack || message; - var index = message ? stack.indexOf(message) : -1; - - if (index === -1) { - msg = message; - } else { - index += message.length; - msg = stack.slice(0, index); - // remove msg from stack - stack = stack.slice(index + 1); - } - - // uncaught - if (err.uncaught) { - msg = 'Uncaught ' + msg; - } - // explicitly show diff - if (!exports.hideDiff && showDiff(err)) { - stringifyDiffObjs(err); - fmt = - color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); - var match = message.match(/^([^:]+): expected/); - msg = '\n ' + color('error message', match ? match[1] : msg); - - msg += generateDiff(err.actual, err.expected); - } - - // indent stack trace - stack = stack.replace(/^/gm, ' '); - - // indented test title - var testTitle = ''; - test.titlePath().forEach(function(str, index) { - if (index !== 0) { - testTitle += '\n '; + function cleanUpNextTick$1() { + if (!draining$1 || !currentQueue$1) { + return; } - for (var i = 0; i < index; i++) { - testTitle += ' '; - } - testTitle += str; - }); - - console.log(fmt, i + 1, testTitle, msg, stack); - }); -}; - -/** - * Constructs a new `Base` reporter instance. - * - * @description - * All other reporters generally inherit from this reporter. - * - * @public - * @class - * @memberof Mocha.reporters - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Base(runner, options) { - var failures = (this.failures = []); - - if (!runner) { - throw new TypeError('Missing runner argument'); - } - this.options = options || {}; - this.runner = runner; - this.stats = runner.stats; // assigned so Reporters keep a closer reference - - runner.on(EVENT_TEST_PASS, function(test) { - if (test.duration > test.slow()) { - test.speed = 'slow'; - } else if (test.duration > test.slow() / 2) { - test.speed = 'medium'; - } else { - test.speed = 'fast'; - } - }); - - runner.on(EVENT_TEST_FAIL, function(test, err) { - if (showDiff(err)) { - stringifyDiffObjs(err); - } - test.err = err; - failures.push(test); - }); -} - -/** - * Outputs common epilogue used by many of the bundled reporters. - * - * @public - * @memberof Mocha.reporters.Base - */ -Base.prototype.epilogue = function() { - var stats = this.stats; - var fmt; - - console.log(); - - // passes - fmt = - color('bright pass', ' ') + - color('green', ' %d passing') + - color('light', ' (%s)'); - - console.log(fmt, stats.passes || 0, milliseconds(stats.duration)); - - // pending - if (stats.pending) { - fmt = color('pending', ' ') + color('pending', ' %d pending'); - - console.log(fmt, stats.pending); - } - - // failures - if (stats.failures) { - fmt = color('fail', ' %d failing'); - - console.log(fmt, stats.failures); - - Base.list(this.failures); - console.log(); - } - - console.log(); -}; - -/** - * Pads the given `str` to `len`. - * - * @private - * @param {string} str - * @param {string} len - * @return {string} - */ -function pad(str, len) { - str = String(str); - return Array(len - str.length + 1).join(' ') + str; -} - -/** - * Returns inline diff between 2 strings with coloured ANSI output. - * - * @private - * @param {String} actual - * @param {String} expected - * @return {string} Diff - */ -function inlineDiff(actual, expected) { - var msg = errorDiff(actual, expected); - - // linenos - var lines = msg.split('\n'); - if (lines.length > 4) { - var width = String(lines.length).length; - msg = lines - .map(function(str, i) { - return pad(++i, width) + ' |' + ' ' + str; - }) - .join('\n'); - } - - // legend - msg = - '\n' + - color('diff removed', 'actual') + - ' ' + - color('diff added', 'expected') + - '\n\n' + - msg + - '\n'; - - // indent - msg = msg.replace(/^/gm, ' '); - return msg; -} - -/** - * Returns unified diff between two strings with coloured ANSI output. - * - * @private - * @param {String} actual - * @param {String} expected - * @return {string} The diff. - */ -function unifiedDiff(actual, expected) { - var indent = ' '; - function cleanUp(line) { - if (line[0] === '+') { - return indent + colorLines('diff added', line); - } - if (line[0] === '-') { - return indent + colorLines('diff removed', line); - } - if (line.match(/@@/)) { - return '--'; - } - if (line.match(/\\ No newline/)) { - return null; - } - return indent + line; - } - function notBlank(line) { - return typeof line !== 'undefined' && line !== null; - } - var msg = diff.createPatch('string', actual, expected); - var lines = msg.split('\n').splice(5); - return ( - '\n ' + - colorLines('diff added', '+ expected') + - ' ' + - colorLines('diff removed', '- actual') + - '\n\n' + - lines - .map(cleanUp) - .filter(notBlank) - .join('\n') - ); -} - -/** - * Returns character diff for `err`. - * - * @private - * @param {String} actual - * @param {String} expected - * @return {string} the diff - */ -function errorDiff(actual, expected) { - return diff - .diffWordsWithSpace(actual, expected) - .map(function(str) { - if (str.added) { - return colorLines('diff added', str.value); - } - if (str.removed) { - return colorLines('diff removed', str.value); - } - return str.value; - }) - .join(''); -} - -/** - * Colors lines for `str`, using the color `name`. - * - * @private - * @param {string} name - * @param {string} str - * @return {string} - */ -function colorLines(name, str) { - return str - .split('\n') - .map(function(str) { - return color(name, str); - }) - .join('\n'); -} - -/** - * Object#toString reference. - */ -var objToString = Object.prototype.toString; - -/** - * Checks that a / b have the same type. - * - * @private - * @param {Object} a - * @param {Object} b - * @return {boolean} - */ -function sameType(a, b) { - return objToString.call(a) === objToString.call(b); -} - -Base.abstract = true; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"_process":69,"diff":48,"ms":60,"supports-color":42,"tty":4}],18:[function(require,module,exports){ -'use strict'; -/** - * @module Doc - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var utils = require('../utils'); -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; -var EVENT_SUITE_END = constants.EVENT_SUITE_END; - -/** - * Expose `Doc`. - */ - -exports = module.exports = Doc; - -/** - * Constructs a new `Doc` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Doc(runner, options) { - Base.call(this, runner, options); - - var indents = 2; - - function indent() { - return Array(indents).join(' '); - } - - runner.on(EVENT_SUITE_BEGIN, function(suite) { - if (suite.root) { - return; - } - ++indents; - console.log('%s<section class="suite">', indent()); - ++indents; - console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title)); - console.log('%s<dl>', indent()); - }); - - runner.on(EVENT_SUITE_END, function(suite) { - if (suite.root) { - return; - } - console.log('%s</dl>', indent()); - --indents; - console.log('%s</section>', indent()); - --indents; - }); - - runner.on(EVENT_TEST_PASS, function(test) { - console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title)); - var code = utils.escape(utils.clean(test.body)); - console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code); - }); - - runner.on(EVENT_TEST_FAIL, function(test, err) { - console.log( - '%s <dt class="error">%s</dt>', - indent(), - utils.escape(test.title) - ); - var code = utils.escape(utils.clean(test.body)); - console.log( - '%s <dd class="error"><pre><code>%s</code></pre></dd>', - indent(), - code - ); - console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err)); - }); -} - -Doc.description = 'HTML documentation'; - -},{"../runner":34,"../utils":38,"./base":17}],19:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Dot - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var inherits = require('../utils').inherits; -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var EVENT_RUN_END = constants.EVENT_RUN_END; - -/** - * Expose `Dot`. - */ - -exports = module.exports = Dot; - -/** - * Constructs a new `Dot` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Dot(runner, options) { - Base.call(this, runner, options); - - var self = this; - var width = (Base.window.width * 0.75) | 0; - var n = -1; - - runner.on(EVENT_RUN_BEGIN, function() { - process.stdout.write('\n'); - }); - - runner.on(EVENT_TEST_PENDING, function() { - if (++n % width === 0) { - process.stdout.write('\n '); - } - process.stdout.write(Base.color('pending', Base.symbols.comma)); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - if (++n % width === 0) { - process.stdout.write('\n '); - } - if (test.speed === 'slow') { - process.stdout.write(Base.color('bright yellow', Base.symbols.dot)); - } else { - process.stdout.write(Base.color(test.speed, Base.symbols.dot)); - } - }); - - runner.on(EVENT_TEST_FAIL, function() { - if (++n % width === 0) { - process.stdout.write('\n '); - } - process.stdout.write(Base.color('fail', Base.symbols.bang)); - }); - - runner.once(EVENT_RUN_END, function() { - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(Dot, Base); - -Dot.description = 'dot matrix representation'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69}],20:[function(require,module,exports){ -(function (global){ -'use strict'; - -/* eslint-env browser */ -/** - * @module HTML - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var utils = require('../utils'); -var Progress = require('../browser/progress'); -var escapeRe = require('escape-string-regexp'); -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; -var EVENT_SUITE_END = constants.EVENT_SUITE_END; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var escape = utils.escape; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date; - -/** - * Expose `HTML`. - */ - -exports = module.exports = HTML; - -/** - * Stats template. - */ - -var statsTemplate = - '<ul id="mocha-stats">' + - '<li class="progress"><canvas width="40" height="40"></canvas></li>' + - '<li class="passes"><a href="javascript:void(0);">passes:</a> <em>0</em></li>' + - '<li class="failures"><a href="javascript:void(0);">failures:</a> <em>0</em></li>' + - '<li class="duration">duration: <em>0</em>s</li>' + - '</ul>'; - -var playIcon = '‣'; - -/** - * Constructs a new `HTML` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function HTML(runner, options) { - Base.call(this, runner, options); - - var self = this; - var stats = this.stats; - var stat = fragment(statsTemplate); - var items = stat.getElementsByTagName('li'); - var passes = items[1].getElementsByTagName('em')[0]; - var passesLink = items[1].getElementsByTagName('a')[0]; - var failures = items[2].getElementsByTagName('em')[0]; - var failuresLink = items[2].getElementsByTagName('a')[0]; - var duration = items[3].getElementsByTagName('em')[0]; - var canvas = stat.getElementsByTagName('canvas')[0]; - var report = fragment('<ul id="mocha-report"></ul>'); - var stack = [report]; - var progress; - var ctx; - var root = document.getElementById('mocha'); - - if (canvas.getContext) { - var ratio = window.devicePixelRatio || 1; - canvas.style.width = canvas.width; - canvas.style.height = canvas.height; - canvas.width *= ratio; - canvas.height *= ratio; - ctx = canvas.getContext('2d'); - ctx.scale(ratio, ratio); - progress = new Progress(); - } - - if (!root) { - return error('#mocha div missing, add it to your document'); - } - - // pass toggle - on(passesLink, 'click', function(evt) { - evt.preventDefault(); - unhide(); - var name = /pass/.test(report.className) ? '' : ' pass'; - report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) { - hideSuitesWithout('test pass'); - } - }); - - // failure toggle - on(failuresLink, 'click', function(evt) { - evt.preventDefault(); - unhide(); - var name = /fail/.test(report.className) ? '' : ' fail'; - report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) { - hideSuitesWithout('test fail'); - } - }); - - root.appendChild(stat); - root.appendChild(report); - - if (progress) { - progress.size(40); - } - - runner.on(EVENT_SUITE_BEGIN, function(suite) { - if (suite.root) { - return; - } - - // suite - var url = self.suiteURL(suite); - var el = fragment( - '<li class="suite"><h1><a href="%s">%s</a></h1></li>', - url, - escape(suite.title) - ); - - // container - stack[0].appendChild(el); - stack.unshift(document.createElement('ul')); - el.appendChild(stack[0]); - }); - - runner.on(EVENT_SUITE_END, function(suite) { - if (suite.root) { - updateStats(); - return; - } - stack.shift(); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - var url = self.testURL(test); - var markup = - '<li class="test pass %e"><h2>%e<span class="duration">%ems</span> ' + - '<a href="%s" class="replay">' + - playIcon + - '</a></h2></li>'; - var el = fragment(markup, test.speed, test.title, test.duration, url); - self.addCodeToggle(el, test.body); - appendToStack(el); - updateStats(); - }); - - runner.on(EVENT_TEST_FAIL, function(test) { - var el = fragment( - '<li class="test fail"><h2>%e <a href="%e" class="replay">' + - playIcon + - '</a></h2></li>', - test.title, - self.testURL(test) - ); - var stackString; // Note: Includes leading newline - var message = test.err.toString(); - - // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we - // check for the result of the stringifying. - if (message === '[object Error]') { - message = test.err.message; - } - - if (test.err.stack) { - var indexOfMessage = test.err.stack.indexOf(test.err.message); - if (indexOfMessage === -1) { - stackString = test.err.stack; + draining$1 = false; + if (currentQueue$1.length) { + queue$1 = currentQueue$1.concat(queue$1); } else { - stackString = test.err.stack.substr( - test.err.message.length + indexOfMessage - ); + queueIndex$1 = -1; } - } else if (test.err.sourceURL && test.err.line !== undefined) { - // Safari doesn't give you a stack. Let's at least provide a source line. - stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; + if (queue$1.length) { + drainQueue$1(); + } + } + + function drainQueue$1() { + if (draining$1) { + return; + } + var timeout = runTimeout$1(cleanUpNextTick$1); + draining$1 = true; + + var len = queue$1.length; + while(len) { + currentQueue$1 = queue$1; + queue$1 = []; + while (++queueIndex$1 < len) { + if (currentQueue$1) { + currentQueue$1[queueIndex$1].run(); + } + } + queueIndex$1 = -1; + len = queue$1.length; + } + currentQueue$1 = null; + draining$1 = false; + runClearTimeout$1(timeout); + } + function nextTick$1(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue$1.push(new Item$1(fun, args)); + if (queue$1.length === 1 && !draining$1) { + runTimeout$1(drainQueue$1); + } + } + // v8 likes predictible objects + function Item$1(fun, array) { + this.fun = fun; + this.array = array; + } + Item$1.prototype.run = function () { + this.fun.apply(null, this.array); + }; + var title$1 = 'browser'; + var platform$1 = 'browser'; + var browser$4 = true; + var env$1 = {}; + var argv$1 = []; + var version$2 = ''; // empty string to avoid regexp issues + var versions$1 = {}; + var release$1 = {}; + var config$1 = {}; + + function noop$1() {} + + var on$1 = noop$1; + var addListener$1 = noop$1; + var once$1 = noop$1; + var off$1 = noop$1; + var removeListener$1 = noop$1; + var removeAllListeners$1 = noop$1; + var emit$1 = noop$1; + + function binding$1(name) { + throw new Error('process.binding is not supported'); + } + + function cwd$1 () { return '/' } + function chdir$1 (dir) { + throw new Error('process.chdir is not supported'); + }function umask$1() { return 0; } + + // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + var performance$1 = global$1.performance || {}; + var performanceNow$1 = + performance$1.now || + performance$1.mozNow || + performance$1.msNow || + performance$1.oNow || + performance$1.webkitNow || + function(){ return (new Date()).getTime() }; + + // generate timestamp or delta + // see http://nodejs.org/api/process.html#process_process_hrtime + function hrtime$1(previousTimestamp){ + var clocktime = performanceNow$1.call(performance$1)*1e-3; + var seconds = Math.floor(clocktime); + var nanoseconds = Math.floor((clocktime%1)*1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds<0) { + seconds--; + nanoseconds += 1e9; + } + } + return [seconds,nanoseconds] + } + + var startTime$1 = new Date(); + function uptime$1() { + var currentTime = new Date(); + var dif = currentTime - startTime$1; + return dif / 1000; + } + + var process = { + nextTick: nextTick$1, + title: title$1, + browser: browser$4, + env: env$1, + argv: argv$1, + version: version$2, + versions: versions$1, + on: on$1, + addListener: addListener$1, + once: once$1, + off: off$1, + removeListener: removeListener$1, + removeAllListeners: removeAllListeners$1, + emit: emit$1, + binding: binding$1, + cwd: cwd$1, + chdir: chdir$1, + umask: umask$1, + hrtime: hrtime$1, + platform: platform$1, + release: release$1, + config: config$1, + uptime: uptime$1 + }; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function getAugmentedNamespace(n) { + if (n.__esModule) return n; + var a = Object.defineProperty({}, '__esModule', {value: true}); + Object.keys(n).forEach(function (k) { + var d = Object.getOwnPropertyDescriptor(n, k); + Object.defineProperty(a, k, d.get ? d : { + enumerable: true, + get: function () { + return n[k]; + } + }); + }); + return a; + } + + function commonjsRequire (path) { + throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); + } + + var domain; + + // This constructor is used to store event handlers. Instantiating this is + // faster than explicitly calling `Object.create(null)` to get a "clean" empty + // object (tested with v8 v4.9). + function EventHandlers() {} + EventHandlers.prototype = Object.create(null); + + function EventEmitter$2() { + EventEmitter$2.init.call(this); + } + + // nodejs oddity + // require('events') === require('events').EventEmitter + EventEmitter$2.EventEmitter = EventEmitter$2; + + EventEmitter$2.usingDomains = false; + + EventEmitter$2.prototype.domain = undefined; + EventEmitter$2.prototype._events = undefined; + EventEmitter$2.prototype._maxListeners = undefined; + + // By default EventEmitters will print a warning if more than 10 listeners are + // added to it. This is a useful default which helps finding memory leaks. + EventEmitter$2.defaultMaxListeners = 10; + + EventEmitter$2.init = function() { + this.domain = null; + if (EventEmitter$2.usingDomains) { + // if there is an active domain, then attach to it. + if (domain.active ) ; } - stackString = stackString || ''; + if (!this._events || this._events === Object.getPrototypeOf(this)._events) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } - if (test.err.htmlMessage && stackString) { - el.appendChild( - fragment( - '<div class="html-error">%s\n<pre class="error">%e</pre></div>', - test.err.htmlMessage, - stackString - ) - ); - } else if (test.err.htmlMessage) { - el.appendChild( - fragment('<div class="html-error">%s</div>', test.err.htmlMessage) - ); + this._maxListeners = this._maxListeners || undefined; + }; + + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + EventEmitter$2.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; + }; + + function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter$2.defaultMaxListeners; + return that._maxListeners; + } + + EventEmitter$2.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); + }; + + // These standalone emit* functions are used to optimize calling of event + // handlers for fast cases because emit() itself often has a variable number of + // arguments and can be deoptimized because of that. These functions always have + // the same number of arguments and thus do not get deoptimized, so the code + // inside them can execute faster. + function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } + } + function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } + } + function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } + } + function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } + } + + function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } + } + + EventEmitter$2.prototype.emit = function emit(type) { + var er, handler, len, args, i, events, domain; + var doError = (type === 'error'); + + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; + + domain = this.domain; + + // If there is no 'error' event listener then throw. + if (doError) { + er = arguments[1]; + if (domain) { + if (!er) + er = new Error('Uncaught, unspecified "error" event'); + er.domainEmitter = this; + er.domain = domain; + er.domainThrown = false; + domain.emit('error', er); + } else if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) + return false; + + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; + }; + + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = new EventHandlers(); + target._eventsCount = 0; } else { - el.appendChild( - fragment('<pre class="error">%e%e</pre>', message, stackString) - ); + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; } - self.addCodeToggle(el, test.body); - appendToStack(el); - updateStats(); - }); - - runner.on(EVENT_TEST_PENDING, function(test) { - var el = fragment( - '<li class="test pass pending"><h2>%e</h2></li>', - test.title - ); - appendToStack(el); - updateStats(); - }); - - function appendToStack(el) { - // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. - if (stack[0]) { - stack[0].appendChild(el); - } - } - - function updateStats() { - // TODO: add to stats - var percent = ((stats.tests / runner.total) * 100) | 0; - if (progress) { - progress.update(percent).draw(ctx); - } - - // update stats - var ms = new Date() - stats.start; - text(passes, stats.passes); - text(failures, stats.failures); - text(duration, (ms / 1000).toFixed(2)); - } -} - -/** - * Makes a URL, preserving querystring ("search") parameters. - * - * @param {string} s - * @return {string} A new URL. - */ -function makeUrl(s) { - var search = window.location.search; - - // Remove previous grep query parameter if present - if (search) { - search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); - } - - return ( - window.location.pathname + - (search ? search + '&' : '?') + - 'grep=' + - encodeURIComponent(escapeRe(s)) - ); -} - -/** - * Provide suite URL. - * - * @param {Object} [suite] - */ -HTML.prototype.suiteURL = function(suite) { - return makeUrl(suite.fullTitle()); -}; - -/** - * Provide test URL. - * - * @param {Object} [test] - */ -HTML.prototype.testURL = function(test) { - return makeUrl(test.fullTitle()); -}; - -/** - * Adds code toggle functionality for the provided test's list element. - * - * @param {HTMLLIElement} el - * @param {string} contents - */ -HTML.prototype.addCodeToggle = function(el, contents) { - var h2 = el.getElementsByTagName('h2')[0]; - - on(h2, 'click', function() { - pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; - }); - - var pre = fragment('<pre><code>%e</code></pre>', utils.clean(contents)); - el.appendChild(pre); - pre.style.display = 'none'; -}; - -/** - * Display error `msg`. - * - * @param {string} msg - */ -function error(msg) { - document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg)); -} - -/** - * Return a DOM fragment from `html`. - * - * @param {string} html - */ -function fragment(html) { - var args = arguments; - var div = document.createElement('div'); - var i = 1; - - div.innerHTML = html.replace(/%([se])/g, function(_, type) { - switch (type) { - case 's': - return String(args[i++]); - case 'e': - return escape(args[i++]); - // no default - } - }); - - return div.firstChild; -} - -/** - * Check for suites that do not have elements - * with `classname`, and hide them. - * - * @param {text} classname - */ -function hideSuitesWithout(classname) { - var suites = document.getElementsByClassName('suite'); - for (var i = 0; i < suites.length; i++) { - var els = suites[i].getElementsByClassName(classname); - if (!els.length) { - suites[i].className += ' hidden'; - } - } -} - -/** - * Unhide .hidden suites. - */ -function unhide() { - var els = document.getElementsByClassName('suite hidden'); - for (var i = 0; i < els.length; ++i) { - els[i].className = els[i].className.replace('suite hidden', 'suite'); - } -} - -/** - * Set an element's text contents. - * - * @param {HTMLElement} el - * @param {string} contents - */ -function text(el, contents) { - if (el.textContent) { - el.textContent = contents; - } else { - el.innerText = contents; - } -} - -/** - * Listen on `event` with callback `fn`. - */ -function on(el, event, fn) { - if (el.addEventListener) { - el.addEventListener(event, fn, false); - } else { - el.attachEvent('on' + event, fn); - } -} - -HTML.browserOnly = true; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":3,"../runner":34,"../utils":38,"./base":17,"escape-string-regexp":49}],21:[function(require,module,exports){ -'use strict'; - -// Alias exports to a their normalized format Mocha#reporter to prevent a need -// for dynamic (try/catch) requires, which Browserify doesn't handle. -exports.Base = exports.base = require('./base'); -exports.Dot = exports.dot = require('./dot'); -exports.Doc = exports.doc = require('./doc'); -exports.TAP = exports.tap = require('./tap'); -exports.JSON = exports.json = require('./json'); -exports.HTML = exports.html = require('./html'); -exports.List = exports.list = require('./list'); -exports.Min = exports.min = require('./min'); -exports.Spec = exports.spec = require('./spec'); -exports.Nyan = exports.nyan = require('./nyan'); -exports.XUnit = exports.xunit = require('./xunit'); -exports.Markdown = exports.markdown = require('./markdown'); -exports.Progress = exports.progress = require('./progress'); -exports.Landing = exports.landing = require('./landing'); -exports.JSONStream = exports['json-stream'] = require('./json-stream'); - -},{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module JSONStream - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_RUN_END = constants.EVENT_RUN_END; - -/** - * Expose `JSONStream`. - */ - -exports = module.exports = JSONStream; - -/** - * Constructs a new `JSONStream` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function JSONStream(runner, options) { - Base.call(this, runner, options); - - var self = this; - var total = runner.total; - - runner.once(EVENT_RUN_BEGIN, function() { - writeEvent(['start', {total: total}]); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - writeEvent(['pass', clean(test)]); - }); - - runner.on(EVENT_TEST_FAIL, function(test, err) { - test = clean(test); - test.err = err.message; - test.stack = err.stack || null; - writeEvent(['fail', test]); - }); - - runner.once(EVENT_RUN_END, function() { - writeEvent(['end', self.stats]); - }); -} - -/** - * Mocha event to be written to the output stream. - * @typedef {Array} JSONStream~MochaEvent - */ - -/** - * Writes Mocha event to reporter output stream. - * - * @private - * @param {JSONStream~MochaEvent} event - Mocha event to be output. - */ -function writeEvent(event) { - process.stdout.write(JSON.stringify(event) + '\n'); -} - -/** - * Returns an object literal representation of `test` - * free of cyclic properties, etc. - * - * @private - * @param {Test} test - Instance used as data source. - * @return {Object} object containing pared-down test instance data - */ -function clean(test) { - return { - title: test.title, - fullTitle: test.fullTitle(), - duration: test.duration, - currentRetry: test.currentRetry() - }; -} - -JSONStream.description = 'newline delimited JSON events'; - -}).call(this,require('_process')) -},{"../runner":34,"./base":17,"_process":69}],23:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module JSON - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_TEST_END = constants.EVENT_TEST_END; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; - -/** - * Expose `JSON`. - */ - -exports = module.exports = JSONReporter; - -/** - * Constructs a new `JSON` reporter instance. - * - * @public - * @class JSON - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function JSONReporter(runner, options) { - Base.call(this, runner, options); - - var self = this; - var tests = []; - var pending = []; - var failures = []; - var passes = []; - - runner.on(EVENT_TEST_END, function(test) { - tests.push(test); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - passes.push(test); - }); - - runner.on(EVENT_TEST_FAIL, function(test) { - failures.push(test); - }); - - runner.on(EVENT_TEST_PENDING, function(test) { - pending.push(test); - }); - - runner.once(EVENT_RUN_END, function() { - var obj = { - stats: self.stats, - tests: tests.map(clean), - pending: pending.map(clean), - failures: failures.map(clean), - passes: passes.map(clean) - }; - - runner.testResults = obj; - - process.stdout.write(JSON.stringify(obj, null, 2)); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @private - * @param {Object} test - * @return {Object} - */ -function clean(test) { - var err = test.err || {}; - if (err instanceof Error) { - err = errorJSON(err); - } - - return { - title: test.title, - fullTitle: test.fullTitle(), - duration: test.duration, - currentRetry: test.currentRetry(), - err: cleanCycles(err) - }; -} - -/** - * Replaces any circular references inside `obj` with '[object Object]' - * - * @private - * @param {Object} obj - * @return {Object} - */ -function cleanCycles(obj) { - var cache = []; - return JSON.parse( - JSON.stringify(obj, function(key, value) { - if (typeof value === 'object' && value !== null) { - if (cache.indexOf(value) !== -1) { - // Instead of going in a circle, we'll print [object Object] - return '' + value; + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : + [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); } - cache.push(value); } - return value; - }) - ); -} - -/** - * Transform an Error object into a JSON object. - * - * @private - * @param {Error} err - * @return {Object} - */ -function errorJSON(err) { - var res = {}; - Object.getOwnPropertyNames(err).forEach(function(key) { - res[key] = err[key]; - }, err); - return res; -} - -JSONReporter.description = 'single JSON object'; - -}).call(this,require('_process')) -},{"../runner":34,"./base":17,"_process":69}],24:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Landing - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var inherits = require('../utils').inherits; -var constants = require('../runner').constants; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_END = constants.EVENT_TEST_END; -var STATE_FAILED = require('../runnable').constants.STATE_FAILED; - -var cursor = Base.cursor; -var color = Base.color; - -/** - * Expose `Landing`. - */ - -exports = module.exports = Landing; - -/** - * Airplane color. - */ - -Base.colors.plane = 0; - -/** - * Airplane crash color. - */ - -Base.colors['plane crash'] = 31; - -/** - * Runway color. - */ - -Base.colors.runway = 90; - -/** - * Constructs a new `Landing` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Landing(runner, options) { - Base.call(this, runner, options); - - var self = this; - var width = (Base.window.width * 0.75) | 0; - var total = runner.total; - var stream = process.stdout; - var plane = color('plane', '✈'); - var crashed = -1; - var n = 0; - - function runway() { - var buf = Array(width).join('-'); - return ' ' + color('runway', buf); - } - - runner.on(EVENT_RUN_BEGIN, function() { - stream.write('\n\n\n '); - cursor.hide(); - }); - - runner.on(EVENT_TEST_END, function(test) { - // check if the plane crashed - var col = crashed === -1 ? ((width * ++n) / total) | 0 : crashed; - - // show the crash - if (test.state === STATE_FAILED) { - plane = color('plane crash', '✈'); - crashed = col; + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + type + ' listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + emitWarning$1(w); + } + } } - // render landing strip - stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); - stream.write(runway()); - stream.write('\n '); - stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane); - stream.write(color('runway', Array(width - col).join('⋅') + '\n')); - stream.write(runway()); - stream.write('\u001b[0m'); - }); + return target; + } + function emitWarning$1(e) { + typeof console.warn === 'function' ? console.warn(e) : console.log(e); + } + EventEmitter$2.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); + }; - runner.once(EVENT_RUN_END, function() { - cursor.show(); - console.log(); - self.epilogue(); - }); -} + EventEmitter$2.prototype.on = EventEmitter$2.prototype.addListener; -/** - * Inherit from `Base.prototype`. - */ -inherits(Landing, Base); + EventEmitter$2.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; -Landing.description = 'Unicode landing strip'; - -}).call(this,require('_process')) -},{"../runnable":33,"../runner":34,"../utils":38,"./base":17,"_process":69}],25:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module List - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var inherits = require('../utils').inherits; -var constants = require('../runner').constants; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_BEGIN = constants.EVENT_TEST_BEGIN; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var color = Base.color; -var cursor = Base.cursor; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Constructs a new `List` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function List(runner, options) { - Base.call(this, runner, options); - - var self = this; - var n = 0; - - runner.on(EVENT_RUN_BEGIN, function() { - console.log(); - }); - - runner.on(EVENT_TEST_BEGIN, function(test) { - process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); - }); - - runner.on(EVENT_TEST_PENDING, function(test) { - var fmt = color('checkmark', ' -') + color('pending', ' %s'); - console.log(fmt, test.fullTitle()); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - var fmt = - color('checkmark', ' ' + Base.symbols.ok) + - color('pass', ' %s: ') + - color(test.speed, '%dms'); - cursor.CR(); - console.log(fmt, test.fullTitle(), test.duration); - }); - - runner.on(EVENT_TEST_FAIL, function(test) { - cursor.CR(); - console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); - }); - - runner.once(EVENT_RUN_END, self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(List, Base); - -List.description = 'like "spec" reporter but flat'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69}],26:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Markdown - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var utils = require('../utils'); -var constants = require('../runner').constants; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; -var EVENT_SUITE_END = constants.EVENT_SUITE_END; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; - -/** - * Constants - */ - -var SUITE_PREFIX = '$'; - -/** - * Expose `Markdown`. - */ - -exports = module.exports = Markdown; - -/** - * Constructs a new `Markdown` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Markdown(runner, options) { - Base.call(this, runner, options); - - var level = 0; - var buf = ''; - - function title(str) { - return Array(level).join('#') + ' ' + str; + function _onceWrap(target, type, listener) { + var fired = false; + function g() { + target.removeListener(type, g); + if (!fired) { + fired = true; + listener.apply(target, arguments); + } + } + g.listener = listener; + return g; } - function mapTOC(suite, obj) { - var ret = obj; - var key = SUITE_PREFIX + suite.title; + EventEmitter$2.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; - obj = obj[key] = obj[key] || {suite: suite}; - suite.suites.forEach(function(suite) { - mapTOC(suite, obj); - }); + EventEmitter$2.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + // emits a 'removeListener' event iff the listener was removed + EventEmitter$2.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) + return this; + + list = events[type]; + if (!list) + return this; + + if (list === listener || (list.listener && list.listener === listener)) { + if (--this._eventsCount === 0) + this._events = new EventHandlers(); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list[0] = undefined; + if (--this._eventsCount === 0) { + this._events = new EventHandlers(); + return this; + } else { + delete events[type]; + } + } else { + spliceOne(list, position); + } + + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + + // Alias for removeListener added in NodeJS 10.0 + // https://nodejs.org/api/events.html#events_emitter_off_eventname_listener + EventEmitter$2.prototype.off = function(type, listener){ + return this.removeListener(type, listener); + }; + + EventEmitter$2.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events; + + events = this._events; + if (!events) + return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = new EventHandlers(); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + for (var i = 0, key; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = new EventHandlers(); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + do { + this.removeListener(type, listeners[listeners.length - 1]); + } while (listeners[0]); + } + + return this; + }; + + EventEmitter$2.prototype.listeners = function listeners(type) { + var evlistener; + var ret; + var events = this._events; + + if (!events) + ret = []; + else { + evlistener = events[type]; + if (!evlistener) + ret = []; + else if (typeof evlistener === 'function') + ret = [evlistener.listener || evlistener]; + else + ret = unwrapListeners(evlistener); + } + + return ret; + }; + + EventEmitter$2.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount$1.call(emitter, type); + } + }; + + EventEmitter$2.prototype.listenerCount = listenerCount$1; + function listenerCount$1(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; + } + + EventEmitter$2.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; + }; + + // About 1.5x faster than the two-arg version of Array#splice(). + function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); + } + + function arrayClone(arr, i) { + var copy = new Array(i); + while (i--) + copy[i] = arr[i]; + return copy; + } + + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } return ret; } - function stringifyTOC(obj, level) { - ++level; - var buf = ''; - var link; - for (var key in obj) { - if (key === 'suite') { - continue; - } - if (key !== SUITE_PREFIX) { - link = ' - [' + key.substring(1) + ']'; - link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; - buf += Array(level).join(' ') + link; - } - buf += stringifyTOC(obj[key], level); + var _polyfillNode_events = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': EventEmitter$2, + EventEmitter: EventEmitter$2 + }); + + var lookup$1 = []; + var revLookup$1 = []; + var Arr$1 = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; + var inited$1 = false; + function init$1 () { + inited$1 = true; + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for (var i = 0, len = code.length; i < len; ++i) { + lookup$1[i] = code[i]; + revLookup$1[code.charCodeAt(i)] = i; } - return buf; + + revLookup$1['-'.charCodeAt(0)] = 62; + revLookup$1['_'.charCodeAt(0)] = 63; } - function generateTOC(suite) { - var obj = mapTOC(suite, {}); - return stringifyTOC(obj, 0); - } - - generateTOC(runner.suite); - - runner.on(EVENT_SUITE_BEGIN, function(suite) { - ++level; - var slug = utils.slug(suite.fullTitle()); - buf += '<a name="' + slug + '"></a>' + '\n'; - buf += title(suite.title) + '\n'; - }); - - runner.on(EVENT_SUITE_END, function() { - --level; - }); - - runner.on(EVENT_TEST_PASS, function(test) { - var code = utils.clean(test.body); - buf += test.title + '.\n'; - buf += '\n```js\n'; - buf += code + '\n'; - buf += '```\n\n'; - }); - - runner.once(EVENT_RUN_END, function() { - process.stdout.write('# TOC\n'); - process.stdout.write(generateTOC(runner.suite)); - process.stdout.write(buf); - }); -} - -Markdown.description = 'GitHub Flavored Markdown'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69}],27:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Min - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var inherits = require('../utils').inherits; -var constants = require('../runner').constants; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; - -/** - * Expose `Min`. - */ - -exports = module.exports = Min; - -/** - * Constructs a new `Min` reporter instance. - * - * @description - * This minimal test reporter is best used with '--watch'. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Min(runner, options) { - Base.call(this, runner, options); - - runner.on(EVENT_RUN_BEGIN, function() { - // clear screen - process.stdout.write('\u001b[2J'); - // set cursor position - process.stdout.write('\u001b[1;3H'); - }); - - runner.once(EVENT_RUN_END, this.epilogue.bind(this)); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(Min, Base); - -Min.description = 'essentially just a summary'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69}],28:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Nyan - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var constants = require('../runner').constants; -var inherits = require('../utils').inherits; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; - -/** - * Expose `Dot`. - */ - -exports = module.exports = NyanCat; - -/** - * Constructs a new `Nyan` reporter instance. - * - * @public - * @class Nyan - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function NyanCat(runner, options) { - Base.call(this, runner, options); - - var self = this; - var width = (Base.window.width * 0.75) | 0; - var nyanCatWidth = (this.nyanCatWidth = 11); - - this.colorIndex = 0; - this.numberOfLines = 4; - this.rainbowColors = self.generateColors(); - this.scoreboardWidth = 5; - this.tick = 0; - this.trajectories = [[], [], [], []]; - this.trajectoryWidthMax = width - nyanCatWidth; - - runner.on(EVENT_RUN_BEGIN, function() { - Base.cursor.hide(); - self.draw(); - }); - - runner.on(EVENT_TEST_PENDING, function() { - self.draw(); - }); - - runner.on(EVENT_TEST_PASS, function() { - self.draw(); - }); - - runner.on(EVENT_TEST_FAIL, function() { - self.draw(); - }); - - runner.once(EVENT_RUN_END, function() { - Base.cursor.show(); - for (var i = 0; i < self.numberOfLines; i++) { - write('\n'); + function toByteArray$1 (b64) { + if (!inited$1) { + init$1(); } - self.epilogue(); - }); -} + var i, j, l, tmp, placeHolders, arr; + var len = b64.length; -/** - * Inherit from `Base.prototype`. - */ -inherits(NyanCat, Base); - -/** - * Draw the nyan cat - * - * @private - */ - -NyanCat.prototype.draw = function() { - this.appendRainbow(); - this.drawScoreboard(); - this.drawRainbow(); - this.drawNyanCat(); - this.tick = !this.tick; -}; - -/** - * Draw the "scoreboard" showing the number - * of passes, failures and pending tests. - * - * @private - */ - -NyanCat.prototype.drawScoreboard = function() { - var stats = this.stats; - - function draw(type, n) { - write(' '); - write(Base.color(type, n)); - write('\n'); - } - - draw('green', stats.passes); - draw('fail', stats.failures); - draw('pending', stats.pending); - write('\n'); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Append the rainbow. - * - * @private - */ - -NyanCat.prototype.appendRainbow = function() { - var segment = this.tick ? '_' : '-'; - var rainbowified = this.rainbowify(segment); - - for (var index = 0; index < this.numberOfLines; index++) { - var trajectory = this.trajectories[index]; - if (trajectory.length >= this.trajectoryWidthMax) { - trajectory.shift(); + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') } - trajectory.push(rainbowified); - } -}; -/** - * Draw the rainbow. - * - * @private - */ + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; -NyanCat.prototype.drawRainbow = function() { - var self = this; + // base64 is 4/3 + up to two characters of the original data + arr = new Arr$1(len * 3 / 4 - placeHolders); - this.trajectories.forEach(function(line) { - write('\u001b[' + self.scoreboardWidth + 'C'); - write(line.join('')); - write('\n'); - }); + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len; - this.cursorUp(this.numberOfLines); -}; + var L = 0; -/** - * Draw the nyan cat - * - * @private - */ -NyanCat.prototype.drawNyanCat = function() { - var self = this; - var startWidth = this.scoreboardWidth + this.trajectories[0].length; - var dist = '\u001b[' + startWidth + 'C'; - var padding = ''; - - write(dist); - write('_,------,'); - write('\n'); - - write(dist); - padding = self.tick ? ' ' : ' '; - write('_|' + padding + '/\\_/\\ '); - write('\n'); - - write(dist); - padding = self.tick ? '_' : '__'; - var tail = self.tick ? '~' : '^'; - write(tail + '|' + padding + this.face() + ' '); - write('\n'); - - write(dist); - padding = self.tick ? ' ' : ' '; - write(padding + '"" "" '); - write('\n'); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Draw nyan cat face. - * - * @private - * @return {string} - */ - -NyanCat.prototype.face = function() { - var stats = this.stats; - if (stats.failures) { - return '( x .x)'; - } else if (stats.pending) { - return '( o .o)'; - } else if (stats.passes) { - return '( ^ .^)'; - } - return '( - .-)'; -}; - -/** - * Move cursor up `n`. - * - * @private - * @param {number} n - */ - -NyanCat.prototype.cursorUp = function(n) { - write('\u001b[' + n + 'A'); -}; - -/** - * Move cursor down `n`. - * - * @private - * @param {number} n - */ - -NyanCat.prototype.cursorDown = function(n) { - write('\u001b[' + n + 'B'); -}; - -/** - * Generate rainbow colors. - * - * @private - * @return {Array} - */ -NyanCat.prototype.generateColors = function() { - var colors = []; - - for (var i = 0; i < 6 * 7; i++) { - var pi3 = Math.floor(Math.PI / 3); - var n = i * (1.0 / 6); - var r = Math.floor(3 * Math.sin(n) + 3); - var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); - var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); - colors.push(36 * r + 6 * g + b + 16); - } - - return colors; -}; - -/** - * Apply rainbow to the given `str`. - * - * @private - * @param {string} str - * @return {string} - */ -NyanCat.prototype.rainbowify = function(str) { - if (!Base.useColors) { - return str; - } - var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; - this.colorIndex += 1; - return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; -}; - -/** - * Stdout helper. - * - * @param {string} string A message to write to stdout. - */ -function write(string) { - process.stdout.write(string); -} - -NyanCat.description = '"nyan cat"'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69}],29:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module Progress - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var constants = require('../runner').constants; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_TEST_END = constants.EVENT_TEST_END; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var inherits = require('../utils').inherits; -var color = Base.color; -var cursor = Base.cursor; - -/** - * Expose `Progress`. - */ - -exports = module.exports = Progress; - -/** - * General progress bar color. - */ - -Base.colors.progress = 90; - -/** - * Constructs a new `Progress` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Progress(runner, options) { - Base.call(this, runner, options); - - var self = this; - var width = (Base.window.width * 0.5) | 0; - var total = runner.total; - var complete = 0; - var lastN = -1; - - // default chars - options = options || {}; - var reporterOptions = options.reporterOptions || {}; - - options.open = reporterOptions.open || '['; - options.complete = reporterOptions.complete || '▬'; - options.incomplete = reporterOptions.incomplete || Base.symbols.dot; - options.close = reporterOptions.close || ']'; - options.verbose = reporterOptions.verbose || false; - - // tests started - runner.on(EVENT_RUN_BEGIN, function() { - console.log(); - cursor.hide(); - }); - - // tests complete - runner.on(EVENT_TEST_END, function() { - complete++; - - var percent = complete / total; - var n = (width * percent) | 0; - var i = width - n; - - if (n === lastN && !options.verbose) { - // Don't re-render the line if it hasn't changed - return; + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup$1[b64.charCodeAt(i)] << 18) | (revLookup$1[b64.charCodeAt(i + 1)] << 12) | (revLookup$1[b64.charCodeAt(i + 2)] << 6) | revLookup$1[b64.charCodeAt(i + 3)]; + arr[L++] = (tmp >> 16) & 0xFF; + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; } - lastN = n; - cursor.CR(); - process.stdout.write('\u001b[J'); - process.stdout.write(color('progress', ' ' + options.open)); - process.stdout.write(Array(n).join(options.complete)); - process.stdout.write(Array(i).join(options.incomplete)); - process.stdout.write(color('progress', options.close)); - if (options.verbose) { - process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + if (placeHolders === 2) { + tmp = (revLookup$1[b64.charCodeAt(i)] << 2) | (revLookup$1[b64.charCodeAt(i + 1)] >> 4); + arr[L++] = tmp & 0xFF; + } else if (placeHolders === 1) { + tmp = (revLookup$1[b64.charCodeAt(i)] << 10) | (revLookup$1[b64.charCodeAt(i + 1)] << 4) | (revLookup$1[b64.charCodeAt(i + 2)] >> 2); + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; } - }); - // tests are complete, output some stats - // and the failures if any - runner.once(EVENT_RUN_END, function() { - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(Progress, Base); - -Progress.description = 'a progress bar'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69}],30:[function(require,module,exports){ -'use strict'; -/** - * @module Spec - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var constants = require('../runner').constants; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; -var EVENT_SUITE_END = constants.EVENT_SUITE_END; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var inherits = require('../utils').inherits; -var color = Base.color; - -/** - * Expose `Spec`. - */ - -exports = module.exports = Spec; - -/** - * Constructs a new `Spec` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function Spec(runner, options) { - Base.call(this, runner, options); - - var self = this; - var indents = 0; - var n = 0; - - function indent() { - return Array(indents).join(' '); + return arr } - runner.on(EVENT_RUN_BEGIN, function() { - console.log(); - }); + function tripletToBase64$1 (num) { + return lookup$1[num >> 18 & 0x3F] + lookup$1[num >> 12 & 0x3F] + lookup$1[num >> 6 & 0x3F] + lookup$1[num & 0x3F] + } - runner.on(EVENT_SUITE_BEGIN, function(suite) { - ++indents; - console.log(color('suite', '%s%s'), indent(), suite.title); - }); - - runner.on(EVENT_SUITE_END, function() { - --indents; - if (indents === 1) { - console.log(); + function encodeChunk$1 (uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); + output.push(tripletToBase64$1(tmp)); } - }); + return output.join('') + } - runner.on(EVENT_TEST_PENDING, function(test) { - var fmt = indent() + color('pending', ' - %s'); - console.log(fmt, test.title); - }); + function fromByteArray$1 (uint8) { + if (!inited$1) { + init$1(); + } + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var output = ''; + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 - runner.on(EVENT_TEST_PASS, function(test) { - var fmt; - if (test.speed === 'fast') { - fmt = - indent() + - color('checkmark', ' ' + Base.symbols.ok) + - color('pass', ' %s'); - console.log(fmt, test.title); + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk$1(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + output += lookup$1[tmp >> 2]; + output += lookup$1[(tmp << 4) & 0x3F]; + output += '=='; + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); + output += lookup$1[tmp >> 10]; + output += lookup$1[(tmp >> 4) & 0x3F]; + output += lookup$1[(tmp << 2) & 0x3F]; + output += '='; + } + + parts.push(output); + + return parts.join('') + } + + function read$1 (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) } else { - fmt = - indent() + - color('checkmark', ' ' + Base.symbols.ok) + - color('pass', ' %s') + - color(test.speed, ' (%dms)'); - console.log(fmt, test.title, test.duration); + m = m + Math.pow(2, mLen); + e = e - eBias; } - }); - - runner.on(EVENT_TEST_FAIL, function(test) { - console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); - }); - - runner.once(EVENT_RUN_END, self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(Spec, Base); - -Spec.description = 'hierarchical & verbose [default]'; - -},{"../runner":34,"../utils":38,"./base":17}],31:[function(require,module,exports){ -(function (process){ -'use strict'; -/** - * @module TAP - */ -/** - * Module dependencies. - */ - -var util = require('util'); -var Base = require('./base'); -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var EVENT_TEST_END = constants.EVENT_TEST_END; -var inherits = require('../utils').inherits; -var sprintf = util.format; - -/** - * Expose `TAP`. - */ - -exports = module.exports = TAP; - -/** - * Constructs a new `TAP` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function TAP(runner, options) { - Base.call(this, runner, options); - - var self = this; - var n = 1; - - var tapVersion = '12'; - if (options && options.reporterOptions) { - if (options.reporterOptions.tapVersion) { - tapVersion = options.reporterOptions.tapVersion.toString(); - } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } - this._producer = createProducer(tapVersion); + function write$1 (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - runner.once(EVENT_RUN_BEGIN, function() { - var ntests = runner.grepTotal(runner.suite); - self._producer.writeVersion(); - self._producer.writePlan(ntests); - }); + value = Math.abs(value); - runner.on(EVENT_TEST_END, function() { - ++n; - }); - - runner.on(EVENT_TEST_PENDING, function(test) { - self._producer.writePending(n, test); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - self._producer.writePass(n, test); - }); - - runner.on(EVENT_TEST_FAIL, function(test, err) { - self._producer.writeFail(n, test, err); - }); - - runner.once(EVENT_RUN_END, function() { - self._producer.writeEpilogue(runner.stats); - }); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(TAP, Base); - -/** - * Returns a TAP-safe title of `test`. - * - * @private - * @param {Test} test - Test instance. - * @return {String} title with any hash character removed - */ -function title(test) { - return test.fullTitle().replace(/#/g, ''); -} - -/** - * Writes newline-terminated formatted string to reporter output stream. - * - * @private - * @param {string} format - `printf`-like format string - * @param {...*} [varArgs] - Format string arguments - */ -function println(format, varArgs) { - var vargs = Array.from(arguments); - vargs[0] += '\n'; - process.stdout.write(sprintf.apply(null, vargs)); -} - -/** - * Returns a `tapVersion`-appropriate TAP producer instance, if possible. - * - * @private - * @param {string} tapVersion - Version of TAP specification to produce. - * @returns {TAPProducer} specification-appropriate instance - * @throws {Error} if specification version has no associated producer. - */ -function createProducer(tapVersion) { - var producers = { - '12': new TAP12Producer(), - '13': new TAP13Producer() - }; - var producer = producers[tapVersion]; - - if (!producer) { - throw new Error( - 'invalid or unsupported TAP version: ' + JSON.stringify(tapVersion) - ); - } - - return producer; -} - -/** - * @summary - * Constructs a new TAPProducer. - * - * @description - * <em>Only</em> to be used as an abstract base class. - * - * @private - * @constructor - */ -function TAPProducer() {} - -/** - * Writes the TAP version to reporter output stream. - * - * @abstract - */ -TAPProducer.prototype.writeVersion = function() {}; - -/** - * Writes the plan to reporter output stream. - * - * @abstract - * @param {number} ntests - Number of tests that are planned to run. - */ -TAPProducer.prototype.writePlan = function(ntests) { - println('%d..%d', 1, ntests); -}; - -/** - * Writes that test passed to reporter output stream. - * - * @abstract - * @param {number} n - Index of test that passed. - * @param {Test} test - Instance containing test information. - */ -TAPProducer.prototype.writePass = function(n, test) { - println('ok %d %s', n, title(test)); -}; - -/** - * Writes that test was skipped to reporter output stream. - * - * @abstract - * @param {number} n - Index of test that was skipped. - * @param {Test} test - Instance containing test information. - */ -TAPProducer.prototype.writePending = function(n, test) { - println('ok %d %s # SKIP -', n, title(test)); -}; - -/** - * Writes that test failed to reporter output stream. - * - * @abstract - * @param {number} n - Index of test that failed. - * @param {Test} test - Instance containing test information. - * @param {Error} err - Reason the test failed. - */ -TAPProducer.prototype.writeFail = function(n, test, err) { - println('not ok %d %s', n, title(test)); -}; - -/** - * Writes the summary epilogue to reporter output stream. - * - * @abstract - * @param {Object} stats - Object containing run statistics. - */ -TAPProducer.prototype.writeEpilogue = function(stats) { - // :TBD: Why is this not counting pending tests? - println('# tests ' + (stats.passes + stats.failures)); - println('# pass ' + stats.passes); - // :TBD: Why are we not showing pending results? - println('# fail ' + stats.failures); -}; - -/** - * @summary - * Constructs a new TAP12Producer. - * - * @description - * Produces output conforming to the TAP12 specification. - * - * @private - * @constructor - * @extends TAPProducer - * @see {@link https://testanything.org/tap-specification.html|Specification} - */ -function TAP12Producer() { - /** - * Writes that test failed to reporter output stream, with error formatting. - * @override - */ - this.writeFail = function(n, test, err) { - TAPProducer.prototype.writeFail.call(this, n, test, err); - if (err.message) { - println(err.message.replace(/^/gm, ' ')); - } - if (err.stack) { - println(err.stack.replace(/^/gm, ' ')); - } - }; -} - -/** - * Inherit from `TAPProducer.prototype`. - */ -inherits(TAP12Producer, TAPProducer); - -/** - * @summary - * Constructs a new TAP13Producer. - * - * @description - * Produces output conforming to the TAP13 specification. - * - * @private - * @constructor - * @extends TAPProducer - * @see {@link https://testanything.org/tap-version-13-specification.html|Specification} - */ -function TAP13Producer() { - /** - * Writes the TAP version to reporter output stream. - * @override - */ - this.writeVersion = function() { - println('TAP version 13'); - }; - - /** - * Writes that test failed to reporter output stream, with error formatting. - * @override - */ - this.writeFail = function(n, test, err) { - TAPProducer.prototype.writeFail.call(this, n, test, err); - var emitYamlBlock = err.message != null || err.stack != null; - if (emitYamlBlock) { - println(indent(1) + '---'); - if (err.message) { - println(indent(2) + 'message: |-'); - println(err.message.replace(/^/gm, indent(3))); + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; } - if (err.stack) { - println(indent(2) + 'stack: |-'); - println(err.stack.replace(/^/gm, indent(3))); + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); } - println(indent(1) + '...'); - } - }; - - function indent(level) { - return Array(level + 1).join(' '); - } -} - -/** - * Inherit from `TAPProducer.prototype`. - */ -inherits(TAP13Producer, TAPProducer); - -TAP.description = 'TAP-compatible output'; - -}).call(this,require('_process')) -},{"../runner":34,"../utils":38,"./base":17,"_process":69,"util":89}],32:[function(require,module,exports){ -(function (process,global){ -'use strict'; -/** - * @module XUnit - */ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var utils = require('../utils'); -var fs = require('fs'); -var mkdirp = require('mkdirp'); -var path = require('path'); -var errors = require('../errors'); -var createUnsupportedError = errors.createUnsupportedError; -var constants = require('../runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var STATE_FAILED = require('../runnable').constants.STATE_FAILED; -var inherits = utils.inherits; -var escape = utils.escape; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ -var Date = global.Date; - -/** - * Expose `XUnit`. - */ - -exports = module.exports = XUnit; - -/** - * Constructs a new `XUnit` reporter instance. - * - * @public - * @class - * @memberof Mocha.reporters - * @extends Mocha.reporters.Base - * @param {Runner} runner - Instance triggers reporter actions. - * @param {Object} [options] - runner options - */ -function XUnit(runner, options) { - Base.call(this, runner, options); - - var stats = this.stats; - var tests = []; - var self = this; - - // the name of the test suite, as it will appear in the resulting XML file - var suiteName; - - // the default name of the test suite if none is provided - var DEFAULT_SUITE_NAME = 'Mocha Tests'; - - if (options && options.reporterOptions) { - if (options.reporterOptions.output) { - if (!fs.createWriteStream) { - throw createUnsupportedError('file output not supported in browser'); + if (value * c >= 2) { + e++; + c /= 2; } - mkdirp.sync(path.dirname(options.reporterOptions.output)); - self.fileStream = fs.createWriteStream(options.reporterOptions.output); + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } } - // get the suite name from the reporter options (if provided) - suiteName = options.reporterOptions.suiteName; + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; } - // fall back to the default suite name - suiteName = suiteName || DEFAULT_SUITE_NAME; + var toString$2 = {}.toString; - runner.on(EVENT_TEST_PENDING, function(test) { - tests.push(test); - }); - - runner.on(EVENT_TEST_PASS, function(test) { - tests.push(test); - }); - - runner.on(EVENT_TEST_FAIL, function(test) { - tests.push(test); - }); - - runner.once(EVENT_RUN_END, function() { - self.write( - tag( - 'testsuite', - { - name: suiteName, - tests: stats.tests, - failures: 0, - errors: stats.failures, - skipped: stats.tests - stats.failures - stats.passes, - timestamp: new Date().toUTCString(), - time: stats.duration / 1000 || 0 - }, - false - ) - ); - - tests.forEach(function(t) { - self.test(t); - }); - - self.write('</testsuite>'); - }); -} - -/** - * Inherit from `Base.prototype`. - */ -inherits(XUnit, Base); - -/** - * Override done to close the stream (if it's a file). - * - * @param failures - * @param {Function} fn - */ -XUnit.prototype.done = function(failures, fn) { - if (this.fileStream) { - this.fileStream.end(function() { - fn(failures); - }); - } else { - fn(failures); - } -}; - -/** - * Write out the given line. - * - * @param {string} line - */ -XUnit.prototype.write = function(line) { - if (this.fileStream) { - this.fileStream.write(line + '\n'); - } else if (typeof process === 'object' && process.stdout) { - process.stdout.write(line + '\n'); - } else { - console.log(line); - } -}; - -/** - * Output tag for the given `test.` - * - * @param {Test} test - */ -XUnit.prototype.test = function(test) { - Base.useColors = false; - - var attrs = { - classname: test.parent.fullTitle(), - name: test.title, - time: test.duration / 1000 || 0 + var isArray$2 = Array.isArray || function (arr) { + return toString$2.call(arr) == '[object Array]'; }; - if (test.state === STATE_FAILED) { - var err = test.err; - var diff = - Base.hideDiff || !err.actual || !err.expected - ? '' - : '\n' + Base.generateDiff(err.actual, err.expected); - this.write( - tag( - 'testcase', - attrs, - false, - tag( - 'failure', - {}, - false, - escape(err.message) + escape(diff) + '\n' + escape(err.stack) + /*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> + * @license MIT + */ + + var INSPECT_MAX_BYTES$1 = 50; + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ + Buffer$1.TYPED_ARRAY_SUPPORT = global$2.TYPED_ARRAY_SUPPORT !== undefined + ? global$2.TYPED_ARRAY_SUPPORT + : true; + + function kMaxLength$1 () { + return Buffer$1.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff + } + + function createBuffer$1 (that, length) { + if (kMaxLength$1() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length); + that.__proto__ = Buffer$1.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer$1(length); + } + that.length = length; + } + + return that + } + + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + function Buffer$1 (arg, encodingOrOffset, length) { + if (!Buffer$1.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer$1)) { + return new Buffer$1(arg, encodingOrOffset, length) + } + + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' ) - ) - ); - } else if (test.isPending()) { - this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); - } else { - this.write(tag('testcase', attrs, true)); - } -}; - -/** - * HTML tag helper. - * - * @param name - * @param attrs - * @param close - * @param content - * @return {string} - */ -function tag(name, attrs, close, content) { - var end = close ? '/>' : '>'; - var pairs = []; - var tag; - - for (var key in attrs) { - if (Object.prototype.hasOwnProperty.call(attrs, key)) { - pairs.push(key + '="' + escape(attrs[key]) + '"'); - } - } - - tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; - if (content) { - tag += content + '</' + name + end; - } - return tag; -} - -XUnit.description = 'XUnit-compatible XML output'; - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../errors":6,"../runnable":33,"../runner":34,"../utils":38,"./base":17,"_process":69,"fs":42,"mkdirp":59,"path":42}],33:[function(require,module,exports){ -(function (global){ -'use strict'; - -var EventEmitter = require('events').EventEmitter; -var Pending = require('./pending'); -var debug = require('debug')('mocha:runnable'); -var milliseconds = require('ms'); -var utils = require('./utils'); -var createInvalidExceptionError = require('./errors') - .createInvalidExceptionError; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ -var Date = global.Date; -var setTimeout = global.setTimeout; -var clearTimeout = global.clearTimeout; -var toString = Object.prototype.toString; - -module.exports = Runnable; - -/** - * Initialize a new `Runnable` with the given `title` and callback `fn`. - * - * @class - * @extends external:EventEmitter - * @public - * @param {String} title - * @param {Function} fn - */ -function Runnable(title, fn) { - this.title = title; - this.fn = fn; - this.body = (fn || '').toString(); - this.async = fn && fn.length; - this.sync = !this.async; - this._timeout = 2000; - this._slow = 75; - this._enableTimeouts = true; - this.timedOut = false; - this._retries = -1; - this._currentRetry = 0; - this.pending = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ -utils.inherits(Runnable, EventEmitter); - -/** - * Get current timeout value in msecs. - * - * @private - * @returns {number} current timeout threshold value - */ -/** - * @summary - * Set timeout threshold value (msecs). - * - * @description - * A string argument can use shorthand (e.g., "2s") and will be converted. - * The value will be clamped to range [<code>0</code>, <code>2^<sup>31</sup>-1</code>]. - * If clamped value matches either range endpoint, timeouts will be disabled. - * - * @private - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value} - * @param {number|string} ms - Timeout threshold value. - * @returns {Runnable} this - * @chainable - */ -Runnable.prototype.timeout = function(ms) { - if (!arguments.length) { - return this._timeout; - } - if (typeof ms === 'string') { - ms = milliseconds(ms); - } - - // Clamp to range - var INT_MAX = Math.pow(2, 31) - 1; - var range = [0, INT_MAX]; - ms = utils.clamp(ms, range); - - // see #1652 for reasoning - if (ms === range[0] || ms === range[1]) { - this._enableTimeouts = false; - } - debug('timeout %d', ms); - this._timeout = ms; - if (this.timer) { - this.resetTimeout(); - } - return this; -}; - -/** - * Set or get slow `ms`. - * - * @private - * @param {number|string} ms - * @return {Runnable|number} ms or Runnable instance. - */ -Runnable.prototype.slow = function(ms) { - if (!arguments.length || typeof ms === 'undefined') { - return this._slow; - } - if (typeof ms === 'string') { - ms = milliseconds(ms); - } - debug('slow %d', ms); - this._slow = ms; - return this; -}; - -/** - * Set and get whether timeout is `enabled`. - * - * @private - * @param {boolean} enabled - * @return {Runnable|boolean} enabled or Runnable instance. - */ -Runnable.prototype.enableTimeouts = function(enabled) { - if (!arguments.length) { - return this._enableTimeouts; - } - debug('enableTimeouts %s', enabled); - this._enableTimeouts = enabled; - return this; -}; - -/** - * Halt and mark as pending. - * - * @memberof Mocha.Runnable - * @public - */ -Runnable.prototype.skip = function() { - throw new Pending('sync skip'); -}; - -/** - * Check if this runnable or its parent suite is marked as pending. - * - * @private - */ -Runnable.prototype.isPending = function() { - return this.pending || (this.parent && this.parent.isPending()); -}; - -/** - * Return `true` if this Runnable has failed. - * @return {boolean} - * @private - */ -Runnable.prototype.isFailed = function() { - return !this.isPending() && this.state === constants.STATE_FAILED; -}; - -/** - * Return `true` if this Runnable has passed. - * @return {boolean} - * @private - */ -Runnable.prototype.isPassed = function() { - return !this.isPending() && this.state === constants.STATE_PASSED; -}; - -/** - * Set or get number of retries. - * - * @private - */ -Runnable.prototype.retries = function(n) { - if (!arguments.length) { - return this._retries; - } - this._retries = n; -}; - -/** - * Set or get current retry - * - * @private - */ -Runnable.prototype.currentRetry = function(n) { - if (!arguments.length) { - return this._currentRetry; - } - this._currentRetry = n; -}; - -/** - * Return the full title generated by recursively concatenating the parent's - * full title. - * - * @memberof Mocha.Runnable - * @public - * @return {string} - */ -Runnable.prototype.fullTitle = function() { - return this.titlePath().join(' '); -}; - -/** - * Return the title path generated by concatenating the parent's title path with the title. - * - * @memberof Mocha.Runnable - * @public - * @return {string} - */ -Runnable.prototype.titlePath = function() { - return this.parent.titlePath().concat([this.title]); -}; - -/** - * Clear the timeout. - * - * @private - */ -Runnable.prototype.clearTimeout = function() { - clearTimeout(this.timer); -}; - -/** - * Inspect the runnable void of private properties. - * - * @private - * @return {string} - */ -Runnable.prototype.inspect = function() { - return JSON.stringify( - this, - function(key, val) { - if (key[0] === '_') { - return; } - if (key === 'parent') { - return '#<Suite>'; - } - if (key === 'ctx') { - return '#<Context>'; - } - return val; - }, - 2 - ); -}; - -/** - * Reset the timeout. - * - * @private - */ -Runnable.prototype.resetTimeout = function() { - var self = this; - var ms = this.timeout() || 1e9; - - if (!this._enableTimeouts) { - return; - } - this.clearTimeout(); - this.timer = setTimeout(function() { - if (!self._enableTimeouts) { - return; + return allocUnsafe$1(this, arg) } - self.callback(self._timeoutError(ms)); - self.timedOut = true; - }, ms); -}; - -/** - * Set or get a list of whitelisted globals for this test run. - * - * @private - * @param {string[]} globals - */ -Runnable.prototype.globals = function(globals) { - if (!arguments.length) { - return this._allowedGlobals; - } - this._allowedGlobals = globals; -}; - -/** - * Run the test and invoke `fn(err)`. - * - * @param {Function} fn - * @private - */ -Runnable.prototype.run = function(fn) { - var self = this; - var start = new Date(); - var ctx = this.ctx; - var finished; - var emitted; - - // Sometimes the ctx exists, but it is not runnable - if (ctx && ctx.runnable) { - ctx.runnable(this); + return from$1(this, arg, encodingOrOffset, length) } - // called multiple times - function multiple(err) { - if (emitted) { - return; - } - emitted = true; - var msg = 'done() called multiple times'; - if (err && err.message) { - err.message += " (and Mocha's " + msg + ')'; - self.emit('error', err); - } else { - self.emit('error', new Error(msg)); - } - } + Buffer$1.poolSize = 8192; // not used by this implementation - // finished - function done(err) { - var ms = self.timeout(); - if (self.timedOut) { - return; - } - - if (finished) { - return multiple(err); - } - - self.clearTimeout(); - self.duration = new Date() - start; - finished = true; - if (!err && self.duration > ms && self._enableTimeouts) { - err = self._timeoutError(ms); - } - fn(err); - } - - // for .resetTimeout() - this.callback = done; - - // explicit async with `done` argument - if (this.async) { - this.resetTimeout(); - - // allows skip() to be used in an explicit async context - this.skip = function asyncSkip() { - done(new Pending('async skip call')); - // halt execution. the Runnable will be marked pending - // by the previous call, and the uncaught handler will ignore - // the failure. - throw new Pending('async skip; aborting execution'); - }; - - if (this.allowUncaught) { - return callFnAsync(this.fn); - } - try { - callFnAsync(this.fn); - } catch (err) { - emitted = true; - done(Runnable.toValueOrError(err)); - } - return; - } - - if (this.allowUncaught) { - if (this.isPending()) { - done(); - } else { - callFn(this.fn); - } - return; - } - - // sync or promise-returning - try { - if (this.isPending()) { - done(); - } else { - callFn(this.fn); - } - } catch (err) { - emitted = true; - done(Runnable.toValueOrError(err)); - } - - function callFn(fn) { - var result = fn.call(ctx); - if (result && typeof result.then === 'function') { - self.resetTimeout(); - result.then( - function() { - done(); - // Return null so libraries like bluebird do not warn about - // subsequently constructed Promises. - return null; - }, - function(reason) { - done(reason || new Error('Promise rejected with no or falsy reason')); - } - ); - } else { - if (self.asyncOnly) { - return done( - new Error( - '--async-only option in use without declaring `done()` or returning a promise' - ) - ); - } - - done(); - } - } - - function callFnAsync(fn) { - var result = fn.call(ctx, function(err) { - if (err instanceof Error || toString.call(err) === '[object Error]') { - return done(err); - } - if (err) { - if (Object.prototype.toString.call(err) === '[object Object]') { - return done( - new Error('done() invoked with non-Error: ' + JSON.stringify(err)) - ); - } - return done(new Error('done() invoked with non-Error: ' + err)); - } - if (result && utils.isPromise(result)) { - return done( - new Error( - 'Resolution method is overspecified. Specify a callback *or* return a Promise; not both.' - ) - ); - } - - done(); - }); - } -}; - -/** - * Instantiates a "timeout" error - * - * @param {number} ms - Timeout (in milliseconds) - * @returns {Error} a "timeout" error - * @private - */ -Runnable.prototype._timeoutError = function(ms) { - var msg = - 'Timeout of ' + - ms + - 'ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.'; - if (this.file) { - msg += ' (' + this.file + ')'; - } - return new Error(msg); -}; - -var constants = utils.defineConstants( - /** - * {@link Runnable}-related constants. - * @public - * @memberof Runnable - * @readonly - * @static - * @alias constants - * @enum {string} - */ - { - /** - * Value of `state` prop when a `Runnable` has failed - */ - STATE_FAILED: 'failed', - /** - * Value of `state` prop when a `Runnable` has passed - */ - STATE_PASSED: 'passed' - } -); - -/** - * Given `value`, return identity if truthy, otherwise create an "invalid exception" error and return that. - * @param {*} [value] - Value to return, if present - * @returns {*|Error} `value`, otherwise an `Error` - * @private - */ -Runnable.toValueOrError = function(value) { - return ( - value || - createInvalidExceptionError( - 'Runnable failed with falsy or undefined exception. Please throw an Error instead.', - value - ) - ); -}; - -Runnable.constants = constants; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./errors":6,"./pending":16,"./utils":38,"debug":45,"events":50,"ms":60}],34:[function(require,module,exports){ -(function (process,global){ -'use strict'; - -/** - * Module dependencies. - */ -var util = require('util'); -var EventEmitter = require('events').EventEmitter; -var Pending = require('./pending'); -var utils = require('./utils'); -var inherits = utils.inherits; -var debug = require('debug')('mocha:runner'); -var Runnable = require('./runnable'); -var Suite = require('./suite'); -var HOOK_TYPE_BEFORE_EACH = Suite.constants.HOOK_TYPE_BEFORE_EACH; -var HOOK_TYPE_AFTER_EACH = Suite.constants.HOOK_TYPE_AFTER_EACH; -var HOOK_TYPE_AFTER_ALL = Suite.constants.HOOK_TYPE_AFTER_ALL; -var HOOK_TYPE_BEFORE_ALL = Suite.constants.HOOK_TYPE_BEFORE_ALL; -var EVENT_ROOT_SUITE_RUN = Suite.constants.EVENT_ROOT_SUITE_RUN; -var STATE_FAILED = Runnable.constants.STATE_FAILED; -var STATE_PASSED = Runnable.constants.STATE_PASSED; -var dQuote = utils.dQuote; -var ngettext = utils.ngettext; -var sQuote = utils.sQuote; -var stackFilter = utils.stackTraceFilter(); -var stringify = utils.stringify; -var type = utils.type; -var createInvalidExceptionError = require('./errors') - .createInvalidExceptionError; - -/** - * Non-enumerable globals. - * @readonly - */ -var globals = [ - 'setTimeout', - 'clearTimeout', - 'setInterval', - 'clearInterval', - 'XMLHttpRequest', - 'Date', - 'setImmediate', - 'clearImmediate' -]; - -var constants = utils.defineConstants( - /** - * {@link Runner}-related constants. - * @public - * @memberof Runner - * @readonly - * @alias constants - * @static - * @enum {string} - */ - { - /** - * Emitted when {@link Hook} execution begins - */ - EVENT_HOOK_BEGIN: 'hook', - /** - * Emitted when {@link Hook} execution ends - */ - EVENT_HOOK_END: 'hook end', - /** - * Emitted when Root {@link Suite} execution begins (all files have been parsed and hooks/tests are ready for execution) - */ - EVENT_RUN_BEGIN: 'start', - /** - * Emitted when Root {@link Suite} execution has been delayed via `delay` option - */ - EVENT_DELAY_BEGIN: 'waiting', - /** - * Emitted when delayed Root {@link Suite} execution is triggered by user via `global.run()` - */ - EVENT_DELAY_END: 'ready', - /** - * Emitted when Root {@link Suite} execution ends - */ - EVENT_RUN_END: 'end', - /** - * Emitted when {@link Suite} execution begins - */ - EVENT_SUITE_BEGIN: 'suite', - /** - * Emitted when {@link Suite} execution ends - */ - EVENT_SUITE_END: 'suite end', - /** - * Emitted when {@link Test} execution begins - */ - EVENT_TEST_BEGIN: 'test', - /** - * Emitted when {@link Test} execution ends - */ - EVENT_TEST_END: 'test end', - /** - * Emitted when {@link Test} execution fails - */ - EVENT_TEST_FAIL: 'fail', - /** - * Emitted when {@link Test} execution succeeds - */ - EVENT_TEST_PASS: 'pass', - /** - * Emitted when {@link Test} becomes pending - */ - EVENT_TEST_PENDING: 'pending', - /** - * Emitted when {@link Test} execution has failed, but will retry - */ - EVENT_TEST_RETRY: 'retry' - } -); - -module.exports = Runner; - -/** - * Initialize a `Runner` at the Root {@link Suite}, which represents a hierarchy of {@link Suite|Suites} and {@link Test|Tests}. - * - * @extends external:EventEmitter - * @public - * @class - * @param {Suite} suite Root suite - * @param {boolean} [delay] Whether or not to delay execution of root suite - * until ready. - */ -function Runner(suite, delay) { - var self = this; - this._globals = []; - this._abort = false; - this._delay = delay; - this.suite = suite; - this.started = false; - this.total = suite.total(); - this.failures = 0; - this.on(constants.EVENT_TEST_END, function(test) { - self.checkGlobals(test); - }); - this.on(constants.EVENT_HOOK_END, function(hook) { - self.checkGlobals(hook); - }); - this._defaultGrep = /.*/; - this.grep(this._defaultGrep); - this.globals(this.globalProps().concat(extraGlobals())); -} - -/** - * Wrapper for setImmediate, process.nextTick, or browser polyfill. - * - * @param {Function} fn - * @private - */ -Runner.immediately = global.setImmediate || process.nextTick; - -/** - * Inherit from `EventEmitter.prototype`. - */ -inherits(Runner, EventEmitter); - -/** - * Run tests with full titles matching `re`. Updates runner.total - * with number of tests matched. - * - * @public - * @memberof Runner - * @param {RegExp} re - * @param {boolean} invert - * @return {Runner} Runner instance. - */ -Runner.prototype.grep = function(re, invert) { - debug('grep %s', re); - this._grep = re; - this._invert = invert; - this.total = this.grepTotal(this.suite); - return this; -}; - -/** - * Returns the number of tests matching the grep search for the - * given suite. - * - * @memberof Runner - * @public - * @param {Suite} suite - * @return {number} - */ -Runner.prototype.grepTotal = function(suite) { - var self = this; - var total = 0; - - suite.eachTest(function(test) { - var match = self._grep.test(test.fullTitle()); - if (self._invert) { - match = !match; - } - if (match) { - total++; - } - }); - - return total; -}; - -/** - * Return a list of global properties. - * - * @return {Array} - * @private - */ -Runner.prototype.globalProps = function() { - var props = Object.keys(global); - - // non-enumerables - for (var i = 0; i < globals.length; ++i) { - if (~props.indexOf(globals[i])) { - continue; - } - props.push(globals[i]); - } - - return props; -}; - -/** - * Allow the given `arr` of globals. - * - * @public - * @memberof Runner - * @param {Array} arr - * @return {Runner} Runner instance. - */ -Runner.prototype.globals = function(arr) { - if (!arguments.length) { - return this._globals; - } - debug('globals %j', arr); - this._globals = this._globals.concat(arr); - return this; -}; - -/** - * Check for global variable leaks. - * - * @private - */ -Runner.prototype.checkGlobals = function(test) { - if (this.ignoreLeaks) { - return; - } - var ok = this._globals; - - var globals = this.globalProps(); - var leaks; - - if (test) { - ok = ok.concat(test._allowedGlobals || []); - } - - if (this.prevGlobalsLength === globals.length) { - return; - } - this.prevGlobalsLength = globals.length; - - leaks = filterLeaks(ok, globals); - this._globals = this._globals.concat(leaks); - - if (leaks.length) { - var format = ngettext( - leaks.length, - 'global leak detected: %s', - 'global leaks detected: %s' - ); - var error = new Error(util.format(format, leaks.map(sQuote).join(', '))); - this.fail(test, error); - } -}; - -/** - * Fail the given `test`. - * - * @private - * @param {Test} test - * @param {Error} err - */ -Runner.prototype.fail = function(test, err) { - if (test.isPending()) { - return; - } - - ++this.failures; - test.state = STATE_FAILED; - - if (!isError(err)) { - err = thrown2Error(err); - } - - try { - err.stack = - this.fullStackTrace || !err.stack ? err.stack : stackFilter(err.stack); - } catch (ignore) { - // some environments do not take kindly to monkeying with the stack - } - - this.emit(constants.EVENT_TEST_FAIL, test, err); -}; - -/** - * Fail the given `hook` with `err`. - * - * Hook failures work in the following pattern: - * - If bail, run corresponding `after each` and `after` hooks, - * then exit - * - Failed `before` hook skips all tests in a suite and subsuites, - * but jumps to corresponding `after` hook - * - Failed `before each` hook skips remaining tests in a - * suite and jumps to corresponding `after each` hook, - * which is run only once - * - Failed `after` hook does not alter - * execution order - * - Failed `after each` hook skips remaining tests in a - * suite and subsuites, but executes other `after each` - * hooks - * - * @private - * @param {Hook} hook - * @param {Error} err - */ -Runner.prototype.failHook = function(hook, err) { - hook.originalTitle = hook.originalTitle || hook.title; - if (hook.ctx && hook.ctx.currentTest) { - hook.title = - hook.originalTitle + ' for ' + dQuote(hook.ctx.currentTest.title); - } else { - var parentTitle; - if (hook.parent.title) { - parentTitle = hook.parent.title; - } else { - parentTitle = hook.parent.root ? '{root}' : ''; - } - hook.title = hook.originalTitle + ' in ' + dQuote(parentTitle); - } - - this.fail(hook, err); -}; - -/** - * Run hook `name` callbacks and then invoke `fn()`. - * - * @private - * @param {string} name - * @param {Function} fn - */ - -Runner.prototype.hook = function(name, fn) { - var suite = this.suite; - var hooks = suite.getHooks(name); - var self = this; - - function next(i) { - var hook = hooks[i]; - if (!hook) { - return fn(); - } - self.currentRunnable = hook; - - if (name === HOOK_TYPE_BEFORE_ALL) { - hook.ctx.currentTest = hook.parent.tests[0]; - } else if (name === HOOK_TYPE_AFTER_ALL) { - hook.ctx.currentTest = hook.parent.tests[hook.parent.tests.length - 1]; - } else { - hook.ctx.currentTest = self.test; - } - - hook.allowUncaught = self.allowUncaught; - - self.emit(constants.EVENT_HOOK_BEGIN, hook); - - if (!hook.listeners('error').length) { - hook.on('error', function(err) { - self.failHook(hook, err); - }); - } - - hook.run(function(err) { - var testError = hook.error(); - if (testError) { - self.fail(self.test, testError); - } - if (err) { - if (err instanceof Pending) { - if (name === HOOK_TYPE_AFTER_ALL) { - utils.deprecate( - 'Skipping a test within an "after all" hook is DEPRECATED and will throw an exception in a future version of Mocha. ' + - 'Use a return statement or other means to abort hook execution.' - ); - } - if (name === HOOK_TYPE_BEFORE_EACH || name === HOOK_TYPE_AFTER_EACH) { - if (self.test) { - self.test.pending = true; - } - } else { - suite.tests.forEach(function(test) { - test.pending = true; - }); - suite.suites.forEach(function(suite) { - suite.pending = true; - }); - // a pending hook won't be executed twice. - hook.pending = true; - } - } else { - self.failHook(hook, err); - - // stop executing hooks, notify callee of hook err - return fn(err); - } - } - self.emit(constants.EVENT_HOOK_END, hook); - delete hook.ctx.currentTest; - next(++i); - }); - } - - Runner.immediately(function() { - next(0); - }); -}; - -/** - * Run hook `name` for the given array of `suites` - * in order, and callback `fn(err, errSuite)`. - * - * @private - * @param {string} name - * @param {Array} suites - * @param {Function} fn - */ -Runner.prototype.hooks = function(name, suites, fn) { - var self = this; - var orig = this.suite; - - function next(suite) { - self.suite = suite; - - if (!suite) { - self.suite = orig; - return fn(); - } - - self.hook(name, function(err) { - if (err) { - var errSuite = self.suite; - self.suite = orig; - return fn(err, errSuite); - } - - next(suites.pop()); - }); - } - - next(suites.pop()); -}; - -/** - * Run hooks from the top level down. - * - * @param {String} name - * @param {Function} fn - * @private - */ -Runner.prototype.hookUp = function(name, fn) { - var suites = [this.suite].concat(this.parents()).reverse(); - this.hooks(name, suites, fn); -}; - -/** - * Run hooks from the bottom up. - * - * @param {String} name - * @param {Function} fn - * @private - */ -Runner.prototype.hookDown = function(name, fn) { - var suites = [this.suite].concat(this.parents()); - this.hooks(name, suites, fn); -}; - -/** - * Return an array of parent Suites from - * closest to furthest. - * - * @return {Array} - * @private - */ -Runner.prototype.parents = function() { - var suite = this.suite; - var suites = []; - while (suite.parent) { - suite = suite.parent; - suites.push(suite); - } - return suites; -}; - -/** - * Run the current test and callback `fn(err)`. - * - * @param {Function} fn - * @private - */ -Runner.prototype.runTest = function(fn) { - var self = this; - var test = this.test; - - if (!test) { - return; - } - - var suite = this.parents().reverse()[0] || this.suite; - if (this.forbidOnly && suite.hasOnly()) { - fn(new Error('`.only` forbidden')); - return; - } - if (this.asyncOnly) { - test.asyncOnly = true; - } - test.on('error', function(err) { - self.fail(test, err); - }); - if (this.allowUncaught) { - test.allowUncaught = true; - return test.run(fn); - } - try { - test.run(fn); - } catch (err) { - fn(err); - } -}; - -/** - * Run tests in the given `suite` and invoke the callback `fn()` when complete. - * - * @private - * @param {Suite} suite - * @param {Function} fn - */ -Runner.prototype.runTests = function(suite, fn) { - var self = this; - var tests = suite.tests.slice(); - var test; - - function hookErr(_, errSuite, after) { - // before/after Each hook for errSuite failed: - var orig = self.suite; - - // for failed 'after each' hook start from errSuite parent, - // otherwise start from errSuite itself - self.suite = after ? errSuite.parent : errSuite; - - if (self.suite) { - // call hookUp afterEach - self.hookUp(HOOK_TYPE_AFTER_EACH, function(err2, errSuite2) { - self.suite = orig; - // some hooks may fail even now - if (err2) { - return hookErr(err2, errSuite2, true); - } - // report error suite - fn(errSuite); - }); - } else { - // there is no need calling other 'after each' hooks - self.suite = orig; - fn(errSuite); - } - } - - function next(err, errSuite) { - // if we bail after first err - if (self.failures && suite._bail) { - tests = []; - } - - if (self._abort) { - return fn(); - } - - if (err) { - return hookErr(err, errSuite, true); - } - - // next test - test = tests.shift(); - - // all done - if (!test) { - return fn(); - } - - // grep - var match = self._grep.test(test.fullTitle()); - if (self._invert) { - match = !match; - } - if (!match) { - // Run immediately only if we have defined a grep. When we - // define a grep — It can cause maximum callstack error if - // the grep is doing a large recursive loop by neglecting - // all tests. The run immediately function also comes with - // a performance cost. So we don't want to run immediately - // if we run the whole test suite, because running the whole - // test suite don't do any immediate recursive loops. Thus, - // allowing a JS runtime to breathe. - if (self._grep !== self._defaultGrep) { - Runner.immediately(next); - } else { - next(); - } - return; - } - - if (test.isPending()) { - if (self.forbidPending) { - test.isPending = alwaysFalse; - self.fail(test, new Error('Pending test forbidden')); - delete test.isPending; - } else { - self.emit(constants.EVENT_TEST_PENDING, test); - } - self.emit(constants.EVENT_TEST_END, test); - return next(); - } - - // execute test and hook(s) - self.emit(constants.EVENT_TEST_BEGIN, (self.test = test)); - self.hookDown(HOOK_TYPE_BEFORE_EACH, function(err, errSuite) { - if (test.isPending()) { - if (self.forbidPending) { - test.isPending = alwaysFalse; - self.fail(test, new Error('Pending test forbidden')); - delete test.isPending; - } else { - self.emit(constants.EVENT_TEST_PENDING, test); - } - self.emit(constants.EVENT_TEST_END, test); - return next(); - } - if (err) { - return hookErr(err, errSuite, false); - } - self.currentRunnable = self.test; - self.runTest(function(err) { - test = self.test; - if (err) { - var retry = test.currentRetry(); - if (err instanceof Pending && self.forbidPending) { - self.fail(test, new Error('Pending test forbidden')); - } else if (err instanceof Pending) { - test.pending = true; - self.emit(constants.EVENT_TEST_PENDING, test); - } else if (retry < test.retries()) { - var clonedTest = test.clone(); - clonedTest.currentRetry(retry + 1); - tests.unshift(clonedTest); - - self.emit(constants.EVENT_TEST_RETRY, test, err); - - // Early return + hook trigger so that it doesn't - // increment the count wrong - return self.hookUp(HOOK_TYPE_AFTER_EACH, next); - } else { - self.fail(test, err); - } - self.emit(constants.EVENT_TEST_END, test); - - if (err instanceof Pending) { - return next(); - } - - return self.hookUp(HOOK_TYPE_AFTER_EACH, next); - } - - test.state = STATE_PASSED; - self.emit(constants.EVENT_TEST_PASS, test); - self.emit(constants.EVENT_TEST_END, test); - self.hookUp(HOOK_TYPE_AFTER_EACH, next); - }); - }); - } - - this.next = next; - this.hookErr = hookErr; - next(); -}; - -function alwaysFalse() { - return false; -} - -/** - * Run the given `suite` and invoke the callback `fn()` when complete. - * - * @private - * @param {Suite} suite - * @param {Function} fn - */ -Runner.prototype.runSuite = function(suite, fn) { - var i = 0; - var self = this; - var total = this.grepTotal(suite); - var afterAllHookCalled = false; - - debug('run suite %s', suite.fullTitle()); - - if (!total || (self.failures && suite._bail)) { - return fn(); - } - - this.emit(constants.EVENT_SUITE_BEGIN, (this.suite = suite)); - - function next(errSuite) { - if (errSuite) { - // current suite failed on a hook from errSuite - if (errSuite === suite) { - // if errSuite is current suite - // continue to the next sibling suite - return done(); - } - // errSuite is among the parents of current suite - // stop execution of errSuite and all sub-suites - return done(errSuite); - } - - if (self._abort) { - return done(); - } - - var curr = suite.suites[i++]; - if (!curr) { - return done(); - } - - // Avoid grep neglecting large number of tests causing a - // huge recursive loop and thus a maximum call stack error. - // See comment in `this.runTests()` for more information. - if (self._grep !== self._defaultGrep) { - Runner.immediately(function() { - self.runSuite(curr, next); - }); - } else { - self.runSuite(curr, next); - } - } - - function done(errSuite) { - self.suite = suite; - self.nextSuite = next; - - if (afterAllHookCalled) { - fn(errSuite); - } else { - // mark that the afterAll block has been called once - // and so can be skipped if there is an error in it. - afterAllHookCalled = true; - - // remove reference to test - delete self.test; - - self.hook(HOOK_TYPE_AFTER_ALL, function() { - self.emit(constants.EVENT_SUITE_END, suite); - fn(errSuite); - }); - } - } - - this.nextSuite = next; - - this.hook(HOOK_TYPE_BEFORE_ALL, function(err) { - if (err) { - return done(); - } - self.runTests(suite, next); - }); -}; - -/** - * Handle uncaught exceptions. - * - * @param {Error} err - * @private - */ -Runner.prototype.uncaught = function(err) { - if (err instanceof Pending) { - return; - } - if (err) { - debug('uncaught exception %O', err); - } else { - debug('uncaught undefined/falsy exception'); - err = createInvalidExceptionError( - 'Caught falsy/undefined exception which would otherwise be uncaught. No stack trace found; try a debugger', - err - ); - } - - if (!isError(err)) { - err = thrown2Error(err); - } - err.uncaught = true; - - var runnable = this.currentRunnable; - - if (!runnable) { - runnable = new Runnable('Uncaught error outside test suite'); - runnable.parent = this.suite; - - if (this.started) { - this.fail(runnable, err); - } else { - // Can't recover from this failure - this.emit(constants.EVENT_RUN_BEGIN); - this.fail(runnable, err); - this.emit(constants.EVENT_RUN_END); - } - - return; - } - - runnable.clearTimeout(); - - // Ignore errors if already failed or pending - // See #3226 - if (runnable.isFailed() || runnable.isPending()) { - return; - } - // we cannot recover gracefully if a Runnable has already passed - // then fails asynchronously - var alreadyPassed = runnable.isPassed(); - // this will change the state to "failed" regardless of the current value - this.fail(runnable, err); - if (!alreadyPassed) { - // recover from test - if (runnable.type === constants.EVENT_TEST_BEGIN) { - this.emit(constants.EVENT_TEST_END, runnable); - this.hookUp(HOOK_TYPE_AFTER_EACH, this.next); - return; - } - debug(runnable); - - // recover from hooks - var errSuite = this.suite; - - // XXX how about a less awful way to determine this? - // if hook failure is in afterEach block - if (runnable.fullTitle().indexOf('after each') > -1) { - return this.hookErr(err, errSuite, true); - } - // if hook failure is in beforeEach block - if (runnable.fullTitle().indexOf('before each') > -1) { - return this.hookErr(err, errSuite, false); - } - // if hook failure is in after or before blocks - return this.nextSuite(errSuite); - } - - // bail - this.emit(constants.EVENT_RUN_END); -}; - -/** - * Run the root suite and invoke `fn(failures)` - * on completion. - * - * @public - * @memberof Runner - * @param {Function} fn - * @return {Runner} Runner instance. - */ -Runner.prototype.run = function(fn) { - var self = this; - var rootSuite = this.suite; - - fn = fn || function() {}; - - function uncaught(err) { - self.uncaught(err); - } - - function start() { - // If there is an `only` filter - if (rootSuite.hasOnly()) { - rootSuite.filterOnly(); - } - self.started = true; - if (self._delay) { - self.emit(constants.EVENT_DELAY_END); - } - self.emit(constants.EVENT_RUN_BEGIN); - - self.runSuite(rootSuite, function() { - debug('finished running'); - self.emit(constants.EVENT_RUN_END); - }); - } - - debug(constants.EVENT_RUN_BEGIN); - - // references cleanup to avoid memory leaks - this.on(constants.EVENT_SUITE_END, function(suite) { - suite.cleanReferences(); - }); - - // callback - this.on(constants.EVENT_RUN_END, function() { - debug(constants.EVENT_RUN_END); - process.removeListener('uncaughtException', uncaught); - fn(self.failures); - }); - - // uncaught exception - process.on('uncaughtException', uncaught); - - if (this._delay) { - // for reporters, I guess. - // might be nice to debounce some dots while we wait. - this.emit(constants.EVENT_DELAY_BEGIN, rootSuite); - rootSuite.once(EVENT_ROOT_SUITE_RUN, start); - } else { - start(); - } - - return this; -}; - -/** - * Cleanly abort execution. - * - * @memberof Runner - * @public - * @return {Runner} Runner instance. - */ -Runner.prototype.abort = function() { - debug('aborting'); - this._abort = true; - - return this; -}; - -/** - * Filter leaks with the given globals flagged as `ok`. - * - * @private - * @param {Array} ok - * @param {Array} globals - * @return {Array} - */ -function filterLeaks(ok, globals) { - return globals.filter(function(key) { - // Firefox and Chrome exposes iframes as index inside the window object - if (/^\d+/.test(key)) { - return false; - } - - // in firefox - // if runner runs in an iframe, this iframe's window.getInterface method - // not init at first it is assigned in some seconds - if (global.navigator && /^getInterface/.test(key)) { - return false; - } - - // an iframe could be approached by window[iframeIndex] - // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak - if (global.navigator && /^\d+/.test(key)) { - return false; - } - - // Opera and IE expose global variables for HTML element IDs (issue #243) - if (/^mocha-/.test(key)) { - return false; - } - - var matched = ok.filter(function(ok) { - if (~ok.indexOf('*')) { - return key.indexOf(ok.split('*')[0]) === 0; - } - return key === ok; - }); - return !matched.length && (!global.navigator || key !== 'onerror'); - }); -} - -/** - * Check if argument is an instance of Error object or a duck-typed equivalent. - * - * @private - * @param {Object} err - object to check - * @param {string} err.message - error message - * @returns {boolean} - */ -function isError(err) { - return err instanceof Error || (err && typeof err.message === 'string'); -} - -/** - * - * Converts thrown non-extensible type into proper Error. - * - * @private - * @param {*} thrown - Non-extensible type thrown by code - * @return {Error} - */ -function thrown2Error(err) { - return new Error( - 'the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)' - ); -} - -/** - * Array of globals dependent on the environment. - * - * @return {Array} - * @deprecated - * @todo remove; long since unsupported - * @private - */ -function extraGlobals() { - if (typeof process === 'object' && typeof process.version === 'string') { - var parts = process.version.split('.'); - var nodeVersion = parts.reduce(function(a, v) { - return (a << 8) | v; - }); - - // 'errno' was renamed to process._errno in v0.9.11. - if (nodeVersion < 0x00090b) { - return ['errno']; - } - } - - return []; -} - -Runner.constants = constants; - -/** - * Node.js' `EventEmitter` - * @external EventEmitter - * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter} - */ - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./errors":6,"./pending":16,"./runnable":33,"./suite":36,"./utils":38,"_process":69,"debug":45,"events":50,"util":89}],35:[function(require,module,exports){ -(function (global){ -'use strict'; - -/** - * Provides a factory function for a {@link StatsCollector} object. - * @module - */ - -var constants = require('./runner').constants; -var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; -var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; -var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; -var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; -var EVENT_RUN_END = constants.EVENT_RUN_END; -var EVENT_TEST_END = constants.EVENT_TEST_END; - -/** - * Test statistics collector. - * - * @public - * @typedef {Object} StatsCollector - * @property {number} suites - integer count of suites run. - * @property {number} tests - integer count of tests run. - * @property {number} passes - integer count of passing tests. - * @property {number} pending - integer count of pending tests. - * @property {number} failures - integer count of failed tests. - * @property {Date} start - time when testing began. - * @property {Date} end - time when testing concluded. - * @property {number} duration - number of msecs that testing took. - */ - -var Date = global.Date; - -/** - * Provides stats such as test duration, number of tests passed / failed etc., by listening for events emitted by `runner`. - * - * @private - * @param {Runner} runner - Runner instance - * @throws {TypeError} If falsy `runner` - */ -function createStatsCollector(runner) { - /** - * @type StatsCollector - */ - var stats = { - suites: 0, - tests: 0, - passes: 0, - pending: 0, - failures: 0 + // TODO: Legacy, not needed anymore. Remove in next major version. + Buffer$1._augment = function (arr) { + arr.__proto__ = Buffer$1.prototype; + return arr }; - if (!runner) { - throw new TypeError('Missing runner argument'); - } - - runner.stats = stats; - - runner.once(EVENT_RUN_BEGIN, function() { - stats.start = new Date(); - }); - runner.on(EVENT_SUITE_BEGIN, function(suite) { - suite.root || stats.suites++; - }); - runner.on(EVENT_TEST_PASS, function() { - stats.passes++; - }); - runner.on(EVENT_TEST_FAIL, function() { - stats.failures++; - }); - runner.on(EVENT_TEST_PENDING, function() { - stats.pending++; - }); - runner.on(EVENT_TEST_END, function() { - stats.tests++; - }); - runner.once(EVENT_RUN_END, function() { - stats.end = new Date(); - stats.duration = stats.end - stats.start; - }); -} - -module.exports = createStatsCollector; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./runner":34}],36:[function(require,module,exports){ -'use strict'; - -/** - * Module dependencies. - */ -var EventEmitter = require('events').EventEmitter; -var Hook = require('./hook'); -var utils = require('./utils'); -var inherits = utils.inherits; -var debug = require('debug')('mocha:suite'); -var milliseconds = require('ms'); -var errors = require('./errors'); -var createInvalidArgumentTypeError = errors.createInvalidArgumentTypeError; - -/** - * Expose `Suite`. - */ - -exports = module.exports = Suite; - -/** - * Create a new `Suite` with the given `title` and parent `Suite`. - * - * @public - * @param {Suite} parent - Parent suite (required!) - * @param {string} title - Title - * @return {Suite} - */ -Suite.create = function(parent, title) { - var suite = new Suite(title, parent.ctx); - suite.parent = parent; - title = suite.fullTitle(); - parent.addSuite(suite); - return suite; -}; - -/** - * Constructs a new `Suite` instance with the given `title`, `ctx`, and `isRoot`. - * - * @public - * @class - * @extends EventEmitter - * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter|EventEmitter} - * @param {string} title - Suite title. - * @param {Context} parentContext - Parent context instance. - * @param {boolean} [isRoot=false] - Whether this is the root suite. - */ -function Suite(title, parentContext, isRoot) { - if (!utils.isString(title)) { - throw createInvalidArgumentTypeError( - 'Suite argument "title" must be a string. Received type "' + - typeof title + - '"', - 'title', - 'string' - ); - } - this.title = title; - function Context() {} - Context.prototype = parentContext; - this.ctx = new Context(); - this.suites = []; - this.tests = []; - this.pending = false; - this._beforeEach = []; - this._beforeAll = []; - this._afterEach = []; - this._afterAll = []; - this.root = isRoot === true; - this._timeout = 2000; - this._enableTimeouts = true; - this._slow = 75; - this._bail = false; - this._retries = -1; - this._onlyTests = []; - this._onlySuites = []; - this.delayed = false; - - this.on('newListener', function(event) { - if (deprecatedEvents[event]) { - utils.deprecate( - 'Event "' + - event + - '" is deprecated. Please let the Mocha team know about your use case: https://git.io/v6Lwm' - ); + function from$1 (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') } - }); -} -/** - * Inherit from `EventEmitter.prototype`. - */ -inherits(Suite, EventEmitter); - -/** - * Return a clone of this `Suite`. - * - * @private - * @return {Suite} - */ -Suite.prototype.clone = function() { - var suite = new Suite(this.title); - debug('clone'); - suite.ctx = this.ctx; - suite.root = this.root; - suite.timeout(this.timeout()); - suite.retries(this.retries()); - suite.enableTimeouts(this.enableTimeouts()); - suite.slow(this.slow()); - suite.bail(this.bail()); - return suite; -}; - -/** - * Set or get timeout `ms` or short-hand such as "2s". - * - * @private - * @todo Do not attempt to set value if `ms` is undefined - * @param {number|string} ms - * @return {Suite|number} for chaining - */ -Suite.prototype.timeout = function(ms) { - if (!arguments.length) { - return this._timeout; - } - if (ms.toString() === '0') { - this._enableTimeouts = false; - } - if (typeof ms === 'string') { - ms = milliseconds(ms); - } - debug('timeout %d', ms); - this._timeout = parseInt(ms, 10); - return this; -}; - -/** - * Set or get number of times to retry a failed test. - * - * @private - * @param {number|string} n - * @return {Suite|number} for chaining - */ -Suite.prototype.retries = function(n) { - if (!arguments.length) { - return this._retries; - } - debug('retries %d', n); - this._retries = parseInt(n, 10) || 0; - return this; -}; - -/** - * Set or get timeout to `enabled`. - * - * @private - * @param {boolean} enabled - * @return {Suite|boolean} self or enabled - */ -Suite.prototype.enableTimeouts = function(enabled) { - if (!arguments.length) { - return this._enableTimeouts; - } - debug('enableTimeouts %s', enabled); - this._enableTimeouts = enabled; - return this; -}; - -/** - * Set or get slow `ms` or short-hand such as "2s". - * - * @private - * @param {number|string} ms - * @return {Suite|number} for chaining - */ -Suite.prototype.slow = function(ms) { - if (!arguments.length) { - return this._slow; - } - if (typeof ms === 'string') { - ms = milliseconds(ms); - } - debug('slow %d', ms); - this._slow = ms; - return this; -}; - -/** - * Set or get whether to bail after first error. - * - * @private - * @param {boolean} bail - * @return {Suite|number} for chaining - */ -Suite.prototype.bail = function(bail) { - if (!arguments.length) { - return this._bail; - } - debug('bail %s', bail); - this._bail = bail; - return this; -}; - -/** - * Check if this suite or its parent suite is marked as pending. - * - * @private - */ -Suite.prototype.isPending = function() { - return this.pending || (this.parent && this.parent.isPending()); -}; - -/** - * Generic hook-creator. - * @private - * @param {string} title - Title of hook - * @param {Function} fn - Hook callback - * @returns {Hook} A new hook - */ -Suite.prototype._createHook = function(title, fn) { - var hook = new Hook(title, fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.retries(this.retries()); - hook.enableTimeouts(this.enableTimeouts()); - hook.slow(this.slow()); - hook.ctx = this.ctx; - hook.file = this.file; - return hook; -}; - -/** - * Run `fn(test[, done])` before running tests. - * - * @private - * @param {string} title - * @param {Function} fn - * @return {Suite} for chaining - */ -Suite.prototype.beforeAll = function(title, fn) { - if (this.isPending()) { - return this; - } - if (typeof title === 'function') { - fn = title; - title = fn.name; - } - title = '"before all" hook' + (title ? ': ' + title : ''); - - var hook = this._createHook(title, fn); - this._beforeAll.push(hook); - this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_ALL, hook); - return this; -}; - -/** - * Run `fn(test[, done])` after running tests. - * - * @private - * @param {string} title - * @param {Function} fn - * @return {Suite} for chaining - */ -Suite.prototype.afterAll = function(title, fn) { - if (this.isPending()) { - return this; - } - if (typeof title === 'function') { - fn = title; - title = fn.name; - } - title = '"after all" hook' + (title ? ': ' + title : ''); - - var hook = this._createHook(title, fn); - this._afterAll.push(hook); - this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_ALL, hook); - return this; -}; - -/** - * Run `fn(test[, done])` before each test case. - * - * @private - * @param {string} title - * @param {Function} fn - * @return {Suite} for chaining - */ -Suite.prototype.beforeEach = function(title, fn) { - if (this.isPending()) { - return this; - } - if (typeof title === 'function') { - fn = title; - title = fn.name; - } - title = '"before each" hook' + (title ? ': ' + title : ''); - - var hook = this._createHook(title, fn); - this._beforeEach.push(hook); - this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_EACH, hook); - return this; -}; - -/** - * Run `fn(test[, done])` after each test case. - * - * @private - * @param {string} title - * @param {Function} fn - * @return {Suite} for chaining - */ -Suite.prototype.afterEach = function(title, fn) { - if (this.isPending()) { - return this; - } - if (typeof title === 'function') { - fn = title; - title = fn.name; - } - title = '"after each" hook' + (title ? ': ' + title : ''); - - var hook = this._createHook(title, fn); - this._afterEach.push(hook); - this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_EACH, hook); - return this; -}; - -/** - * Add a test `suite`. - * - * @private - * @param {Suite} suite - * @return {Suite} for chaining - */ -Suite.prototype.addSuite = function(suite) { - suite.parent = this; - suite.root = false; - suite.timeout(this.timeout()); - suite.retries(this.retries()); - suite.enableTimeouts(this.enableTimeouts()); - suite.slow(this.slow()); - suite.bail(this.bail()); - this.suites.push(suite); - this.emit(constants.EVENT_SUITE_ADD_SUITE, suite); - return this; -}; - -/** - * Add a `test` to this suite. - * - * @private - * @param {Test} test - * @return {Suite} for chaining - */ -Suite.prototype.addTest = function(test) { - test.parent = this; - test.timeout(this.timeout()); - test.retries(this.retries()); - test.enableTimeouts(this.enableTimeouts()); - test.slow(this.slow()); - test.ctx = this.ctx; - this.tests.push(test); - this.emit(constants.EVENT_SUITE_ADD_TEST, test); - return this; -}; - -/** - * Return the full title generated by recursively concatenating the parent's - * full title. - * - * @memberof Suite - * @public - * @return {string} - */ -Suite.prototype.fullTitle = function() { - return this.titlePath().join(' '); -}; - -/** - * Return the title path generated by recursively concatenating the parent's - * title path. - * - * @memberof Suite - * @public - * @return {string} - */ -Suite.prototype.titlePath = function() { - var result = []; - if (this.parent) { - result = result.concat(this.parent.titlePath()); - } - if (!this.root) { - result.push(this.title); - } - return result; -}; - -/** - * Return the total number of tests. - * - * @memberof Suite - * @public - * @return {number} - */ -Suite.prototype.total = function() { - return ( - this.suites.reduce(function(sum, suite) { - return sum + suite.total(); - }, 0) + this.tests.length - ); -}; - -/** - * Iterates through each suite recursively to find all tests. Applies a - * function in the format `fn(test)`. - * - * @private - * @param {Function} fn - * @return {Suite} - */ -Suite.prototype.eachTest = function(fn) { - this.tests.forEach(fn); - this.suites.forEach(function(suite) { - suite.eachTest(fn); - }); - return this; -}; - -/** - * This will run the root suite if we happen to be running in delayed mode. - * @private - */ -Suite.prototype.run = function run() { - if (this.root) { - this.emit(constants.EVENT_ROOT_SUITE_RUN); - } -}; - -/** - * Determines whether a suite has an `only` test or suite as a descendant. - * - * @private - * @returns {Boolean} - */ -Suite.prototype.hasOnly = function hasOnly() { - return ( - this._onlyTests.length > 0 || - this._onlySuites.length > 0 || - this.suites.some(function(suite) { - return suite.hasOnly(); - }) - ); -}; - -/** - * Filter suites based on `isOnly` logic. - * - * @private - * @returns {Boolean} - */ -Suite.prototype.filterOnly = function filterOnly() { - if (this._onlyTests.length) { - // If the suite contains `only` tests, run those and ignore any nested suites. - this.tests = this._onlyTests; - this.suites = []; - } else { - // Otherwise, do not run any of the tests in this suite. - this.tests = []; - this._onlySuites.forEach(function(onlySuite) { - // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. - // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. - if (onlySuite.hasOnly()) { - onlySuite.filterOnly(); - } - }); - // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. - var onlySuites = this._onlySuites; - this.suites = this.suites.filter(function(childSuite) { - return onlySuites.indexOf(childSuite) !== -1 || childSuite.filterOnly(); - }); - } - // Keep the suite only if there is something to run - return this.tests.length > 0 || this.suites.length > 0; -}; - -/** - * Adds a suite to the list of subsuites marked `only`. - * - * @private - * @param {Suite} suite - */ -Suite.prototype.appendOnlySuite = function(suite) { - this._onlySuites.push(suite); -}; - -/** - * Adds a test to the list of tests marked `only`. - * - * @private - * @param {Test} test - */ -Suite.prototype.appendOnlyTest = function(test) { - this._onlyTests.push(test); -}; - -/** - * Returns the array of hooks by hook name; see `HOOK_TYPE_*` constants. - * @private - */ -Suite.prototype.getHooks = function getHooks(name) { - return this['_' + name]; -}; - -/** - * Cleans up the references to all the deferred functions - * (before/after/beforeEach/afterEach) and tests of a Suite. - * These must be deleted otherwise a memory leak can happen, - * as those functions may reference variables from closures, - * thus those variables can never be garbage collected as long - * as the deferred functions exist. - * - * @private - */ -Suite.prototype.cleanReferences = function cleanReferences() { - function cleanArrReferences(arr) { - for (var i = 0; i < arr.length; i++) { - delete arr[i].fn; + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer$1(that, value, encodingOrOffset, length) } + + if (typeof value === 'string') { + return fromString$1(that, value, encodingOrOffset) + } + + return fromObject$1(that, value) } - if (Array.isArray(this._beforeAll)) { - cleanArrReferences(this._beforeAll); - } - - if (Array.isArray(this._beforeEach)) { - cleanArrReferences(this._beforeEach); - } - - if (Array.isArray(this._afterAll)) { - cleanArrReferences(this._afterAll); - } - - if (Array.isArray(this._afterEach)) { - cleanArrReferences(this._afterEach); - } - - for (var i = 0; i < this.tests.length; i++) { - delete this.tests[i].fn; - } -}; - -var constants = utils.defineConstants( /** - * {@link Suite}-related constants. - * @public - * @memberof Suite - * @alias constants - * @readonly - * @static - * @enum {string} + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + Buffer$1.from = function (value, encodingOrOffset, length) { + return from$1(null, value, encodingOrOffset, length) + }; + + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + Buffer$1.prototype.__proto__ = Uint8Array.prototype; + Buffer$1.__proto__ = Uint8Array; + } + + function assertSize$1 (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } + } + + function alloc$1 (that, size, fill, encoding) { + assertSize$1(size); + if (size <= 0) { + return createBuffer$1(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer$1(that, size).fill(fill, encoding) + : createBuffer$1(that, size).fill(fill) + } + return createBuffer$1(that, size) + } + + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + Buffer$1.alloc = function (size, fill, encoding) { + return alloc$1(null, size, fill, encoding) + }; + + function allocUnsafe$1 (that, size) { + assertSize$1(size); + that = createBuffer$1(that, size < 0 ? 0 : checked$1(size) | 0); + if (!Buffer$1.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0; + } + } + return that + } + + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + Buffer$1.allocUnsafe = function (size) { + return allocUnsafe$1(null, size) + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ - { - /** - * Event emitted after a test file has been loaded Not emitted in browser. - */ - EVENT_FILE_POST_REQUIRE: 'post-require', - /** - * Event emitted before a test file has been loaded. In browser, this is emitted once an interface has been selected. - */ - EVENT_FILE_PRE_REQUIRE: 'pre-require', - /** - * Event emitted immediately after a test file has been loaded. Not emitted in browser. - */ - EVENT_FILE_REQUIRE: 'require', - /** - * Event emitted when `global.run()` is called (use with `delay` option) - */ - EVENT_ROOT_SUITE_RUN: 'run', + Buffer$1.allocUnsafeSlow = function (size) { + return allocUnsafe$1(null, size) + }; - /** - * Namespace for collection of a `Suite`'s "after all" hooks - */ - HOOK_TYPE_AFTER_ALL: 'afterAll', - /** - * Namespace for collection of a `Suite`'s "after each" hooks - */ - HOOK_TYPE_AFTER_EACH: 'afterEach', - /** - * Namespace for collection of a `Suite`'s "before all" hooks - */ - HOOK_TYPE_BEFORE_ALL: 'beforeAll', - /** - * Namespace for collection of a `Suite`'s "before all" hooks - */ - HOOK_TYPE_BEFORE_EACH: 'beforeEach', - - // the following events are all deprecated - - /** - * Emitted after an "after all" `Hook` has been added to a `Suite`. Deprecated - */ - EVENT_SUITE_ADD_HOOK_AFTER_ALL: 'afterAll', - /** - * Emitted after an "after each" `Hook` has been added to a `Suite` Deprecated - */ - EVENT_SUITE_ADD_HOOK_AFTER_EACH: 'afterEach', - /** - * Emitted after an "before all" `Hook` has been added to a `Suite` Deprecated - */ - EVENT_SUITE_ADD_HOOK_BEFORE_ALL: 'beforeAll', - /** - * Emitted after an "before each" `Hook` has been added to a `Suite` Deprecated - */ - EVENT_SUITE_ADD_HOOK_BEFORE_EACH: 'beforeEach', - /** - * Emitted after a child `Suite` has been added to a `Suite`. Deprecated - */ - EVENT_SUITE_ADD_SUITE: 'suite', - /** - * Emitted after a `Test` has been added to a `Suite`. Deprecated - */ - EVENT_SUITE_ADD_TEST: 'test' - } -); - -/** - * @summary There are no known use cases for these events. - * @desc This is a `Set`-like object having all keys being the constant's string value and the value being `true`. - * @todo Remove eventually - * @type {Object<string,boolean>} - * @ignore - */ -var deprecatedEvents = Object.keys(constants) - .filter(function(constant) { - return constant.substring(0, 15) === 'EVENT_SUITE_ADD'; - }) - .reduce(function(acc, constant) { - acc[constants[constant]] = true; - return acc; - }, utils.createMap()); - -Suite.constants = constants; - -},{"./errors":6,"./hook":7,"./utils":38,"debug":45,"events":50,"ms":60}],37:[function(require,module,exports){ -'use strict'; -var Runnable = require('./runnable'); -var utils = require('./utils'); -var errors = require('./errors'); -var createInvalidArgumentTypeError = errors.createInvalidArgumentTypeError; -var isString = utils.isString; - -module.exports = Test; - -/** - * Initialize a new `Test` with the given `title` and callback `fn`. - * - * @public - * @class - * @extends Runnable - * @param {String} title - Test title (required) - * @param {Function} [fn] - Test callback. If omitted, the Test is considered "pending" - */ -function Test(title, fn) { - if (!isString(title)) { - throw createInvalidArgumentTypeError( - 'Test argument "title" should be a string. Received type "' + - typeof title + - '"', - 'title', - 'string' - ); - } - Runnable.call(this, title, fn); - this.pending = !fn; - this.type = 'test'; -} - -/** - * Inherit from `Runnable.prototype`. - */ -utils.inherits(Test, Runnable); - -Test.prototype.clone = function() { - var test = new Test(this.title, this.fn); - test.timeout(this.timeout()); - test.slow(this.slow()); - test.enableTimeouts(this.enableTimeouts()); - test.retries(this.retries()); - test.currentRetry(this.currentRetry()); - test.globals(this.globals()); - test.parent = this.parent; - test.file = this.file; - test.ctx = this.ctx; - return test; -}; - -},{"./errors":6,"./runnable":33,"./utils":38}],38:[function(require,module,exports){ -(function (process,Buffer){ -'use strict'; - -/** - * Various utility functions used throughout Mocha's codebase. - * @module utils - */ - -/** - * Module dependencies. - */ - -var fs = require('fs'); -var path = require('path'); -var util = require('util'); -var glob = require('glob'); -var he = require('he'); -var errors = require('./errors'); -var createNoFilesMatchPatternError = errors.createNoFilesMatchPatternError; -var createMissingArgumentError = errors.createMissingArgumentError; - -var assign = (exports.assign = require('object.assign').getPolyfill()); - -/** - * Inherit the prototype methods from one constructor into another. - * - * @param {function} ctor - Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor - Constructor function to inherit prototype from. - * @throws {TypeError} if either constructor is null, or if super constructor - * lacks a prototype. - */ -exports.inherits = util.inherits; - -/** - * Escape special characters in the given string of html. - * - * @private - * @param {string} html - * @return {string} - */ -exports.escape = function(html) { - return he.encode(String(html), {useNamedReferences: false}); -}; - -/** - * Test if the given obj is type of string. - * - * @private - * @param {Object} obj - * @return {boolean} - */ -exports.isString = function(obj) { - return typeof obj === 'string'; -}; - -/** - * Watch the given `files` for changes - * and invoke `fn(file)` on modification. - * - * @private - * @param {Array} files - * @param {Function} fn - */ -exports.watch = function(files, fn) { - var options = {interval: 100}; - var debug = require('debug')('mocha:watch'); - files.forEach(function(file) { - debug('file %s', file); - fs.watchFile(file, options, function(curr, prev) { - if (prev.mtime < curr.mtime) { - fn(file); - } - }); - }); -}; - -/** - * Predicate to screen `pathname` for further consideration. - * - * @description - * Returns <code>false</code> for pathname referencing: - * <ul> - * <li>'npm' package installation directory - * <li>'git' version control directory - * </ul> - * - * @private - * @param {string} pathname - File or directory name to screen - * @return {boolean} whether pathname should be further considered - * @example - * ['node_modules', 'test.js'].filter(considerFurther); // => ['test.js'] - */ -function considerFurther(pathname) { - var ignore = ['node_modules', '.git']; - - return !~ignore.indexOf(pathname); -} - -/** - * Lookup files in the given `dir`. - * - * @description - * Filenames are returned in _traversal_ order by the OS/filesystem. - * **Make no assumption that the names will be sorted in any fashion.** - * - * @private - * @param {string} dir - * @param {string[]} [exts=['js']] - * @param {Array} [ret=[]] - * @return {Array} - */ -exports.files = function(dir, exts, ret) { - ret = ret || []; - exts = exts || ['js']; - - fs.readdirSync(dir) - .filter(considerFurther) - .forEach(function(dirent) { - var pathname = path.join(dir, dirent); - if (fs.lstatSync(pathname).isDirectory()) { - exports.files(pathname, exts, ret); - } else if (hasMatchingExtname(pathname, exts)) { - ret.push(pathname); - } - }); - - return ret; -}; - -/** - * Compute a slug from the given `str`. - * - * @private - * @param {string} str - * @return {string} - */ -exports.slug = function(str) { - return str - .toLowerCase() - .replace(/ +/g, '-') - .replace(/[^-\w]/g, ''); -}; - -/** - * Strip the function definition from `str`, and re-indent for pre whitespace. - * - * @param {string} str - * @return {string} - */ -exports.clean = function(str) { - str = str - .replace(/\r\n?|[\n\u2028\u2029]/g, '\n') - .replace(/^\uFEFF/, '') - // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content - .replace( - /^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, - '$1$2$3' - ); - - var spaces = str.match(/^\n?( *)/)[1].length; - var tabs = str.match(/^\n?(\t*)/)[1].length; - var re = new RegExp( - '^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs || spaces) + '}', - 'gm' - ); - - str = str.replace(re, ''); - - return str.trim(); -}; - -/** - * Parse the given `qs`. - * - * @private - * @param {string} qs - * @return {Object} - */ -exports.parseQuery = function(qs) { - return qs - .replace('?', '') - .split('&') - .reduce(function(obj, pair) { - var i = pair.indexOf('='); - var key = pair.slice(0, i); - var val = pair.slice(++i); - - // Due to how the URLSearchParams API treats spaces - obj[key] = decodeURIComponent(val.replace(/\+/g, '%20')); - - return obj; - }, {}); -}; - -/** - * Highlight the given string of `js`. - * - * @private - * @param {string} js - * @return {string} - */ -function highlight(js) { - return js - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>') - .replace(/('.*?')/gm, '<span class="string">$1</span>') - .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>') - .replace(/(\d+)/gm, '<span class="number">$1</span>') - .replace( - /\bnew[ \t]+(\w+)/gm, - '<span class="keyword">new</span> <span class="init">$1</span>' - ) - .replace( - /\b(function|new|throw|return|var|if|else)\b/gm, - '<span class="keyword">$1</span>' - ); -} - -/** - * Highlight the contents of tag `name`. - * - * @private - * @param {string} name - */ -exports.highlightTags = function(name) { - var code = document.getElementById('mocha').getElementsByTagName(name); - for (var i = 0, len = code.length; i < len; ++i) { - code[i].innerHTML = highlight(code[i].innerHTML); - } -}; - -/** - * If a value could have properties, and has none, this function is called, - * which returns a string representation of the empty value. - * - * Functions w/ no properties return `'[Function]'` - * Arrays w/ length === 0 return `'[]'` - * Objects w/ no properties return `'{}'` - * All else: return result of `value.toString()` - * - * @private - * @param {*} value The value to inspect. - * @param {string} typeHint The type of the value - * @returns {string} - */ -function emptyRepresentation(value, typeHint) { - switch (typeHint) { - case 'function': - return '[Function]'; - case 'object': - return '{}'; - case 'array': - return '[]'; - default: - return value.toString(); - } -} - -/** - * Takes some variable and asks `Object.prototype.toString()` what it thinks it - * is. - * - * @private - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString - * @param {*} value The value to test. - * @returns {string} Computed type - * @example - * type({}) // 'object' - * type([]) // 'array' - * type(1) // 'number' - * type(false) // 'boolean' - * type(Infinity) // 'number' - * type(null) // 'null' - * type(new Date()) // 'date' - * type(/foo/) // 'regexp' - * type('type') // 'string' - * type(global) // 'global' - * type(new String('foo') // 'object' - */ -var type = (exports.type = function type(value) { - if (value === undefined) { - return 'undefined'; - } else if (value === null) { - return 'null'; - } else if (Buffer.isBuffer(value)) { - return 'buffer'; - } - return Object.prototype.toString - .call(value) - .replace(/^\[.+\s(.+?)]$/, '$1') - .toLowerCase(); -}); - -/** - * Stringify `value`. Different behavior depending on type of value: - * - * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. - * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. - * - If `value` is an *empty* object, function, or array, return result of function - * {@link emptyRepresentation}. - * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of - * JSON.stringify(). - * - * @private - * @see exports.type - * @param {*} value - * @return {string} - */ -exports.stringify = function(value) { - var typeHint = type(value); - - if (!~['object', 'array', 'function'].indexOf(typeHint)) { - if (typeHint === 'buffer') { - var json = Buffer.prototype.toJSON.call(value); - // Based on the toJSON result - return jsonStringify( - json.data && json.type ? json.data : json, - 2 - ).replace(/,(\n|$)/g, '$1'); + function fromString$1 (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; } - // IE7/IE8 has a bizarre String constructor; needs to be coerced - // into an array and back to obj. - if (typeHint === 'string' && typeof value === 'object') { - value = value.split('').reduce(function(acc, char, idx) { - acc[idx] = char; - return acc; - }, {}); - typeHint = 'object'; + if (!Buffer$1.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength$1(string, encoding) | 0; + that = createBuffer$1(that, length); + + var actual = that.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual); + } + + return that + } + + function fromArrayLike$1 (that, array) { + var length = array.length < 0 ? 0 : checked$1(array.length) | 0; + that = createBuffer$1(that, length); + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255; + } + return that + } + + function fromArrayBuffer$1 (that, array, byteOffset, length) { + array.byteLength; // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array); + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset); } else { - return jsonStringify(value); + array = new Uint8Array(array, byteOffset, length); } - } - for (var prop in value) { - if (Object.prototype.hasOwnProperty.call(value, prop)) { - return jsonStringify( - exports.canonicalize(value, null, typeHint), - 2 - ).replace(/,(\n|$)/g, '$1'); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array; + that.__proto__ = Buffer$1.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike$1(that, array); } + return that } - return emptyRepresentation(value, typeHint); -}; + function fromObject$1 (that, obj) { + if (internalIsBuffer$1(obj)) { + var len = checked$1(obj.length) | 0; + that = createBuffer$1(that, len); -/** - * like JSON.stringify but more sense. - * - * @private - * @param {Object} object - * @param {number=} spaces - * @param {number=} depth - * @returns {*} - */ -function jsonStringify(object, spaces, depth) { - if (typeof spaces === 'undefined') { - // primitive types - return _stringify(object); + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len); + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan$1(obj.length)) { + return createBuffer$1(that, 0) + } + return fromArrayLike$1(that, obj) + } + + if (obj.type === 'Buffer' && isArray$2(obj.data)) { + return fromArrayLike$1(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } - depth = depth || 1; - var space = spaces * depth; - var str = Array.isArray(object) ? '[' : '{'; - var end = Array.isArray(object) ? ']' : '}'; - var length = - typeof object.length === 'number' - ? object.length - : Object.keys(object).length; - // `.repeat()` polyfill - function repeat(s, n) { - return new Array(n).join(s); + function checked$1 (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength$1()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength$1().toString(16) + ' bytes') + } + return length | 0 + } + Buffer$1.isBuffer = isBuffer$2; + function internalIsBuffer$1 (b) { + return !!(b != null && b._isBuffer) } - function _stringify(val) { - switch (type(val)) { - case 'null': - case 'undefined': - val = '[' + val + ']'; - break; - case 'array': - case 'object': - val = jsonStringify(val, spaces, depth + 1); - break; - case 'boolean': - case 'regexp': - case 'symbol': - case 'number': - val = - val === 0 && 1 / val === -Infinity // `-0` - ? '-0' - : val.toString(); - break; - case 'date': - var sDate = isNaN(val.getTime()) ? val.toString() : val.toISOString(); - val = '[Date: ' + sDate + ']'; - break; - case 'buffer': - var json = val.toJSON(); - // Based on the toJSON result - json = json.data && json.type ? json.data : json; - val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; - break; + Buffer$1.compare = function compare (a, b) { + if (!internalIsBuffer$1(a) || !internalIsBuffer$1(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + Buffer$1.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true default: - val = - val === '[Function]' || val === '[Circular]' - ? val - : JSON.stringify(val); // string + return false } - return val; - } - - for (var i in object) { - if (!Object.prototype.hasOwnProperty.call(object, i)) { - continue; // not my business - } - --length; - str += - '\n ' + - repeat(' ', space) + - (Array.isArray(object) ? '' : '"' + i + '": ') + // key - _stringify(object[i]) + // value - (length ? ',' : ''); // comma - } - - return ( - str + - // [], {} - (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end) - ); -} - -/** - * Return a new Thing that has the keys in sorted order. Recursive. - * - * If the Thing... - * - has already been seen, return string `'[Circular]'` - * - is `undefined`, return string `'[undefined]'` - * - is `null`, return value `null` - * - is some other primitive, return the value - * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method - * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. - * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` - * - * @private - * @see {@link exports.stringify} - * @param {*} value Thing to inspect. May or may not have properties. - * @param {Array} [stack=[]] Stack of seen values - * @param {string} [typeHint] Type hint - * @return {(Object|Array|Function|string|undefined)} - */ -exports.canonicalize = function canonicalize(value, stack, typeHint) { - var canonicalizedObj; - /* eslint-disable no-unused-vars */ - var prop; - /* eslint-enable no-unused-vars */ - typeHint = typeHint || type(value); - function withStack(value, fn) { - stack.push(value); - fn(); - stack.pop(); - } - - stack = stack || []; - - if (stack.indexOf(value) !== -1) { - return '[Circular]'; - } - - switch (typeHint) { - case 'undefined': - case 'buffer': - case 'null': - canonicalizedObj = value; - break; - case 'array': - withStack(value, function() { - canonicalizedObj = value.map(function(item) { - return exports.canonicalize(item, stack); - }); - }); - break; - case 'function': - /* eslint-disable guard-for-in */ - for (prop in value) { - canonicalizedObj = {}; - break; - } - /* eslint-enable guard-for-in */ - if (!canonicalizedObj) { - canonicalizedObj = emptyRepresentation(value, typeHint); - break; - } - /* falls through */ - case 'object': - canonicalizedObj = canonicalizedObj || {}; - withStack(value, function() { - Object.keys(value) - .sort() - .forEach(function(key) { - canonicalizedObj[key] = exports.canonicalize(value[key], stack); - }); - }); - break; - case 'date': - case 'number': - case 'regexp': - case 'boolean': - case 'symbol': - canonicalizedObj = value; - break; - default: - canonicalizedObj = value + ''; - } - - return canonicalizedObj; -}; - -/** - * Determines if pathname has a matching file extension. - * - * @private - * @param {string} pathname - Pathname to check for match. - * @param {string[]} exts - List of file extensions (sans period). - * @return {boolean} whether file extension matches. - * @example - * hasMatchingExtname('foo.html', ['js', 'css']); // => false - */ -function hasMatchingExtname(pathname, exts) { - var suffix = path.extname(pathname).slice(1); - return exts.some(function(element) { - return suffix === element; - }); -} - -/** - * Determines if pathname would be a "hidden" file (or directory) on UN*X. - * - * @description - * On UN*X, pathnames beginning with a full stop (aka dot) are hidden during - * typical usage. Dotfiles, plain-text configuration files, are prime examples. - * - * @see {@link http://xahlee.info/UnixResource_dir/writ/unix_origin_of_dot_filename.html|Origin of Dot File Names} - * - * @private - * @param {string} pathname - Pathname to check for match. - * @return {boolean} whether pathname would be considered a hidden file. - * @example - * isHiddenOnUnix('.profile'); // => true - */ -function isHiddenOnUnix(pathname) { - return path.basename(pathname)[0] === '.'; -} - -/** - * Lookup file names at the given `path`. - * - * @description - * Filenames are returned in _traversal_ order by the OS/filesystem. - * **Make no assumption that the names will be sorted in any fashion.** - * - * @public - * @memberof Mocha.utils - * @todo Fix extension handling - * @param {string} filepath - Base path to start searching from. - * @param {string[]} extensions - File extensions to look for. - * @param {boolean} recursive - Whether to recurse into subdirectories. - * @return {string[]} An array of paths. - * @throws {Error} if no files match pattern. - * @throws {TypeError} if `filepath` is directory and `extensions` not provided. - */ -exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { - var files = []; - var stat; - - if (!fs.existsSync(filepath)) { - if (fs.existsSync(filepath + '.js')) { - filepath += '.js'; - } else { - // Handle glob - files = glob.sync(filepath); - if (!files.length) { - throw createNoFilesMatchPatternError( - 'Cannot find any files matching pattern ' + exports.dQuote(filepath), - filepath - ); - } - return files; - } - } - - // Handle file - try { - stat = fs.statSync(filepath); - if (stat.isFile()) { - return filepath; - } - } catch (err) { - // ignore error - return; - } - - // Handle directory - fs.readdirSync(filepath).forEach(function(dirent) { - var pathname = path.join(filepath, dirent); - var stat; - - try { - stat = fs.statSync(pathname); - if (stat.isDirectory()) { - if (recursive) { - files = files.concat(lookupFiles(pathname, extensions, recursive)); - } - return; - } - } catch (err) { - // ignore error - return; - } - if (!extensions) { - throw createMissingArgumentError( - util.format( - 'Argument %s required when argument %s is a directory', - exports.sQuote('extensions'), - exports.sQuote('filepath') - ), - 'extensions', - 'array' - ); - } - - if ( - !stat.isFile() || - !hasMatchingExtname(pathname, extensions) || - isHiddenOnUnix(pathname) - ) { - return; - } - files.push(pathname); - }); - - return files; -}; - -/** - * process.emitWarning or a polyfill - * @see https://nodejs.org/api/process.html#process_process_emitwarning_warning_options - * @ignore - */ -function emitWarning(msg, type) { - if (process.emitWarning) { - process.emitWarning(msg, type); - } else { - process.nextTick(function() { - console.warn(type + ': ' + msg); - }); - } -} - -/** - * Show a deprecation warning. Each distinct message is only displayed once. - * Ignores empty messages. - * - * @param {string} [msg] - Warning to print - * @private - */ -exports.deprecate = function deprecate(msg) { - msg = String(msg); - if (msg && !deprecate.cache[msg]) { - deprecate.cache[msg] = true; - emitWarning(msg, 'DeprecationWarning'); - } -}; -exports.deprecate.cache = {}; - -/** - * Show a generic warning. - * Ignores empty messages. - * - * @param {string} [msg] - Warning to print - * @private - */ -exports.warn = function warn(msg) { - if (msg) { - emitWarning(msg); - } -}; - -/** - * @summary - * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) - * @description - * When invoking this function you get a filter function that get the Error.stack as an input, - * and return a prettify output. - * (i.e: strip Mocha and internal node functions from stack trace). - * @returns {Function} - */ -exports.stackTraceFilter = function() { - // TODO: Replace with `process.browser` - var is = typeof document === 'undefined' ? {node: true} : {browser: true}; - var slash = path.sep; - var cwd; - if (is.node) { - cwd = process.cwd() + slash; - } else { - cwd = (typeof location === 'undefined' - ? window.location - : location - ).href.replace(/\/[^/]*$/, '/'); - slash = '/'; - } - - function isMochaInternal(line) { - return ( - ~line.indexOf('node_modules' + slash + 'mocha' + slash) || - ~line.indexOf(slash + 'mocha.js') - ); - } - - function isNodeInternal(line) { - return ( - ~line.indexOf('(timers.js:') || - ~line.indexOf('(events.js:') || - ~line.indexOf('(node.js:') || - ~line.indexOf('(module.js:') || - ~line.indexOf('GeneratorFunctionPrototype.next (native)') || - false - ); - } - - return function(stack) { - stack = stack.split('\n'); - - stack = stack.reduce(function(list, line) { - if (isMochaInternal(line)) { - return list; - } - - if (is.node && isNodeInternal(line)) { - return list; - } - - // Clean up cwd(absolute) - if (/:\d+:\d+\)?$/.test(line)) { - line = line.replace('(' + cwd, '('); - } - - list.push(line); - return list; - }, []); - - return stack.join('\n'); }; -}; -/** - * Crude, but effective. - * @public - * @param {*} value - * @returns {boolean} Whether or not `value` is a Promise - */ -exports.isPromise = function isPromise(value) { - return ( - typeof value === 'object' && - value !== null && - typeof value.then === 'function' - ); -}; - -/** - * Clamps a numeric value to an inclusive range. - * - * @param {number} value - Value to be clamped. - * @param {numer[]} range - Two element array specifying [min, max] range. - * @returns {number} clamped value - */ -exports.clamp = function clamp(value, range) { - return Math.min(Math.max(value, range[0]), range[1]); -}; - -/** - * Single quote text by combining with undirectional ASCII quotation marks. - * - * @description - * Provides a simple means of markup for quoting text to be used in output. - * Use this to quote names of variables, methods, and packages. - * - * <samp>package 'foo' cannot be found</samp> - * - * @private - * @param {string} str - Value to be quoted. - * @returns {string} quoted value - * @example - * sQuote('n') // => 'n' - */ -exports.sQuote = function(str) { - return "'" + str + "'"; -}; - -/** - * Double quote text by combining with undirectional ASCII quotation marks. - * - * @description - * Provides a simple means of markup for quoting text to be used in output. - * Use this to quote names of datatypes, classes, pathnames, and strings. - * - * <samp>argument 'value' must be "string" or "number"</samp> - * - * @private - * @param {string} str - Value to be quoted. - * @returns {string} quoted value - * @example - * dQuote('number') // => "number" - */ -exports.dQuote = function(str) { - return '"' + str + '"'; -}; - -/** - * Provides simplistic message translation for dealing with plurality. - * - * @description - * Use this to create messages which need to be singular or plural. - * Some languages have several plural forms, so _complete_ message clauses - * are preferable to generating the message on the fly. - * - * @private - * @param {number} n - Non-negative integer - * @param {string} msg1 - Message to be used in English for `n = 1` - * @param {string} msg2 - Message to be used in English for `n = 0, 2, 3, ...` - * @returns {string} message corresponding to value of `n` - * @example - * var sprintf = require('util').format; - * var pkgs = ['one', 'two']; - * var msg = sprintf( - * ngettext( - * pkgs.length, - * 'cannot load package: %s', - * 'cannot load packages: %s' - * ), - * pkgs.map(sQuote).join(', ') - * ); - * console.log(msg); // => cannot load packages: 'one', 'two' - */ -exports.ngettext = function(n, msg1, msg2) { - if (typeof n === 'number' && n >= 0) { - return n === 1 ? msg1 : msg2; - } -}; - -/** - * It's a noop. - * @public - */ -exports.noop = function() {}; - -/** - * Creates a map-like object. - * - * @description - * A "map" is an object with no prototype, for our purposes. In some cases - * this would be more appropriate than a `Map`, especially if your environment - * doesn't support it. Recommended for use in Mocha's public APIs. - * - * @public - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map|MDN:Map} - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Custom_and_Null_objects|MDN:Object.create - Custom objects} - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign|MDN:Object.assign} - * @param {...*} [obj] - Arguments to `Object.assign()`. - * @returns {Object} An object with no prototype, having `...obj` properties - */ -exports.createMap = function(obj) { - return assign.apply( - null, - [Object.create(null)].concat(Array.prototype.slice.call(arguments)) - ); -}; - -/** - * Creates a read-only map-like object. - * - * @description - * This differs from {@link module:utils.createMap createMap} only in that - * the argument must be non-empty, because the result is frozen. - * - * @see {@link module:utils.createMap createMap} - * @param {...*} [obj] - Arguments to `Object.assign()`. - * @returns {Object} A frozen object with no prototype, having `...obj` properties - * @throws {TypeError} if argument is not a non-empty object. - */ -exports.defineConstants = function(obj) { - if (type(obj) !== 'object' || !Object.keys(obj).length) { - throw new TypeError('Invalid argument; expected a non-empty object'); - } - return Object.freeze(exports.createMap(obj)); -}; - -}).call(this,require('_process'),require("buffer").Buffer) -},{"./errors":6,"_process":69,"buffer":43,"debug":45,"fs":42,"glob":42,"he":54,"object.assign":65,"path":42,"util":89}],39:[function(require,module,exports){ -'use strict' - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} - -// Support decoding URL-safe base64 strings, as Node.js does. -// See: https://en.wikipedia.org/wiki/Base64#URL_applications -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 - -function getLens (b64) { - var len = b64.length - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // Trim off extra bytes after placeholder bytes are found - // See: https://github.com/beatgammit/base64-js/issues/42 - var validLen = b64.indexOf('=') - if (validLen === -1) validLen = len - - var placeHoldersLen = validLen === len - ? 0 - : 4 - (validLen % 4) - - return [validLen, placeHoldersLen] -} - -// base64 is 4/3 + up to two characters of the original data -function byteLength (b64) { - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} - -function _byteLength (b64, validLen, placeHoldersLen) { - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} - -function toByteArray (b64) { - var tmp - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - - var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) - - var curByte = 0 - - // if there are placeholders, only get up to the last complete 4 chars - var len = placeHoldersLen > 0 - ? validLen - 4 - : validLen - - for (var i = 0; i < len; i += 4) { - tmp = - (revLookup[b64.charCodeAt(i)] << 18) | - (revLookup[b64.charCodeAt(i + 1)] << 12) | - (revLookup[b64.charCodeAt(i + 2)] << 6) | - revLookup[b64.charCodeAt(i + 3)] - arr[curByte++] = (tmp >> 16) & 0xFF - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 2) { - tmp = - (revLookup[b64.charCodeAt(i)] << 2) | - (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 1) { - tmp = - (revLookup[b64.charCodeAt(i)] << 10) | - (revLookup[b64.charCodeAt(i + 1)] << 4) | - (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + - lookup[num >> 12 & 0x3F] + - lookup[num >> 6 & 0x3F] + - lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = - ((uint8[i] << 16) & 0xFF0000) + - ((uint8[i + 1] << 8) & 0xFF00) + - (uint8[i + 2] & 0xFF) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk( - uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) - )) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - parts.push( - lookup[tmp >> 2] + - lookup[(tmp << 4) & 0x3F] + - '==' - ) - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + uint8[len - 1] - parts.push( - lookup[tmp >> 10] + - lookup[(tmp >> 4) & 0x3F] + - lookup[(tmp << 2) & 0x3F] + - '=' - ) - } - - return parts.join('') -} - -},{}],40:[function(require,module,exports){ - -},{}],41:[function(require,module,exports){ -(function (process){ -var WritableStream = require('stream').Writable -var inherits = require('util').inherits - -module.exports = BrowserStdout - - -inherits(BrowserStdout, WritableStream) - -function BrowserStdout(opts) { - if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) - - opts = opts || {} - WritableStream.call(this, opts) - this.label = (opts.label !== undefined) ? opts.label : 'stdout' -} - -BrowserStdout.prototype._write = function(chunks, encoding, cb) { - var output = chunks.toString ? chunks.toString() : chunks - if (this.label === false) { - console.log(output) - } else { - console.log(this.label+':', output) - } - process.nextTick(cb) -} - -}).call(this,require('_process')) -},{"_process":69,"stream":84,"util":89}],42:[function(require,module,exports){ -arguments[4][40][0].apply(exports,arguments) -},{"dup":40}],43:[function(require,module,exports){ -(function (Buffer){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh <https://feross.org> - * @license MIT - */ -/* eslint-disable no-proto */ - -'use strict' - -var base64 = require('base64-js') -var ieee754 = require('ieee754') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 - -var K_MAX_LENGTH = 0x7fffffff -exports.kMaxLength = K_MAX_LENGTH - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Print warning and recommend using `buffer` v4.x which has an Object - * implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * We report that the browser does not support typed arrays if the are not subclassable - * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` - * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support - * for __proto__ and has a buggy typed array implementation. - */ -Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() - -if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && - typeof console.error === 'function') { - console.error( - 'This browser lacks typed array (Uint8Array) support which is required by ' + - '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' - ) -} - -function typedArraySupport () { - // Can typed array instances can be augmented? - try { - var arr = new Uint8Array(1) - arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } - return arr.foo() === 42 - } catch (e) { - return false - } -} - -Object.defineProperty(Buffer.prototype, 'parent', { - enumerable: true, - get: function () { - if (!Buffer.isBuffer(this)) return undefined - return this.buffer - } -}) - -Object.defineProperty(Buffer.prototype, 'offset', { - enumerable: true, - get: function () { - if (!Buffer.isBuffer(this)) return undefined - return this.byteOffset - } -}) - -function createBuffer (length) { - if (length > K_MAX_LENGTH) { - throw new RangeError('The value "' + length + '" is invalid for option "size"') - } - // Return an augmented `Uint8Array` instance - var buf = new Uint8Array(length) - buf.__proto__ = Buffer.prototype - return buf -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer (arg, encodingOrOffset, length) { - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new TypeError( - 'The "string" argument must be of type string. Received type number' - ) - } - return allocUnsafe(arg) - } - return from(arg, encodingOrOffset, length) -} - -// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 -if (typeof Symbol !== 'undefined' && Symbol.species != null && - Buffer[Symbol.species] === Buffer) { - Object.defineProperty(Buffer, Symbol.species, { - value: null, - configurable: true, - enumerable: false, - writable: false - }) -} - -Buffer.poolSize = 8192 // not used by this implementation - -function from (value, encodingOrOffset, length) { - if (typeof value === 'string') { - return fromString(value, encodingOrOffset) - } - - if (ArrayBuffer.isView(value)) { - return fromArrayLike(value) - } - - if (value == null) { - throw TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + - 'or Array-like Object. Received type ' + (typeof value) - ) - } - - if (isInstance(value, ArrayBuffer) || - (value && isInstance(value.buffer, ArrayBuffer))) { - return fromArrayBuffer(value, encodingOrOffset, length) - } - - if (typeof value === 'number') { - throw new TypeError( - 'The "value" argument must not be of type number. Received type number' - ) - } - - var valueOf = value.valueOf && value.valueOf() - if (valueOf != null && valueOf !== value) { - return Buffer.from(valueOf, encodingOrOffset, length) - } - - var b = fromObject(value) - if (b) return b - - if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && - typeof value[Symbol.toPrimitive] === 'function') { - return Buffer.from( - value[Symbol.toPrimitive]('string'), encodingOrOffset, length - ) - } - - throw new TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + - 'or Array-like Object. Received type ' + (typeof value) - ) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(value, encodingOrOffset, length) -} - -// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: -// https://github.com/feross/buffer/pull/148 -Buffer.prototype.__proto__ = Uint8Array.prototype -Buffer.__proto__ = Uint8Array - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be of type number') - } else if (size < 0) { - throw new RangeError('The value "' + size + '" is invalid for option "size"') - } -} - -function alloc (size, fill, encoding) { - assertSize(size) - if (size <= 0) { - return createBuffer(size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(size).fill(fill, encoding) - : createBuffer(size).fill(fill) - } - return createBuffer(size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(size, fill, encoding) -} - -function allocUnsafe (size) { - assertSize(size) - return createBuffer(size < 0 ? 0 : checked(size) | 0) -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(size) -} -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(size) -} - -function fromString (string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8' - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - - var length = byteLength(string, encoding) | 0 - var buf = createBuffer(length) - - var actual = buf.write(string, encoding) - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - buf = buf.slice(0, actual) - } - - return buf -} - -function fromArrayLike (array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0 - var buf = createBuffer(length) - for (var i = 0; i < length; i += 1) { - buf[i] = array[i] & 255 - } - return buf -} - -function fromArrayBuffer (array, byteOffset, length) { - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('"offset" is outside of buffer bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('"length" is outside of buffer bounds') - } - - var buf - if (byteOffset === undefined && length === undefined) { - buf = new Uint8Array(array) - } else if (length === undefined) { - buf = new Uint8Array(array, byteOffset) - } else { - buf = new Uint8Array(array, byteOffset, length) - } - - // Return an augmented `Uint8Array` instance - buf.__proto__ = Buffer.prototype - return buf -} - -function fromObject (obj) { - if (Buffer.isBuffer(obj)) { - var len = checked(obj.length) | 0 - var buf = createBuffer(len) - - if (buf.length === 0) { - return buf - } - - obj.copy(buf, 0, 0, len) - return buf - } - - if (obj.length !== undefined) { - if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { - return createBuffer(0) - } - return fromArrayLike(obj) - } - - if (obj.type === 'Buffer' && Array.isArray(obj.data)) { - return fromArrayLike(obj.data) - } -} - -function checked (length) { - // Note: cannot use `length < K_MAX_LENGTH` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= K_MAX_LENGTH) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0 - } - return Buffer.alloc(+length) -} - -Buffer.isBuffer = function isBuffer (b) { - return b != null && b._isBuffer === true && - b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false -} - -Buffer.compare = function compare (a, b) { - if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) - if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError( - 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' - ) - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i] - y = b[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, length) { - if (!Array.isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; ++i) { - length += list[i].length - } - } - - var buffer = Buffer.allocUnsafe(length) - var pos = 0 - for (i = 0; i < list.length; ++i) { - var buf = list[i] - if (isInstance(buf, Uint8Array)) { - buf = Buffer.from(buf) - } - if (!Buffer.isBuffer(buf)) { + Buffer$1.concat = function concat (list, length) { + if (!isArray$2(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } - buf.copy(buffer, pos) - pos += buf.length - } - return buffer -} -function byteLength (string, encoding) { - if (Buffer.isBuffer(string)) { - return string.length - } - if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - throw new TypeError( - 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + - 'Received type ' + typeof string - ) - } + if (list.length === 0) { + return Buffer$1.alloc(0) + } - var len = string.length - var mustMatch = (arguments.length > 2 && arguments[2] === true) - if (!mustMatch && len === 0) return 0 + var i; + if (length === undefined) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) { - return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 - } - encoding = ('' + encoding).toLowerCase() - loweredCase = true + var buffer = Buffer$1.allocUnsafe(length); + var pos = 0; + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + if (!internalIsBuffer$1(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos); + pos += buf.length; + } + return buffer + }; + + function byteLength$1 (string, encoding) { + if (internalIsBuffer$1(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string; + } + + var len = string.length; + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes$1(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes$1(string).length + default: + if (loweredCase) return utf8ToBytes$1(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } } } -} -Buffer.byteLength = byteLength + Buffer$1.byteLength = byteLength$1; -function slowToString (encoding, start, end) { - var loweredCase = false + function slowToString$1 (encoding, start, end) { + var loweredCase = false; - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0 - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0 - start >>>= 0 - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0; } - } -} + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } -// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) -// to detect a Buffer instance. It's not possible to use `instanceof Buffer` -// reliably in a browserify context because there could be multiple different -// copies of the 'buffer' package in use. This method works even for Buffer -// instances that were created from another copy of the `buffer` package. -// See: https://github.com/feross/buffer/issues/154 -Buffer.prototype._isBuffer = true + if (end === undefined || end > this.length) { + end = this.length; + } -function swap (b, n, m) { - var i = b[n] - b[n] = b[m] - b[m] = i -} + if (end <= 0) { + return '' + } -Buffer.prototype.swap16 = function swap16 () { - var len = this.length - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1) - } - return this -} + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0; + start >>>= 0; -Buffer.prototype.swap32 = function swap32 () { - var len = this.length - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3) - swap(this, i + 1, i + 2) - } - return this -} + if (end <= start) { + return '' + } -Buffer.prototype.swap64 = function swap64 () { - var len = this.length - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7) - swap(this, i + 1, i + 6) - swap(this, i + 2, i + 5) - swap(this, i + 3, i + 4) - } - return this -} + if (!encoding) encoding = 'utf8'; -Buffer.prototype.toString = function toString () { - var length = this.length - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} + while (true) { + switch (encoding) { + case 'hex': + return hexSlice$1(this, start, end) -Buffer.prototype.toLocaleString = Buffer.prototype.toString + case 'utf8': + case 'utf-8': + return utf8Slice$1(this, start, end) -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} + case 'ascii': + return asciiSlice$1(this, start, end) -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() - if (this.length > max) str += ' ... ' - return '<Buffer ' + str + '>' -} + case 'latin1': + case 'binary': + return latin1Slice$1(this, start, end) -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (isInstance(target, Uint8Array)) { - target = Buffer.from(target, target.offset, target.byteLength) - } - if (!Buffer.isBuffer(target)) { - throw new TypeError( - 'The "target" argument must be one of type Buffer or Uint8Array. ' + - 'Received type ' + (typeof target) - ) - } + case 'base64': + return base64Slice$1(this, start, end) - if (start === undefined) { - start = 0 - } - if (end === undefined) { - end = target ? target.length : 0 - } - if (thisStart === undefined) { - thisStart = 0 - } - if (thisEnd === undefined) { - thisEnd = this.length - } + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice$1(this, start, end) - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0 - end >>>= 0 - thisStart >>>= 0 - thisEnd >>>= 0 - - if (this === target) return 0 - - var x = thisEnd - thisStart - var y = end - start - var len = Math.min(x, y) - - var thisCopy = this.slice(thisStart, thisEnd) - var targetCopy = target.slice(start, end) - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i] - y = targetCopy[i] - break + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } } } - if (x < y) return -1 - if (y < x) return 1 - return 0 -} + // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect + // Buffer instances. + Buffer$1.prototype._isBuffer = true; -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset - byteOffset = 0 - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000 - } - byteOffset = +byteOffset // Coerce to Number. - if (numberIsNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1) + function swap$1 (b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; } - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1 - } else if (byteOffset < 0) { - if (dir) byteOffset = 0 - else return -1 - } + Buffer$1.prototype.swap16 = function swap16 () { + var len = this.length; + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap$1(this, i, i + 1); + } + return this + }; - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding) - } + Buffer$1.prototype.swap32 = function swap32 () { + var len = this.length; + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap$1(this, i, i + 3); + swap$1(this, i + 1, i + 2); + } + return this + }; - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (Buffer.isBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { + Buffer$1.prototype.swap64 = function swap64 () { + var len = this.length; + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap$1(this, i, i + 7); + swap$1(this, i + 1, i + 6); + swap$1(this, i + 2, i + 5); + swap$1(this, i + 3, i + 4); + } + return this + }; + + Buffer$1.prototype.toString = function toString () { + var length = this.length | 0; + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice$1(this, 0, length) + return slowToString$1.apply(this, arguments) + }; + + Buffer$1.prototype.equals = function equals (b) { + if (!internalIsBuffer$1(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer$1.compare(this, b) === 0 + }; + + Buffer$1.prototype.inspect = function inspect () { + var str = ''; + var max = INSPECT_MAX_BYTES$1; + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); + if (this.length > max) str += ' ... '; + } + return '<Buffer ' + str + '>' + }; + + Buffer$1.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!internalIsBuffer$1(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0; + } + if (end === undefined) { + end = target ? target.length : 0; + } + if (thisStart === undefined) { + thisStart = 0; + } + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { return -1 } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF // Search for a byte value [0-255] - if (typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + if (start >= end) { + return 1 + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + + if (this === target) return 0 + + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break } } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - throw new TypeError('val must be string, number or Buffer') -} + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1 - var arrLength = arr.length - var valLength = val.length + // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + function bidirectionalIndexOf$1 (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase() - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1); + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer$1.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (internalIsBuffer$1(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { return -1 } - indexSize = 2 - arrLength /= 2 - valLength /= 2 - byteOffset /= 2 - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i - if (dir) { - var foundIndex = -1 - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex - foundIndex = -1 - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength - for (i = byteOffset; i >= 0; i--) { - var found = true - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false - break + return arrayIndexOf$1(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + if (Buffer$1.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } - if (found) return i + return arrayIndexOf$1(buffer, [ val ], byteOffset, encoding, dir) } + + throw new TypeError('val must be string, number or Buffer') } - return -1 -} + function arrayIndexOf$1 (arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -} - -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } } - } - var strLen = string.length + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (numberIsNaN(parsed)) return i - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset >>> 0 - if (isFinite(length)) { - length = length >>> 0 - if (encoding === undefined) encoding = 'utf8' + var i; + if (dir) { + var foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } } else { - encoding = length - length = undefined + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + var found = true; + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break + } + } + if (found) return i + } } - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) + + return -1 } - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining + Buffer$1.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 + }; - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') + Buffer$1.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf$1(this, val, byteOffset, encoding, true) + }; + + Buffer$1.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf$1(this, val, byteOffset, encoding, false) + }; + + function hexWrite$1 (buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + // must be an even number of digits + var strLen = string.length; + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2; + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (isNaN(parsed)) return i + buf[offset + i] = parsed; + } + return i } - if (!encoding) encoding = 'utf8' + function utf8Write$1 (buf, string, offset, length) { + return blitBuffer$1(utf8ToBytes$1(string, buf.length - offset), buf, offset, length) + } - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) + function asciiWrite$1 (buf, string, offset, length) { + return blitBuffer$1(asciiToBytes$1(string), buf, offset, length) + } - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) + function latin1Write$1 (buf, string, offset, length) { + return asciiWrite$1(buf, string, offset, length) + } - case 'ascii': - return asciiWrite(this, string, offset, length) + function base64Write$1 (buf, string, offset, length) { + return blitBuffer$1(base64ToBytes$1(string), buf, offset, length) + } - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) + function ucs2Write$1 (buf, string, offset, length) { + return blitBuffer$1(utf16leToBytes$1(string, buf.length - offset), buf, offset, length) + } - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) + Buffer$1.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0; + if (isFinite(length)) { + length = length | 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8'; + + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite$1(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write$1(this, string, offset, length) + + case 'ascii': + return asciiWrite$1(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write$1(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write$1(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write$1(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer$1.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } + }; + + function base64Slice$1 (buf, start, end) { + if (start === 0 && end === buf.length) { + return fromByteArray$1(buf) + } else { + return fromByteArray$1(buf.slice(start, end)) } } -} -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} + function utf8Slice$1 (buf, start, end) { + end = Math.min(buf.length, end); + var res = []; -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] - - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 + var i = start; + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 - : 1 + : 1; - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint + break + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint + break + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } } - } + break + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray$1(res) + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH$1 = 0x1000; + + function decodeCodePointsArray$1 (codePoints) { + var len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH$1) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = ''; + var i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH$1) + ); + } + return res + } + + function asciiSlice$1 (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + return ret + } + + function latin1Slice$1 (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret + } + + function hexSlice$1 (buf, start, end) { + var len = buf.length; + + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + + var out = ''; + for (var i = start; i < end; ++i) { + out += toHex$1(buf[i]); + } + return out + } + + function utf16leSlice$1 (buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res + } + + Buffer$1.prototype.slice = function slice (start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + + var newBuf; + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end); + newBuf.__proto__ = Buffer$1.prototype; + } else { + var sliceLen = end - start; + newBuf = new Buffer$1(sliceLen, undefined); + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start]; } } - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF + return newBuf + }; + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset$1 (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') + } + + Buffer$1.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset$1(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; } - res.push(codePoint) - i += bytesPerSequence - } + return val + }; - return decodeCodePointsArray(res) -} + Buffer$1.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + checkOffset$1(offset, byteLength, this.length); + } -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000 + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } -function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } + return val + }; - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) - } - return res -} + Buffer$1.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 1, this.length); + return this[offset] + }; -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) + Buffer$1.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8) + }; - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} + Buffer$1.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1] + }; -function latin1Slice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) + Buffer$1.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]) - } - return ret -} + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) + }; -function hexSlice (buf, start, end) { - var len = buf.length + Buffer$1.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + }; - var out = '' - for (var i = start; i < end; ++i) { - out += toHex(buf[i]) - } - return out -} + Buffer$1.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset$1(offset, byteLength, this.length); -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) - } - return res -} + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + mul *= 0x80; -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end + if (val >= mul) val -= Math.pow(2, 8 * byteLength); - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } + return val + }; - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } + Buffer$1.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset$1(offset, byteLength, this.length); - if (end < start) end = start + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + mul *= 0x80; - var newBuf = this.subarray(start, end) - // Return an augmented `Uint8Array` instance - newBuf.__proto__ = Buffer.prototype - return newBuf -} + if (val >= mul) val -= Math.pow(2, 8 * byteLength); -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} + return val + }; -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) + Buffer$1.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 1, this.length); + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) + }; - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } + Buffer$1.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + var val = this[offset] | (this[offset + 1] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; - return val -} + Buffer$1.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + var val = this[offset + 1] | (this[offset] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } + Buffer$1.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | + return (this[offset]) | (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + }; -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) + Buffer$1.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) + }; -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) + Buffer$1.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + return read$1(this, offset, true, 23, 4) + }; - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 + Buffer$1.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + return read$1(this, offset, false, 23, 4) + }; - if (val >= mul) val -= Math.pow(2, 8 * byteLength) + Buffer$1.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 8, this.length); + return read$1(this, offset, true, 52, 8) + }; - return val -} + Buffer$1.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 8, this.length); + return read$1(this, offset, false, 52, 8) + }; -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) + function checkInt$1 (buf, value, offset, ext, max, min) { + if (!internalIsBuffer$1(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') } - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - this[offset] = (value & 0xff) - return offset + 1 -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - return offset + 2 -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - var limit = Math.pow(2, (8 * byteLength) - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = 0 - var mul = 1 - var sub = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1 + Buffer$1.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt$1(this, value, offset, byteLength, maxBytes, 0); } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - var limit = Math.pow(2, (8 * byteLength) - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = byteLength - 1 - var mul = 1 - var sub = 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1 + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - return offset + byteLength -} + return offset + byteLength + }; -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (value < 0) value = 0xff + value + 1 - this[offset] = (value & 0xff) - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('Index out of range') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } - - var len = end - start - - if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { - // Use built-in when available, missing from IE11 - this.copyWithin(targetStart, start, end) - } else if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (var i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start] + Buffer$1.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt$1(this, value, offset, byteLength, maxBytes, 0); } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, end), - targetStart - ) + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 1, 0xff, 0); + if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + this[offset] = (value & 0xff); + return offset + 1 + }; + + function objectWriteUInt16$1 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8; + } } - return len -} + Buffer$1.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16$1(this, value, offset, true); + } + return offset + 2 + }; -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start - start = 0 - end = this.length - } else if (typeof end === 'string') { - encoding = end - end = this.length + Buffer$1.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16$1(this, value, offset, false); } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') + return offset + 2 + }; + + function objectWriteUInt32$1 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) + } + + Buffer$1.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24); + this[offset + 2] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset] = (value & 0xff); + } else { + objectWriteUInt32$1(this, value, offset, true); } - if (val.length === 1) { - var code = val.charCodeAt(0) - if ((encoding === 'utf8' && code < 128) || - encoding === 'latin1') { - // Fast path: If `val` fits into a single byte, use that numeric value. - val = code + return offset + 4 + }; + + Buffer$1.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32$1(this, value, offset, false); + } + return offset + 4 + }; + + Buffer$1.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt$1(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt$1(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 1, 0x7f, -0x80); + if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + if (value < 0) value = 0xff + value + 1; + this[offset] = (value & 0xff); + return offset + 1 + }; + + Buffer$1.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16$1(this, value, offset, true); + } + return offset + 2 + }; + + Buffer$1.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16$1(this, value, offset, false); + } + return offset + 2 + }; + + Buffer$1.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + this[offset + 2] = (value >>> 16); + this[offset + 3] = (value >>> 24); + } else { + objectWriteUInt32$1(this, value, offset, true); + } + return offset + 4 + }; + + Buffer$1.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32$1(this, value, offset, false); + } + return offset + 4 + }; + + function checkIEEE754$1 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') + } + + function writeFloat$1 (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754$1(buf, value, offset, 4); + } + write$1(buf, value, offset, littleEndian, 23, 4); + return offset + 4 + } + + Buffer$1.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat$1(this, value, offset, true, noAssert) + }; + + Buffer$1.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat$1(this, value, offset, false, noAssert) + }; + + function writeDouble$1 (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754$1(buf, value, offset, 8); + } + write$1(buf, value, offset, littleEndian, 52, 8); + return offset + 8 + } + + Buffer$1.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble$1(this, value, offset, true, noAssert) + }; + + Buffer$1.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble$1(this, value, offset, false, noAssert) + }; + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer$1.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + var i; + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else if (len < 1000 || !Buffer$1.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ); + } + + return len + }; + + // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + Buffer$1.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + if (val.length === 1) { + var code = val.charCodeAt(0); + if (code < 256) { + val = code; + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer$1.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255; + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + + if (!val) val = 0; + + var i; + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = internalIsBuffer$1(val) + ? val + : utf8ToBytes$1(new Buffer$1(val, encoding).toString()); + var len = bytes.length; + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; } } - } else if (typeof val === 'number') { - val = val & 255 - } - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { return this + }; + + // HELPER FUNCTIONS + // ================ + + var INVALID_BASE64_RE$1 = /[^+\/0-9A-Za-z-_]/g; + + function base64clean$1 (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim$1(str).replace(INVALID_BASE64_RE$1, ''); + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '='; + } + return str } - start = start >>> 0 - end = end === undefined ? this.length : end >>> 0 - - if (!val) val = 0 - - var i - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val - } - } else { - var bytes = Buffer.isBuffer(val) - ? val - : Buffer.from(val, encoding) - var len = bytes.length - if (len === 0) { - throw new TypeError('The value "' + val + - '" is invalid for argument "value"') - } - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len] - } + function stringtrim$1 (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') } - return this -} - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g - -function base64clean (str) { - // Node takes equal signs as end of the Base64 encoding - str = str.split('=')[0] - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = str.trim().replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' + function toHex$1 (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) } - return str -} -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} + function utf8ToBytes$1 (string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i) + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + // valid lead + leadSurrogate = codePoint; + continue } - // valid lead - leadSurrogate = codePoint + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue + } - continue + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); } - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } + leadSurrogate = null; - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else { + throw new Error('Invalid code point') + } } - leadSurrogate = null + return bytes + } - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { + function asciiToBytes$1 (str) { + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + return byteArray + } + + function utf16leToBytes$1 (str, units) { + var c, hi, lo; + var byteArray = []; + for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass -// the `instanceof` check but they should be treated as of that type. -// See: https://github.com/feross/buffer/issues/166 -function isInstance (obj, type) { - return obj instanceof type || - (obj != null && obj.constructor != null && obj.constructor.name != null && - obj.constructor.name === type.name) -} -function numberIsNaN (obj) { - // For IE11 support - return obj !== obj // eslint-disable-line no-self-compare -} - -}).call(this,require("buffer").Buffer) -},{"base64-js":39,"buffer":43,"ieee754":55}],44:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":57}],45:[function(require,module,exports){ -(function (process){ -"use strict"; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -/* eslint-env browser */ - -/** - * This is the web browser implementation of `debug()`. - */ -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = localstorage(); -/** - * Colors. - */ - -exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33']; -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ -// eslint-disable-next-line complexity - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { - return true; - } // Internet Explorer and Edge do not support colors. - - - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } // Is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - - - return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 - typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker - typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); -} -/** - * Colorize log arguments if enabled. - * - * @api public - */ - - -function formatArgs(args) { - args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff); - - if (!this.useColors) { - return; - } - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function (match) { - if (match === '%%') { - return; + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); } - index++; + return byteArray + } - if (match === '%c') { - // We only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; + + function base64ToBytes$1 (str) { + return toByteArray$1(base64clean$1(str)) + } + + function blitBuffer$1 (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i]; } - }); - args.splice(lastC, 0, c); -} -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - - -function log() { - var _console; - - // This hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments); -} -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - - -function save(namespaces) { - try { - if (namespaces) { - exports.storage.setItem('debug', namespaces); - } else { - exports.storage.removeItem('debug'); - } - } catch (error) {// Swallow - // XXX (@Qix-) should we be logging these? - } -} -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - - -function load() { - var r; - - try { - r = exports.storage.getItem('debug'); - } catch (error) {} // Swallow - // XXX (@Qix-) should we be logging these? - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - - - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; + return i } - return r; -} -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - - -function localstorage() { - try { - // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context - // The Browser also has localStorage in the global context. - return localStorage; - } catch (error) {// Swallow - // XXX (@Qix-) should we be logging these? - } -} - -module.exports = require('./common')(exports); -var formatters = module.exports.formatters; -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return '[UnexpectedJSONParseError]: ' + error.message; - } -}; - - -}).call(this,require('_process')) -},{"./common":46,"_process":69}],46:[function(require,module,exports){ -"use strict"; - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - */ -function setup(env) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require('ms'); - Object.keys(env).forEach(function (key) { - createDebug[key] = env[key]; - }); - /** - * Active `debug` instances. - */ - - createDebug.instances = []; - /** - * The currently active debug mode names, and names to skip. - */ - - createDebug.names = []; - createDebug.skips = []; - /** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - - createDebug.formatters = {}; - /** - * Selects a color for a debug namespace - * @param {String} namespace The namespace string for the for the debug instance to be colored - * @return {Number|String} An ANSI color code for the given namespace - * @api private - */ - - function selectColor(namespace) { - var hash = 0; - - for (var i = 0; i < namespace.length; i++) { - hash = (hash << 5) - hash + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + function isnan$1 (val) { + return val !== val // eslint-disable-line no-self-compare } - createDebug.selectColor = selectColor; - /** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - function createDebug(namespace) { - var prevTime; + // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence + // The _isBuffer check is for Safari 5-7 support, because it's missing + // Object.prototype.constructor. Remove this eventually + function isBuffer$2(obj) { + return obj != null && (!!obj._isBuffer || isFastBuffer$1(obj) || isSlowBuffer$1(obj)) + } - function debug() { - // Disabled? - if (!debug.enabled) { - return; + function isFastBuffer$1 (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) + } + + // For Node v0.10 support. Remove this eventually. + function isSlowBuffer$1 (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer$1(obj.slice(0, 0)) + } + + // shim for using process in browser + // based off https://github.com/defunctzombie/node-process/blob/master/browser.js + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + var cachedSetTimeout = defaultSetTimout; + var cachedClearTimeout = defaultClearTimeout; + if (typeof global$2.setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } + if (typeof global$2.clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } + + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } } - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } } - var self = debug; // Set `diff` timestamp - - var curr = Number(new Date()); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - args[0] = createDebug.coerce(args[0]); - - if (typeof args[0] !== 'string') { - // Anything else let's inspect with %O - args.unshift('%O'); - } // Apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) { - // If we encounter an escaped % then don't increase the array index - if (match === '%%') { - return match; - } - - index++; - var formatter = createDebug.formatters[format]; - - if (typeof formatter === 'function') { - var val = args[index]; - match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format` - - args.splice(index, 1); - index--; - } - - return match; - }); // Apply env-specific formatting (colors, etc.) - - createDebug.formatArgs.call(self, args); - var logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = createDebug.enabled(namespace); - debug.useColors = createDebug.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; - debug.extend = extend; // Debug.formatArgs = formatArgs; - // debug.rawLog = rawLog; - // env-specific initialization logic for debug instances - - if (typeof createDebug.init === 'function') { - createDebug.init(debug); - } - - createDebug.instances.push(debug); - return debug; } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; - function destroy() { - var index = createDebug.instances.indexOf(this); - - if (index !== -1) { - createDebug.instances.splice(index, 1); - return true; - } - - return false; - } - - function extend(namespace, delimiter) { - return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); - } - /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - - - function enable(namespaces) { - createDebug.save(namespaces); - createDebug.names = []; - createDebug.skips = []; - var i; - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (i = 0; i < len; i++) { - if (!split[i]) { - // ignore empty strings - continue; + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; } - - namespaces = split[i].replace(/\*/g, '.*?'); - - if (namespaces[0] === '-') { - createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); } else { - createDebug.names.push(new RegExp('^' + namespaces + '$')); + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + function nextTick(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + } + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + var title = 'browser'; + var platform = 'browser'; + var browser$3 = true; + var env = {}; + var argv = []; + var version$1 = ''; // empty string to avoid regexp issues + var versions = {}; + var release = {}; + var config = {}; + + function noop() {} + + var on = noop; + var addListener = noop; + var once = noop; + var off = noop; + var removeListener = noop; + var removeAllListeners = noop; + var emit = noop; + + function binding(name) { + throw new Error('process.binding is not supported'); + } + + function cwd () { return '/' } + function chdir (dir) { + throw new Error('process.chdir is not supported'); + }function umask() { return 0; } + + // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + var performance = global$2.performance || {}; + var performanceNow = + performance.now || + performance.mozNow || + performance.msNow || + performance.oNow || + performance.webkitNow || + function(){ return (new Date()).getTime() }; + + // generate timestamp or delta + // see http://nodejs.org/api/process.html#process_process_hrtime + function hrtime(previousTimestamp){ + var clocktime = performanceNow.call(performance)*1e-3; + var seconds = Math.floor(clocktime); + var nanoseconds = Math.floor((clocktime%1)*1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds<0) { + seconds--; + nanoseconds += 1e9; } } - - for (i = 0; i < createDebug.instances.length; i++) { - var instance = createDebug.instances[i]; - instance.enabled = createDebug.enabled(instance.namespace); - } - } - /** - * Disable debug output. - * - * @api public - */ - - - function disable() { - createDebug.enable(''); - } - /** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - - - function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - - var i; - var len; - - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { - return false; - } - } - - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { - return true; - } - } - - return false; - } - /** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - - - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - - return val; + return [seconds,nanoseconds] } - createDebug.enable(createDebug.load()); - return createDebug; -} - -module.exports = setup; - - -},{"ms":60}],47:[function(require,module,exports){ -'use strict'; - -var keys = require('object-keys'); -var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; - -var toStr = Object.prototype.toString; -var concat = Array.prototype.concat; -var origDefineProperty = Object.defineProperty; - -var isFunction = function (fn) { - return typeof fn === 'function' && toStr.call(fn) === '[object Function]'; -}; - -var arePropertyDescriptorsSupported = function () { - var obj = {}; - try { - origDefineProperty(obj, 'x', { enumerable: false, value: obj }); - // eslint-disable-next-line no-unused-vars, no-restricted-syntax - for (var _ in obj) { // jscs:ignore disallowUnusedVariables - return false; - } - return obj.x === obj; - } catch (e) { /* this is IE 8. */ - return false; - } -}; -var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported(); - -var defineProperty = function (object, name, value, predicate) { - if (name in object && (!isFunction(predicate) || !predicate())) { - return; - } - if (supportsDescriptors) { - origDefineProperty(object, name, { - configurable: true, - enumerable: false, - value: value, - writable: true - }); - } else { - object[name] = value; - } -}; - -var defineProperties = function (object, map) { - var predicates = arguments.length > 2 ? arguments[2] : {}; - var props = keys(map); - if (hasSymbols) { - props = concat.call(props, Object.getOwnPropertySymbols(map)); - } - for (var i = 0; i < props.length; i += 1) { - defineProperty(object, props[i], map[props[i]], predicates[props[i]]); - } -}; - -defineProperties.supportsDescriptors = !!supportsDescriptors; - -module.exports = defineProperties; - -},{"object-keys":62}],48:[function(require,module,exports){ -/*! - - diff v3.5.0 - -Software License Agreement (BSD License) - -Copyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com> - -All rights reserved. - -Redistribution and use of this software in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Kevin Decker nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -@license -*/ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(false) - define([], factory); - else if(typeof exports === 'object') - exports["JsDiff"] = factory(); - else - root["JsDiff"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined; - - /*istanbul ignore end*/var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - /*istanbul ignore end*/var /*istanbul ignore start*/_character = __webpack_require__(2) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_word = __webpack_require__(3) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_sentence = __webpack_require__(6) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_css = __webpack_require__(7) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_json = __webpack_require__(8) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_array = __webpack_require__(9) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_apply = __webpack_require__(10) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_merge = __webpack_require__(13) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_dmp = __webpack_require__(16) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_xml = __webpack_require__(17) /*istanbul ignore end*/; - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /* See LICENSE file for terms of use */ - - /* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ - exports. /*istanbul ignore end*/Diff = _base2['default']; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays; - /*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches; - /*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/merge = _merge.merge; - /*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP; - /*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML; - /*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize; - - - -/***/ }), -/* 1 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports['default'] = /*istanbul ignore end*/Diff; - function Diff() {} - - Diff.prototype = { - /*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) { - /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - var callback = options.callback; - if (typeof options === 'function') { - callback = options; - options = {}; - } - this.options = options; - - var self = this; - - function done(value) { - if (callback) { - setTimeout(function () { - callback(undefined, value); - }, 0); - return true; - } else { - return value; - } - } - - // Allow subclasses to massage the input prior to running - oldString = this.castInput(oldString); - newString = this.castInput(newString); - - oldString = this.removeEmpty(this.tokenize(oldString)); - newString = this.removeEmpty(this.tokenize(newString)); - - var newLen = newString.length, - oldLen = oldString.length; - var editLength = 1; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; - - // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - // Identity per the equality and tokenizer - return done([{ value: this.join(newString), count: newString.length }]); - } - - // Main worker method. checks all permutations of a given edit length for acceptance. - function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { - var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath - 1] = undefined; - } - - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; - if (!canAdd && !canRemove) { - // If this path is a terminal then prune - bestPath[diagonalPath] = undefined; - continue; - } - - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); - } else { - basePath = addPath; // No need to clone, we've pulled it from the list - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); - } - - _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); - - // If we have hit the end of both strings, then we are done - if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { - return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); - } else { - // Otherwise track this path as a potential candidate and continue. - bestPath[diagonalPath] = basePath; - } - } - - editLength++; - } - - // Performs the length of edit iteration. Is a bit fugly as this has to support the - // sync and async mode which is never fun. Loops over execEditLength until a value - // is produced. - if (callback) { - (function exec() { - setTimeout(function () { - // This should not happen, but we want to be safe. - /* istanbul ignore next */ - if (editLength > maxEditLength) { - return callback(); - } - - if (!execEditLength()) { - exec(); - } - }, 0); - })(); - } else { - while (editLength <= maxEditLength) { - var ret = execEditLength(); - if (ret) { - return ret; - } - } - } - }, - /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) { - var last = components[components.length - 1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = { count: last.count + 1, added: added, removed: removed }; - } else { - components.push({ count: 1, added: added, removed: removed }); - } - }, - /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, - commonCount = 0; - while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { - newPos++; - oldPos++; - commonCount++; - } - - if (commonCount) { - basePath.components.push({ count: commonCount }); - } - - basePath.newPos = newPos; - return oldPos; - }, - /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) { - if (this.options.comparator) { - return this.options.comparator(left, right); - } else { - return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); - } - }, - /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); - } - } - return ret; - }, - /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) { - return value; - }, - /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) { - return value.split(''); - }, - /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) { - return chars.join(''); - } - }; - - function buildValues(diff, components, newString, oldString, useLongestToken) { - var componentPos = 0, - componentLen = components.length, - newPos = 0, - oldPos = 0; - - for (; componentPos < componentLen; componentPos++) { - var component = components[componentPos]; - if (!component.removed) { - if (!component.added && useLongestToken) { - var value = newString.slice(newPos, newPos + component.count); - value = value.map(function (value, i) { - var oldValue = oldString[oldPos + i]; - return oldValue.length > value.length ? oldValue : value; - }); - - component.value = diff.join(value); - } else { - component.value = diff.join(newString.slice(newPos, newPos + component.count)); - } - newPos += component.count; - - // Common case - if (!component.added) { - oldPos += component.count; - } - } else { - component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); - oldPos += component.count; - - // Reverse add and remove so removes are output first to match common convention - // The diffing algorithm is tied to add then remove output and this is the simplest - // route to get the desired output with minimal overhead. - if (componentPos && components[componentPos - 1].added) { - var tmp = components[componentPos - 1]; - components[componentPos - 1] = components[componentPos]; - components[componentPos] = tmp; - } - } - } - - // Special case handle for when one terminal is ignored (i.e. whitespace). - // For this case we merge the terminal into the prior string and drop the change. - // This is only available for string mode. - var lastComponent = components[componentLen - 1]; - if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { - components[componentLen - 2].value += lastComponent.value; - components.pop(); - } - - return components; - } - - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; - } - - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.characterDiff = undefined; - exports. /*istanbul ignore end*/diffChars = diffChars; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - function diffChars(oldStr, newStr, options) { - return characterDiff.diff(oldStr, newStr, options); - } - - - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.wordDiff = undefined; - exports. /*istanbul ignore end*/diffWords = diffWords; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - /*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/; - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode - // - // Ranges and exceptions: - // Latin-1 Supplement, 0080–00FF - // - U+00D7 × Multiplication sign - // - U+00F7 ÷ Division sign - // Latin Extended-A, 0100–017F - // Latin Extended-B, 0180–024F - // IPA Extensions, 0250–02AF - // Spacing Modifier Letters, 02B0–02FF - // - U+02C7 ˇ ˇ Caron - // - U+02D8 ˘ ˘ Breve - // - U+02D9 ˙ ˙ Dot Above - // - U+02DA ˚ ˚ Ring Above - // - U+02DB ˛ ˛ Ogonek - // - U+02DC ˜ ˜ Small Tilde - // - U+02DD ˝ ˝ Double Acute Accent - // Latin Extended Additional, 1E00–1EFF - var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; - - var reWhitespace = /\S/; - - var wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - wordDiff.equals = function (left, right) { - if (this.options.ignoreCase) { - left = left.toLowerCase(); - right = right.toLowerCase(); - } - return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); - }; - wordDiff.tokenize = function (value) { - var tokens = value.split(/(\s+|\b)/); - - // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. - for (var i = 0; i < tokens.length - 1; i++) { - // If we have an empty string in the next field and we have only word chars before and after, merge - if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { - tokens[i] += tokens[i + 2]; - tokens.splice(i + 1, 2); - i--; - } - } - - return tokens; - }; - - function diffWords(oldStr, newStr, options) { - options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true }); - return wordDiff.diff(oldStr, newStr, options); - } - - function diffWordsWithSpace(oldStr, newStr, options) { - return wordDiff.diff(oldStr, newStr, options); - } - - - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports. /*istanbul ignore end*/generateOptions = generateOptions; - function generateOptions(options, defaults) { - if (typeof options === 'function') { - defaults.callback = options; - } else if (options) { - for (var name in options) { - /* istanbul ignore else */ - if (options.hasOwnProperty(name)) { - defaults[name] = options[name]; - } - } - } - return defaults; - } - - - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.lineDiff = undefined; - exports. /*istanbul ignore end*/diffLines = diffLines; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - /*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/; - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - lineDiff.tokenize = function (value) { - var retLines = [], - linesAndNewlines = value.split(/(\n|\r\n)/); - - // Ignore the final empty token that occurs if the string ends with a new line - if (!linesAndNewlines[linesAndNewlines.length - 1]) { - linesAndNewlines.pop(); - } - - // Merge the content and line separators into single tokens - for (var i = 0; i < linesAndNewlines.length; i++) { - var line = linesAndNewlines[i]; - - if (i % 2 && !this.options.newlineIsToken) { - retLines[retLines.length - 1] += line; - } else { - if (this.options.ignoreWhitespace) { - line = line.trim(); - } - retLines.push(line); - } - } - - return retLines; - }; - - function diffLines(oldStr, newStr, callback) { - return lineDiff.diff(oldStr, newStr, callback); - } - function diffTrimmedLines(oldStr, newStr, callback) { - var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true }); - return lineDiff.diff(oldStr, newStr, options); - } - - - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.sentenceDiff = undefined; - exports. /*istanbul ignore end*/diffSentences = diffSentences; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - sentenceDiff.tokenize = function (value) { - return value.split(/(\S.+?[.!?])(?=\s+|$)/); - }; - - function diffSentences(oldStr, newStr, callback) { - return sentenceDiff.diff(oldStr, newStr, callback); - } - - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.cssDiff = undefined; - exports. /*istanbul ignore end*/diffCss = diffCss; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - cssDiff.tokenize = function (value) { - return value.split(/([{}:;,]|\s+)/); - }; - - function diffCss(oldStr, newStr, callback) { - return cssDiff.diff(oldStr, newStr, callback); - } - - - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.jsonDiff = undefined; - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - exports. /*istanbul ignore end*/diffJson = diffJson; - /*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - /*istanbul ignore end*/var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/; - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString; - - var jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a - // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: - jsonDiff.useLongestToken = true; - - jsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff /*istanbul ignore end*/.tokenize; - jsonDiff.castInput = function (value) { - /*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options, - undefinedReplacement = _options.undefinedReplacement, - _options$stringifyRep = _options.stringifyReplacer, - stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{ - return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v - ); - } : _options$stringifyRep; - - - return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); - }; - jsonDiff.equals = function (left, right) { - return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')) - ); - }; - - function diffJson(oldObj, newObj, options) { - return jsonDiff.diff(oldObj, newObj, options); - } - - // This function handles the presence of circular references by bailing out when encountering an - // object that is already on the "stack" of items being processed. Accepts an optional replacer - function canonicalize(obj, stack, replacementStack, replacer, key) { - stack = stack || []; - replacementStack = replacementStack || []; - - if (replacer) { - obj = replacer(key, obj); - } - - var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - - for (i = 0; i < stack.length; i += 1) { - if (stack[i] === obj) { - return replacementStack[i]; - } - } - - var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - - if ('[object Array]' === objectPrototypeToString.call(obj)) { - stack.push(obj); - canonicalizedObj = new Array(obj.length); - replacementStack.push(canonicalizedObj); - for (i = 0; i < obj.length; i += 1) { - canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); - } - stack.pop(); - replacementStack.pop(); - return canonicalizedObj; - } - - if (obj && obj.toJSON) { - obj = obj.toJSON(); - } - - if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) { - stack.push(obj); - canonicalizedObj = {}; - replacementStack.push(canonicalizedObj); - var sortedKeys = [], - _key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - for (_key in obj) { - /* istanbul ignore else */ - if (obj.hasOwnProperty(_key)) { - sortedKeys.push(_key); - } - } - sortedKeys.sort(); - for (i = 0; i < sortedKeys.length; i += 1) { - _key = sortedKeys[i]; - canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); - } - stack.pop(); - replacementStack.pop(); - } else { - canonicalizedObj = obj; - } - return canonicalizedObj; - } - - - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports.arrayDiff = undefined; - exports. /*istanbul ignore end*/diffArrays = diffArrays; - - var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - arrayDiff.tokenize = function (value) { - return value.slice(); - }; - arrayDiff.join = arrayDiff.removeEmpty = function (value) { - return value; - }; - - function diffArrays(oldArr, newArr, callback) { - return arrayDiff.diff(oldArr, newArr, callback); - } - - - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports. /*istanbul ignore end*/applyPatch = applyPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches; - - var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_distanceIterator = __webpack_require__(12) /*istanbul ignore end*/; - - /*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(_distanceIterator); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/function applyPatch(source, uniDiff) { - /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - if (typeof uniDiff === 'string') { - uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff); - } - - if (Array.isArray(uniDiff)) { - if (uniDiff.length > 1) { - throw new Error('applyPatch only works with a single input.'); - } - - uniDiff = uniDiff[0]; - } - - // Apply the diff to the input - var lines = source.split(/\r\n|[\n\v\f\r\x85]/), - delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], - hunks = uniDiff.hunks, - compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{ - return (/*istanbul ignore end*/line === patchContent - ); - }, - errorCount = 0, - fuzzFactor = options.fuzzFactor || 0, - minLine = 0, - offset = 0, - removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, - addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - - /** - * Checks if the hunk exactly fits on the provided location - */ - function hunkFits(hunk, toPos) { - for (var j = 0; j < hunk.lines.length; j++) { - var line = hunk.lines[j], - operation = line.length > 0 ? line[0] : ' ', - content = line.length > 0 ? line.substr(1) : line; - - if (operation === ' ' || operation === '-') { - // Context sanity check - if (!compareLine(toPos + 1, lines[toPos], operation, content)) { - errorCount++; - - if (errorCount > fuzzFactor) { - return false; - } - } - toPos++; - } - } - - return true; - } - - // Search best fit offsets for each hunk based on the previous ones - for (var i = 0; i < hunks.length; i++) { - var hunk = hunks[i], - maxLine = lines.length - hunk.oldLines, - localOffset = 0, - toPos = offset + hunk.oldStart - 1; - - var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine); - - for (; localOffset !== undefined; localOffset = iterator()) { - if (hunkFits(hunk, toPos + localOffset)) { - hunk.offset = offset += localOffset; - break; - } - } - - if (localOffset === undefined) { - return false; - } - - // Set lower text limit to end of the current hunk, so next ones don't try - // to fit over already patched text - minLine = hunk.offset + hunk.oldStart + hunk.oldLines; - } - - // Apply patch hunks - var diffOffset = 0; - for (var _i = 0; _i < hunks.length; _i++) { - var _hunk = hunks[_i], - _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; - diffOffset += _hunk.newLines - _hunk.oldLines; - - if (_toPos < 0) { - // Creating a new file - _toPos = 0; - } - - for (var j = 0; j < _hunk.lines.length; j++) { - var line = _hunk.lines[j], - operation = line.length > 0 ? line[0] : ' ', - content = line.length > 0 ? line.substr(1) : line, - delimiter = _hunk.linedelimiters[j]; - - if (operation === ' ') { - _toPos++; - } else if (operation === '-') { - lines.splice(_toPos, 1); - delimiters.splice(_toPos, 1); - /* istanbul ignore else */ - } else if (operation === '+') { - lines.splice(_toPos, 0, content); - delimiters.splice(_toPos, 0, delimiter); - _toPos++; - } else if (operation === '\\') { - var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; - if (previousOperation === '+') { - removeEOFNL = true; - } else if (previousOperation === '-') { - addEOFNL = true; - } - } - } - } - - // Handle EOFNL insertion/removal - if (removeEOFNL) { - while (!lines[lines.length - 1]) { - lines.pop(); - delimiters.pop(); - } - } else if (addEOFNL) { - lines.push(''); - delimiters.push('\n'); - } - for (var _k = 0; _k < lines.length - 1; _k++) { - lines[_k] = lines[_k] + delimiters[_k]; - } - return lines.join(''); - } - - // Wrapper that supports multiple file patches via callbacks. - function applyPatches(uniDiff, options) { - if (typeof uniDiff === 'string') { - uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff); - } - - var currentIndex = 0; - function processIndex() { - var index = uniDiff[currentIndex++]; - if (!index) { - return options.complete(); - } - - options.loadFile(index, function (err, data) { - if (err) { - return options.complete(err); - } - - var updatedContent = applyPatch(data, index, options); - options.patched(index, updatedContent, function (err) { - if (err) { - return options.complete(err); - } - - processIndex(); - }); - }); - } - processIndex(); - } - - - -/***/ }), -/* 11 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports. /*istanbul ignore end*/parsePatch = parsePatch; - function parsePatch(uniDiff) { - /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), - delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], - list = [], - i = 0; - - function parseIndex() { - var index = {}; - list.push(index); - - // Parse diff metadata - while (i < diffstr.length) { - var line = diffstr[i]; - - // File header found, end parsing diff metadata - if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { - break; - } - - // Diff index - var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); - if (header) { - index.index = header[1]; - } - - i++; - } - - // Parse file headers if they are defined. Unified diff requires them, but - // there's no technical issues to have an isolated hunk without file header - parseFileHeader(index); - parseFileHeader(index); - - // Parse hunks - index.hunks = []; - - while (i < diffstr.length) { - var _line = diffstr[i]; - - if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { - break; - } else if (/^@@/.test(_line)) { - index.hunks.push(parseHunk()); - } else if (_line && options.strict) { - // Ignore unexpected content unless in strict mode - throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); - } else { - i++; - } - } - } - - // Parses the --- and +++ headers, if none are found, no lines - // are consumed. - function parseFileHeader(index) { - var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); - if (fileHeader) { - var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; - var data = fileHeader[2].split('\t', 2); - var fileName = data[0].replace(/\\\\/g, '\\'); - if (/^".*"$/.test(fileName)) { - fileName = fileName.substr(1, fileName.length - 2); - } - index[keyPrefix + 'FileName'] = fileName; - index[keyPrefix + 'Header'] = (data[1] || '').trim(); - - i++; - } - } - - // Parses a hunk - // This assumes that we are at the start of a hunk. - function parseHunk() { - var chunkHeaderIndex = i, - chunkHeaderLine = diffstr[i++], - chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); - - var hunk = { - oldStart: +chunkHeader[1], - oldLines: +chunkHeader[2] || 1, - newStart: +chunkHeader[3], - newLines: +chunkHeader[4] || 1, - lines: [], - linedelimiters: [] - }; - - var addCount = 0, - removeCount = 0; - for (; i < diffstr.length; i++) { - // Lines starting with '---' could be mistaken for the "remove line" operation - // But they could be the header for the next file. Therefore prune such cases out. - if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { - break; - } - var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; - - if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { - hunk.lines.push(diffstr[i]); - hunk.linedelimiters.push(delimiters[i] || '\n'); - - if (operation === '+') { - addCount++; - } else if (operation === '-') { - removeCount++; - } else if (operation === ' ') { - addCount++; - removeCount++; - } - } else { - break; - } - } - - // Handle the empty block count case - if (!addCount && hunk.newLines === 1) { - hunk.newLines = 0; - } - if (!removeCount && hunk.oldLines === 1) { - hunk.oldLines = 0; - } - - // Perform optional sanity checking - if (options.strict) { - if (addCount !== hunk.newLines) { - throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); - } - if (removeCount !== hunk.oldLines) { - throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); - } - } - - return hunk; - } - - while (i < diffstr.length) { - parseIndex(); - } - - return list; - } - - - -/***/ }), -/* 12 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/"use strict"; - - exports.__esModule = true; - - exports["default"] = /*istanbul ignore end*/function (start, minLine, maxLine) { - var wantForward = true, - backwardExhausted = false, - forwardExhausted = false, - localOffset = 1; - - return function iterator() { - if (wantForward && !forwardExhausted) { - if (backwardExhausted) { - localOffset++; - } else { - wantForward = false; - } - - // Check if trying to fit beyond text length, and if not, check it fits - // after offset location (or desired location on first iteration) - if (start + localOffset <= maxLine) { - return localOffset; - } - - forwardExhausted = true; - } - - if (!backwardExhausted) { - if (!forwardExhausted) { - wantForward = true; - } - - // Check if trying to fit before text beginning, and if not, check it fits - // before offset location - if (minLine <= start - localOffset) { - return -localOffset++; - } - - backwardExhausted = true; - return iterator(); - } - - // We tried to fit hunk before text beginning and beyond text length, then - // hunk can't fit on the text. Return undefined - }; - }; - - - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports. /*istanbul ignore end*/calcLineCount = calcLineCount; - /*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge; - - var /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/; - - var /*istanbul ignore start*/_array = __webpack_require__(15) /*istanbul ignore end*/; - - /*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - /*istanbul ignore end*/function calcLineCount(hunk) { - /*istanbul ignore start*/var _calcOldNewLineCount = /*istanbul ignore end*/calcOldNewLineCount(hunk.lines), - oldLines = _calcOldNewLineCount.oldLines, - newLines = _calcOldNewLineCount.newLines; - - if (oldLines !== undefined) { - hunk.oldLines = oldLines; - } else { - delete hunk.oldLines; - } - - if (newLines !== undefined) { - hunk.newLines = newLines; - } else { - delete hunk.newLines; - } - } - - function merge(mine, theirs, base) { - mine = loadPatch(mine, base); - theirs = loadPatch(theirs, base); - - var ret = {}; - - // For index we just let it pass through as it doesn't have any necessary meaning. - // Leaving sanity checks on this to the API consumer that may know more about the - // meaning in their own context. - if (mine.index || theirs.index) { - ret.index = mine.index || theirs.index; - } - - if (mine.newFileName || theirs.newFileName) { - if (!fileNameChanged(mine)) { - // No header or no change in ours, use theirs (and ours if theirs does not exist) - ret.oldFileName = theirs.oldFileName || mine.oldFileName; - ret.newFileName = theirs.newFileName || mine.newFileName; - ret.oldHeader = theirs.oldHeader || mine.oldHeader; - ret.newHeader = theirs.newHeader || mine.newHeader; - } else if (!fileNameChanged(theirs)) { - // No header or no change in theirs, use ours - ret.oldFileName = mine.oldFileName; - ret.newFileName = mine.newFileName; - ret.oldHeader = mine.oldHeader; - ret.newHeader = mine.newHeader; - } else { - // Both changed... figure it out - ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); - ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); - ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); - ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); - } - } - - ret.hunks = []; - - var mineIndex = 0, - theirsIndex = 0, - mineOffset = 0, - theirsOffset = 0; - - while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { - var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity }, - theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity }; - - if (hunkBefore(mineCurrent, theirsCurrent)) { - // This patch does not overlap with any of the others, yay. - ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); - mineIndex++; - theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; - } else if (hunkBefore(theirsCurrent, mineCurrent)) { - // This patch does not overlap with any of the others, yay. - ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); - theirsIndex++; - mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; - } else { - // Overlap, merge as best we can - var mergedHunk = { - oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), - oldLines: 0, - newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), - newLines: 0, - lines: [] - }; - mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); - theirsIndex++; - mineIndex++; - - ret.hunks.push(mergedHunk); - } - } - - return ret; - } - - function loadPatch(param, base) { - if (typeof param === 'string') { - if (/^@@/m.test(param) || /^Index:/m.test(param)) { - return (/*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(param)[0] - ); - } - - if (!base) { - throw new Error('Must provide a base reference or pass in a patch'); - } - return (/*istanbul ignore start*/(0, _create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param) - ); - } - - return param; - } - - function fileNameChanged(patch) { - return patch.newFileName && patch.newFileName !== patch.oldFileName; - } - - function selectField(index, mine, theirs) { - if (mine === theirs) { - return mine; - } else { - index.conflict = true; - return { mine: mine, theirs: theirs }; - } - } - - function hunkBefore(test, check) { - return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; - } - - function cloneHunk(hunk, offset) { - return { - oldStart: hunk.oldStart, oldLines: hunk.oldLines, - newStart: hunk.newStart + offset, newLines: hunk.newLines, - lines: hunk.lines - }; - } - - function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { - // This will generally result in a conflicted hunk, but there are cases where the context - // is the only overlap where we can successfully merge the content here. - var mine = { offset: mineOffset, lines: mineLines, index: 0 }, - their = { offset: theirOffset, lines: theirLines, index: 0 }; - - // Handle any leading content - insertLeading(hunk, mine, their); - insertLeading(hunk, their, mine); - - // Now in the overlap content. Scan through and select the best changes from each. - while (mine.index < mine.lines.length && their.index < their.lines.length) { - var mineCurrent = mine.lines[mine.index], - theirCurrent = their.lines[their.index]; - - if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { - // Both modified ... - mutualChange(hunk, mine, their); - } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { - /*istanbul ignore start*/var _hunk$lines; - - /*istanbul ignore end*/ // Mine inserted - /*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine))); - } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { - /*istanbul ignore start*/var _hunk$lines2; - - /*istanbul ignore end*/ // Theirs inserted - /*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their))); - } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { - // Mine removed or edited - removal(hunk, mine, their); - } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { - // Their removed or edited - removal(hunk, their, mine, true); - } else if (mineCurrent === theirCurrent) { - // Context identity - hunk.lines.push(mineCurrent); - mine.index++; - their.index++; - } else { - // Context mismatch - conflict(hunk, collectChange(mine), collectChange(their)); - } - } - - // Now push anything that may be remaining - insertTrailing(hunk, mine); - insertTrailing(hunk, their); - - calcLineCount(hunk); - } - - function mutualChange(hunk, mine, their) { - var myChanges = collectChange(mine), - theirChanges = collectChange(their); - - if (allRemoves(myChanges) && allRemoves(theirChanges)) { - // Special case for remove changes that are supersets of one another - if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { - /*istanbul ignore start*/var _hunk$lines3; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); - return; - } else if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { - /*istanbul ignore start*/var _hunk$lines4; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges)); - return; - } - } else if ( /*istanbul ignore start*/(0, _array.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) { - /*istanbul ignore start*/var _hunk$lines5; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); - return; - } - - conflict(hunk, myChanges, theirChanges); - } - - function removal(hunk, mine, their, swap) { - var myChanges = collectChange(mine), - theirChanges = collectContext(their, myChanges); - if (theirChanges.merged) { - /*istanbul ignore start*/var _hunk$lines6; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged)); - } else { - conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); - } - } - - function conflict(hunk, mine, their) { - hunk.conflict = true; - hunk.lines.push({ - conflict: true, - mine: mine, - theirs: their - }); - } - - function insertLeading(hunk, insert, their) { - while (insert.offset < their.offset && insert.index < insert.lines.length) { - var line = insert.lines[insert.index++]; - hunk.lines.push(line); - insert.offset++; - } - } - function insertTrailing(hunk, insert) { - while (insert.index < insert.lines.length) { - var line = insert.lines[insert.index++]; - hunk.lines.push(line); - } - } - - function collectChange(state) { - var ret = [], - operation = state.lines[state.index][0]; - while (state.index < state.lines.length) { - var line = state.lines[state.index]; - - // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. - if (operation === '-' && line[0] === '+') { - operation = '+'; - } - - if (operation === line[0]) { - ret.push(line); - state.index++; - } else { - break; - } - } - - return ret; - } - function collectContext(state, matchChanges) { - var changes = [], - merged = [], - matchIndex = 0, - contextChanges = false, - conflicted = false; - while (matchIndex < matchChanges.length && state.index < state.lines.length) { - var change = state.lines[state.index], - match = matchChanges[matchIndex]; - - // Once we've hit our add, then we are done - if (match[0] === '+') { - break; - } - - contextChanges = contextChanges || change[0] !== ' '; - - merged.push(match); - matchIndex++; - - // Consume any additions in the other block as a conflict to attempt - // to pull in the remaining context after this - if (change[0] === '+') { - conflicted = true; - - while (change[0] === '+') { - changes.push(change); - change = state.lines[++state.index]; - } - } - - if (match.substr(1) === change.substr(1)) { - changes.push(change); - state.index++; - } else { - conflicted = true; - } - } - - if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { - conflicted = true; - } - - if (conflicted) { - return changes; - } - - while (matchIndex < matchChanges.length) { - merged.push(matchChanges[matchIndex++]); - } - - return { - merged: merged, - changes: changes - }; - } - - function allRemoves(changes) { - return changes.reduce(function (prev, change) { - return prev && change[0] === '-'; - }, true); - } - function skipRemoveSuperset(state, removeChanges, delta) { - for (var i = 0; i < delta; i++) { - var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); - if (state.lines[state.index + i] !== ' ' + changeContent) { - return false; - } - } - - state.index += delta; - return true; - } - - function calcOldNewLineCount(lines) { - var oldLines = 0; - var newLines = 0; - - lines.forEach(function (line) { - if (typeof line !== 'string') { - var myCount = calcOldNewLineCount(line.mine); - var theirCount = calcOldNewLineCount(line.theirs); - - if (oldLines !== undefined) { - if (myCount.oldLines === theirCount.oldLines) { - oldLines += myCount.oldLines; - } else { - oldLines = undefined; - } - } - - if (newLines !== undefined) { - if (myCount.newLines === theirCount.newLines) { - newLines += myCount.newLines; - } else { - newLines = undefined; - } - } - } else { - if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { - newLines++; - } - if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { - oldLines++; - } - } - }); - - return { oldLines: oldLines, newLines: newLines }; - } - - - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports. /*istanbul ignore end*/structuredPatch = structuredPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch; - - var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/; - - /*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - /*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { - if (!options) { - options = {}; - } - if (typeof options.context === 'undefined') { - options.context = 4; - } - - var diff = /*istanbul ignore start*/(0, _line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options); - diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier - - function contextLines(lines) { - return lines.map(function (entry) { - return ' ' + entry; - }); - } - - var hunks = []; - var oldRangeStart = 0, - newRangeStart = 0, - curRange = [], - oldLine = 1, - newLine = 1; - - /*istanbul ignore start*/var _loop = function _loop( /*istanbul ignore end*/i) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, '').split('\n'); - current.lines = lines; - - if (current.added || current.removed) { - /*istanbul ignore start*/var _curRange; - - /*istanbul ignore end*/ // If we have previous context, start with that - if (!oldRangeStart) { - var prev = diff[i - 1]; - oldRangeStart = oldLine; - newRangeStart = newLine; - - if (prev) { - curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } - - // Output our changes - /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) { - return (current.added ? '+' : '-') + entry; - }))); - - // Track the updated file position - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - // Identical context lines. Track line changes - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= options.context * 2 && i < diff.length - 2) { - /*istanbul ignore start*/var _curRange2; - - /*istanbul ignore end*/ // Overlapping - /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines))); - } else { - /*istanbul ignore start*/var _curRange3; - - /*istanbul ignore end*/ // end the range and output - var contextSize = Math.min(lines.length, options.context); - /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize)))); - - var hunk = { - oldStart: oldRangeStart, - oldLines: oldLine - oldRangeStart + contextSize, - newStart: newRangeStart, - newLines: newLine - newRangeStart + contextSize, - lines: curRange - }; - if (i >= diff.length - 2 && lines.length <= options.context) { - // EOF is inside this hunk - var oldEOFNewline = /\n$/.test(oldStr); - var newEOFNewline = /\n$/.test(newStr); - if (lines.length == 0 && !oldEOFNewline) { - // special case: old has no eol and no trailing context; no-nl can end up before adds - curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); - } else if (!oldEOFNewline || !newEOFNewline) { - curRange.push('\\ No newline at end of file'); - } - } - hunks.push(hunk); - - oldRangeStart = 0; - newRangeStart = 0; - curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - }; - - for (var i = 0; i < diff.length; i++) { - /*istanbul ignore start*/_loop( /*istanbul ignore end*/i); - } - - return { - oldFileName: oldFileName, newFileName: newFileName, - oldHeader: oldHeader, newHeader: newHeader, - hunks: hunks - }; - } - - function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { - var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); - - var ret = []; - if (oldFileName == newFileName) { - ret.push('Index: ' + oldFileName); - } - ret.push('==================================================================='); - ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); - ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); - - for (var i = 0; i < diff.hunks.length; i++) { - var hunk = diff.hunks[i]; - ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); - ret.push.apply(ret, hunk.lines); - } - - return ret.join('\n') + '\n'; - } - - function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { - return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); - } - - - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/"use strict"; - - exports.__esModule = true; - exports. /*istanbul ignore end*/arrayEqual = arrayEqual; - /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith; - function arrayEqual(a, b) { - if (a.length !== b.length) { - return false; - } - - return arrayStartsWith(a, b); - } - - function arrayStartsWith(array, start) { - if (start.length > array.length) { - return false; - } - - for (var i = 0; i < start.length; i++) { - if (start[i] !== array[i]) { - return false; - } - } - - return true; - } - - - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/"use strict"; - - exports.__esModule = true; - exports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP; - // See: http://code.google.com/p/google-diff-match-patch/wiki/API - function convertChangesToDMP(changes) { - var ret = [], - change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, - operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - for (var i = 0; i < changes.length; i++) { - change = changes[i]; - if (change.added) { - operation = 1; - } else if (change.removed) { - operation = -1; - } else { - operation = 0; - } - - ret.push([operation, change.value]); - } - return ret; - } - - - -/***/ }), -/* 17 */ -/***/ (function(module, exports) { - - /*istanbul ignore start*/'use strict'; - - exports.__esModule = true; - exports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML; - function convertChangesToXML(changes) { - var ret = []; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push('<ins>'); - } else if (change.removed) { - ret.push('<del>'); - } - - ret.push(escapeHTML(change.value)); - - if (change.added) { - ret.push('</ins>'); - } else if (change.removed) { - ret.push('</del>'); - } - } - return ret.join(''); - } - - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, '&'); - n = n.replace(/</g, '<'); - n = n.replace(/>/g, '>'); - n = n.replace(/"/g, '"'); - - return n; - } - - - -/***/ }) -/******/ ]) -}); -; -},{}],49:[function(require,module,exports){ -'use strict'; - -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; - -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - - return str.replace(matchOperatorsRe, '\\$&'); -}; - -},{}],50:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var objectCreate = Object.create || objectCreatePolyfill -var objectKeys = Object.keys || objectKeysPolyfill -var bind = Function.prototype.bind || functionBindPolyfill - -function EventEmitter() { - if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { - this._events = objectCreate(null); - this._eventsCount = 0; + var startTime = new Date(); + function uptime() { + var currentTime = new Date(); + var dif = currentTime - startTime; + return dif / 1000; } - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; + var browser$1$1 = { + nextTick: nextTick, + title: title, + browser: browser$3, + env: env, + argv: argv, + version: version$1, + versions: versions, + on: on, + addListener: addListener, + once: once, + off: off, + removeListener: removeListener, + removeAllListeners: removeAllListeners, + emit: emit, + binding: binding, + cwd: cwd, + chdir: chdir, + umask: umask, + hrtime: hrtime, + platform: platform, + release: release, + config: config, + uptime: uptime + }; -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -var hasDefineProperty; -try { - var o = {}; - if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); - hasDefineProperty = o.x === 0; -} catch (err) { hasDefineProperty = false } -if (hasDefineProperty) { - Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - // check whether the input is a positive number (whose value is zero or - // greater and not a NaN). - if (typeof arg !== 'number' || arg < 0 || arg !== arg) - throw new TypeError('"defaultMaxListeners" must be a positive number'); - defaultMaxListeners = arg; - } - }); -} else { - EventEmitter.defaultMaxListeners = defaultMaxListeners; -} - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || isNaN(n)) - throw new TypeError('"n" argument must be a positive number'); - this._maxListeners = n; - return this; -}; - -function $getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); -}; - -// These standalone emit* functions are used to optimize calling of event -// handlers for fast cases because emit() itself often has a variable number of -// arguments and can be deoptimized because of that. These functions always have -// the same number of arguments and thus do not get deoptimized, so the code -// inside them can execute faster. -function emitNone(handler, isFn, self) { - if (isFn) - handler.call(self); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self); - } -} -function emitOne(handler, isFn, self, arg1) { - if (isFn) - handler.call(self, arg1); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1); - } -} -function emitTwo(handler, isFn, self, arg1, arg2) { - if (isFn) - handler.call(self, arg1, arg2); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2); - } -} -function emitThree(handler, isFn, self, arg1, arg2, arg3) { - if (isFn) - handler.call(self, arg1, arg2, arg3); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2, arg3); - } -} - -function emitMany(handler, isFn, self, args) { - if (isFn) - handler.apply(self, args); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].apply(self, args); - } -} - -EventEmitter.prototype.emit = function emit(type) { - var er, handler, len, args, i, events; - var doError = (type === 'error'); - - events = this._events; - if (events) - doError = (doError && events.error == null); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - if (arguments.length > 1) - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Unhandled "error" event. (' + er + ')'); - err.context = er; - throw err; - } - return false; - } - - handler = events[type]; - - if (!handler) - return false; - - var isFn = typeof handler === 'function'; - len = arguments.length; - switch (len) { - // fast cases - case 1: - emitNone(handler, isFn, this); - break; - case 2: - emitOne(handler, isFn, this, arguments[1]); - break; - case 3: - emitTwo(handler, isFn, this, arguments[1], arguments[2]); - break; - case 4: - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); - break; - // slower - default: - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - emitMany(handler, isFn, this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = target._events; - if (!events) { - events = target._events = objectCreate(null); - target._eventsCount = 0; + var inherits$2; + if (typeof Object.create === 'function'){ + inherits$2 = function inherits(ctor, superCtor) { + // implementation from standard node.js 'util' module + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; + inherits$2 = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; } + var inherits$3 = inherits$2; - if (!existing) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - } else { - // If we've already got an array, just append. - if (prepend) { - existing.unshift(listener); + var formatRegExp = /%[sdj%]/g; + function format$1(f) { + if (!isString$1(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; } else { - existing.push(listener); + str += ' ' + inspect(x); } } + return str; + } - // Check for listener leak - if (!existing.warned) { - m = $getMaxListeners(target); - if (m && m > 0 && existing.length > m) { - existing.warned = true; - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' "' + String(type) + '" listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit.'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - if (typeof console === 'object' && console.warn) { - console.warn('%s: %s', w.name, w.message); + // Mark that a method should not be used. + // Returns a modified function which warns once by default. + // If --no-deprecation is set, then it is a no-op. + function deprecate$1(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global$2.process)) { + return function() { + return deprecate$1(fn, msg).apply(this, arguments); + }; + } + + if (browser$1$1.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (browser$1$1.throwDeprecation) { + throw new Error(msg); + } else if (browser$1$1.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); } + warned = true; } + return fn.apply(this, arguments); + } + + return deprecated; + } + + var debugs = {}; + var debugEnviron; + function debuglog(set) { + if (isUndefined(debugEnviron)) + debugEnviron = browser$1$1.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = 0; + debugs[set] = function() { + var msg = format$1.apply(null, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; + } + + /** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ + /* legacy: obj, showHidden, depth, colors*/ + function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + _extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); + } + + // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics + inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] + }; + + // Don't use 'blue' not visible on cmd.exe + inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' + }; + + + function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; } } - return target; -} -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - switch (arguments.length) { - case 0: - return this.listener.call(this.target); - case 1: - return this.listener.call(this.target, arguments[0]); - case 2: - return this.listener.call(this.target, arguments[0], arguments[1]); - case 3: - return this.listener.call(this.target, arguments[0], arguments[1], - arguments[2]); - default: - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) - args[i] = arguments[i]; - this.listener.apply(this.target, args); - } + function stylizeNoColor(str, styleType) { + return str; } -} -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = bind.call(onceWrapper, state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; + function arrayToHash(array) { + var hash = {}; -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; + array.forEach(function(val, idx) { + hash[val] = true; + }); -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; + return hash; + } - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - events = this._events; - if (!events) - return this; + function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString$1(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } - list = events[type]; - if (!list) - return this; + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = objectCreate(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError$1(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError$1(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray$1(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError$1(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); + } + + + function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString$1(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); + } + + + function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; + } + + + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; + } + + + function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); } } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else - spliceOne(list, position); - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (!events) - return this; - - // not listening for removeListener, no need to emit - if (!events.removeListener) { - if (arguments.length === 0) { - this._events = objectCreate(null); - this._eventsCount = 0; - } else if (events[type]) { - if (--this._eventsCount === 0) - this._events = objectCreate(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = objectKeys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = objectCreate(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (!events) - return []; - - var evlistener = events[type]; - if (!evlistener) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; -}; - -// About 1.5x faster than the two-arg version of Array#splice(). -function spliceOne(list, index) { - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) - list[i] = list[k]; - list.pop(); -} - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function objectCreatePolyfill(proto) { - var F = function() {}; - F.prototype = proto; - return new F; -} -function objectKeysPolyfill(obj) { - var keys = []; - for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { - keys.push(k); - } - return k; -} -function functionBindPolyfill(context) { - var fn = this; - return function () { - return fn.apply(context, arguments); - }; -} - -},{}],51:[function(require,module,exports){ -'use strict'; - -/* eslint no-invalid-this: 1 */ - -var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; -var slice = Array.prototype.slice; -var toStr = Object.prototype.toString; -var funcType = '[object Function]'; - -module.exports = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr.call(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); - } - var args = slice.call(arguments, 1); - - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - args.concat(slice.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return this; - } else { - return target.apply( - that, - args.concat(slice.call(arguments)) - ); - } - }; - - var boundLength = Math.max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs.push('$' + i); - } - - bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); - - if (target.prototype) { - var Empty = function Empty() {}; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; - } - - return bound; -}; - -},{}],52:[function(require,module,exports){ -'use strict'; - -var implementation = require('./implementation'); - -module.exports = Function.prototype.bind || implementation; - -},{"./implementation":51}],53:[function(require,module,exports){ -'use strict'; - -/* eslint complexity: [2, 17], max-statements: [2, 33] */ -module.exports = function hasSymbols() { - if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } - if (typeof Symbol.iterator === 'symbol') { return true; } - - var obj = {}; - var sym = Symbol('test'); - var symObj = Object(sym); - if (typeof sym === 'string') { return false; } - - if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } - if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } - - // temp disabled per https://github.com/ljharb/object.assign/issues/17 - // if (sym instanceof Symbol) { return false; } - // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 - // if (!(symObj instanceof Symbol)) { return false; } - - // if (typeof Symbol.prototype.toString !== 'function') { return false; } - // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } - - var symVal = 42; - obj[sym] = symVal; - for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax - if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } - - if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } - - var syms = Object.getOwnPropertySymbols(obj); - if (syms.length !== 1 || syms[0] !== sym) { return false; } - - if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } - - if (typeof Object.getOwnPropertyDescriptor === 'function') { - var descriptor = Object.getOwnPropertyDescriptor(obj, sym); - if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } - } - - return true; -}; - -},{}],54:[function(require,module,exports){ -(function (global){ -/*! https://mths.be/he v1.2.0 by @mathias | MIT license */ -;(function(root) { - - // Detect free variables `exports`. - var freeExports = typeof exports == 'object' && exports; - - // Detect free variable `module`. - var freeModule = typeof module == 'object' && module && - module.exports == freeExports && module; - - // Detect free variable `global`, from Node.js or Browserified code, - // and use it as `root`. - var freeGlobal = typeof global == 'object' && global; - if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { - root = freeGlobal; - } - - /*--------------------------------------------------------------------------*/ - - // All astral symbols. - var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; - // All ASCII symbols (not just printable ASCII) except those listed in the - // first column of the overrides table. - // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides - var regexAsciiWhitelist = /[\x01-\x7F]/g; - // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or - // code points listed in the first column of the overrides table on - // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides. - var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g; - - var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g; - var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'}; - - var regexEscape = /["&'<>`]/g; - var escapeMap = { - '"': '"', - '&': '&', - '\'': ''', - '<': '<', - // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the - // following is not strictly necessary unless it’s part of a tag or an - // unquoted attribute value. We’re only escaping it to support those - // situations, and for XML support. - '>': '>', - // In Internet Explorer ≤ 8, the backtick character can be used - // to break out of (un)quoted attribute values or HTML comments. - // See http://html5sec.org/#102, http://html5sec.org/#108, and - // http://html5sec.org/#133. - '`': '`' - }; - - var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/; - var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; - var regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g; - var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'}; - var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'}; - var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'}; - var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]; - - /*--------------------------------------------------------------------------*/ - - var stringFromCharCode = String.fromCharCode; - - var object = {}; - var hasOwnProperty = object.hasOwnProperty; - var has = function(object, propertyName) { - return hasOwnProperty.call(object, propertyName); - }; - - var contains = function(array, value) { - var index = -1; - var length = array.length; - while (++index < length) { - if (array[index] == value) { - return true; - } - } - return false; - }; - - var merge = function(options, defaults) { - if (!options) { - return defaults; - } - var result = {}; - var key; - for (key in defaults) { - // A `hasOwnProperty` check is not needed here, since only recognized - // option names are used anyway. Any others are ignored. - result[key] = has(options, key) ? options[key] : defaults[key]; - } - return result; - }; - - // Modified version of `ucs2encode`; see https://mths.be/punycode. - var codePointToSymbol = function(codePoint, strict) { - var output = ''; - if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) { - // See issue #4: - // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is - // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD - // REPLACEMENT CHARACTER.” - if (strict) { - parseError('character reference outside the permissible Unicode range'); - } - return '\uFFFD'; - } - if (has(decodeMapNumeric, codePoint)) { - if (strict) { - parseError('disallowed character reference'); - } - return decodeMapNumeric[codePoint]; - } - if (strict && contains(invalidReferenceCodePoints, codePoint)) { - parseError('disallowed character reference'); - } - if (codePoint > 0xFFFF) { - codePoint -= 0x10000; - output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - output += stringFromCharCode(codePoint); - return output; - }; - - var hexEscape = function(codePoint) { - return '&#x' + codePoint.toString(16).toUpperCase() + ';'; - }; - - var decEscape = function(codePoint) { - return '&#' + codePoint + ';'; - }; - - var parseError = function(message) { - throw Error('Parse error: ' + message); - }; - - /*--------------------------------------------------------------------------*/ - - var encode = function(string, options) { - options = merge(options, encode.options); - var strict = options.strict; - if (strict && regexInvalidRawCodePoint.test(string)) { - parseError('forbidden code point'); - } - var encodeEverything = options.encodeEverything; - var useNamedReferences = options.useNamedReferences; - var allowUnsafeSymbols = options.allowUnsafeSymbols; - var escapeCodePoint = options.decimal ? decEscape : hexEscape; - - var escapeBmpSymbol = function(symbol) { - return escapeCodePoint(symbol.charCodeAt(0)); - }; - - if (encodeEverything) { - // Encode ASCII symbols. - string = string.replace(regexAsciiWhitelist, function(symbol) { - // Use named references if requested & possible. - if (useNamedReferences && has(encodeMap, symbol)) { - return '&' + encodeMap[symbol] + ';'; - } - return escapeBmpSymbol(symbol); - }); - // Shorten a few escapes that represent two symbols, of which at least one - // is within the ASCII range. - if (useNamedReferences) { - string = string - .replace(/>\u20D2/g, '>⃒') - .replace(/<\u20D2/g, '<⃒') - .replace(/fj/g, 'fj'); - } - // Encode non-ASCII symbols. - if (useNamedReferences) { - // Encode non-ASCII symbols that can be replaced with a named reference. - string = string.replace(regexEncodeNonAscii, function(string) { - // Note: there is no need to check `has(encodeMap, string)` here. - return '&' + encodeMap[string] + ';'; - }); - } - // Note: any remaining non-ASCII symbols are handled outside of the `if`. - } else if (useNamedReferences) { - // Apply named character references. - // Encode `<>"'&` using named character references. - if (!allowUnsafeSymbols) { - string = string.replace(regexEscape, function(string) { - return '&' + encodeMap[string] + ';'; // no need to check `has()` here - }); - } - // Shorten escapes that represent two symbols, of which at least one is - // `<>"'&`. - string = string - .replace(/>\u20D2/g, '>⃒') - .replace(/<\u20D2/g, '<⃒'); - // Encode non-ASCII symbols that can be replaced with a named reference. - string = string.replace(regexEncodeNonAscii, function(string) { - // Note: there is no need to check `has(encodeMap, string)` here. - return '&' + encodeMap[string] + ';'; - }); - } else if (!allowUnsafeSymbols) { - // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled - // using named character references. - string = string.replace(regexEscape, escapeBmpSymbol); - } - return string - // Encode astral symbols. - .replace(regexAstralSymbols, function($0) { - // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - var high = $0.charCodeAt(0); - var low = $0.charCodeAt(1); - var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; - return escapeCodePoint(codePoint); - }) - // Encode any remaining BMP symbols that are not printable ASCII symbols - // using a hexadecimal escape. - .replace(regexBmpWhitelist, escapeBmpSymbol); - }; - // Expose default options (so they can be overridden globally). - encode.options = { - 'allowUnsafeSymbols': false, - 'encodeEverything': false, - 'strict': false, - 'useNamedReferences': false, - 'decimal' : false - }; - - var decode = function(html, options) { - options = merge(options, decode.options); - var strict = options.strict; - if (strict && regexInvalidEntity.test(html)) { - parseError('malformed character reference'); - } - return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) { - var codePoint; - var semicolon; - var decDigits; - var hexDigits; - var reference; - var next; - - if ($1) { - reference = $1; - // Note: there is no need to check `has(decodeMap, reference)`. - return decodeMap[reference]; - } - - if ($2) { - // Decode named character references without trailing `;`, e.g. `&`. - // This is only a parse error if it gets converted to `&`, or if it is - // followed by `=` in an attribute context. - reference = $2; - next = $3; - if (next && options.isAttributeValue) { - if (strict && next == '=') { - parseError('`&` did not start a character reference'); - } - return $0; - } else { - if (strict) { - parseError( - 'named character reference was not terminated by a semicolon' - ); - } - // Note: there is no need to check `has(decodeMapLegacy, reference)`. - return decodeMapLegacy[reference] + (next || ''); - } - } - - if ($4) { - // Decode decimal escapes, e.g. `𝌆`. - decDigits = $4; - semicolon = $5; - if (strict && !semicolon) { - parseError('character reference was not terminated by a semicolon'); - } - codePoint = parseInt(decDigits, 10); - return codePointToSymbol(codePoint, strict); - } - - if ($6) { - // Decode hexadecimal escapes, e.g. `𝌆`. - hexDigits = $6; - semicolon = $7; - if (strict && !semicolon) { - parseError('character reference was not terminated by a semicolon'); - } - codePoint = parseInt(hexDigits, 16); - return codePointToSymbol(codePoint, strict); - } - - // If we’re still here, `if ($7)` is implied; it’s an ambiguous - // ampersand for sure. https://mths.be/notes/ambiguous-ampersands - if (strict) { - parseError( - 'named character reference was not terminated by a semicolon' - ); - } - return $0; - }); - }; - // Expose default options (so they can be overridden globally). - decode.options = { - 'isAttributeValue': false, - 'strict': false - }; - - var escape = function(string) { - return string.replace(regexEscape, function($0) { - // Note: there is no need to check `has(escapeMap, $0)` here. - return escapeMap[$0]; - }); - }; - - /*--------------------------------------------------------------------------*/ - - var he = { - 'version': '1.2.0', - 'encode': encode, - 'decode': decode, - 'escape': escape, - 'unescape': decode - }; - - // Some AMD build optimizers, like r.js, check for specific condition patterns - // like the following: - if ( - false - ) { - define(function() { - return he; - }); - } else if (freeExports && !freeExports.nodeType) { - if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+ - freeModule.exports = he; - } else { // in Narwhal or RingoJS v0.7.0- - for (var key in he) { - has(he, key) && (freeExports[key] = he[key]); - } - } - } else { // in Rhino or a web browser - root.he = he; - } - -}(this)); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],55:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = (nBytes * 8) - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = (nBytes * 8) - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = ((value * c) - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],56:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - -},{}],57:[function(require,module,exports){ -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh <https://feross.org> - * @license MIT - */ - -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -} - -function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) -} - -},{}],58:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - -},{}],59:[function(require,module,exports){ -(function (process){ -var path = require('path'); -var fs = require('fs'); -var _0777 = parseInt('0777', 8); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, opts, f, made) { - if (typeof opts === 'function') { - f = opts; - opts = {}; - } - else if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; - } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - p = path.resolve(p); - - xfs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), opts, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, opts, cb, made); - }); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - xfs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - } - }); -} - -mkdirP.sync = function sync (p, opts, made) { - if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; - } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - p = path.resolve(p); - - try { - xfs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), opts, made); - sync(p, opts, made); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = xfs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - } - } - - return made; -}; - -}).call(this,require('_process')) -},{"_process":69,"fs":42,"path":42}],60:[function(require,module,exports){ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var w = d * 7; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'weeks': - case 'week': - case 'w': - return n * w; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - return ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); -} - -},{}],61:[function(require,module,exports){ -'use strict'; - -var keysShim; -if (!Object.keys) { - // modified from https://github.com/es-shims/es5-shim - var has = Object.prototype.hasOwnProperty; - var toStr = Object.prototype.toString; - var isArgs = require('./isArguments'); // eslint-disable-line global-require - var isEnumerable = Object.prototype.propertyIsEnumerable; - var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); - var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); - var dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' - ]; - var equalsConstructorPrototype = function (o) { - var ctor = o.constructor; - return ctor && ctor.prototype === o; - }; - var excludedKeys = { - $applicationCache: true, - $console: true, - $external: true, - $frame: true, - $frameElement: true, - $frames: true, - $innerHeight: true, - $innerWidth: true, - $outerHeight: true, - $outerWidth: true, - $pageXOffset: true, - $pageYOffset: true, - $parent: true, - $scrollLeft: true, - $scrollTop: true, - $scrollX: true, - $scrollY: true, - $self: true, - $webkitIndexedDB: true, - $webkitStorageInfo: true, - $window: true - }; - var hasAutomationEqualityBug = (function () { - /* global window */ - if (typeof window === 'undefined') { return false; } - for (var k in window) { - try { - if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { - try { - equalsConstructorPrototype(window[k]); - } catch (e) { - return true; - } - } - } catch (e) { - return true; - } - } - return false; - }()); - var equalsConstructorPrototypeIfNotBuggy = function (o) { - /* global window */ - if (typeof window === 'undefined' || !hasAutomationEqualityBug) { - return equalsConstructorPrototype(o); - } - try { - return equalsConstructorPrototype(o); - } catch (e) { - return false; - } - }; - - keysShim = function keys(object) { - var isObject = object !== null && typeof object === 'object'; - var isFunction = toStr.call(object) === '[object Function]'; - var isArguments = isArgs(object); - var isString = isObject && toStr.call(object) === '[object String]'; - var theKeys = []; - - if (!isObject && !isFunction && !isArguments) { - throw new TypeError('Object.keys called on a non-object'); - } - - var skipProto = hasProtoEnumBug && isFunction; - if (isString && object.length > 0 && !has.call(object, 0)) { - for (var i = 0; i < object.length; ++i) { - theKeys.push(String(i)); - } - } - - if (isArguments && object.length > 0) { - for (var j = 0; j < object.length; ++j) { - theKeys.push(String(j)); - } - } else { - for (var name in object) { - if (!(skipProto && name === 'prototype') && has.call(object, name)) { - theKeys.push(String(name)); - } - } - } - - if (hasDontEnumBug) { - var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); - - for (var k = 0; k < dontEnums.length; ++k) { - if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { - theKeys.push(dontEnums[k]); - } - } - } - return theKeys; - }; -} -module.exports = keysShim; - -},{"./isArguments":63}],62:[function(require,module,exports){ -'use strict'; - -var slice = Array.prototype.slice; -var isArgs = require('./isArguments'); - -var origKeys = Object.keys; -var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation'); - -var originalKeys = Object.keys; - -keysShim.shim = function shimObjectKeys() { - if (Object.keys) { - var keysWorksWithArguments = (function () { - // Safari 5.0 bug - var args = Object.keys(arguments); - return args && args.length === arguments.length; - }(1, 2)); - if (!keysWorksWithArguments) { - Object.keys = function keys(object) { // eslint-disable-line func-name-matching - if (isArgs(object)) { - return originalKeys(slice.call(object)); - } - return originalKeys(object); - }; - } - } else { - Object.keys = keysShim; - } - return Object.keys || keysShim; -}; - -module.exports = keysShim; - -},{"./implementation":61,"./isArguments":63}],63:[function(require,module,exports){ -'use strict'; - -var toStr = Object.prototype.toString; - -module.exports = function isArguments(value) { - var str = toStr.call(value); - var isArgs = str === '[object Arguments]'; - if (!isArgs) { - isArgs = str !== '[object Array]' && - value !== null && - typeof value === 'object' && - typeof value.length === 'number' && - value.length >= 0 && - toStr.call(value.callee) === '[object Function]'; - } - return isArgs; -}; - -},{}],64:[function(require,module,exports){ -'use strict'; - -// modified from https://github.com/es-shims/es6-shim -var keys = require('object-keys'); -var bind = require('function-bind'); -var canBeObject = function (obj) { - return typeof obj !== 'undefined' && obj !== null; -}; -var hasSymbols = require('has-symbols/shams')(); -var toObject = Object; -var push = bind.call(Function.call, Array.prototype.push); -var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable); -var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null; - -module.exports = function assign(target, source1) { - if (!canBeObject(target)) { throw new TypeError('target must be an object'); } - var objTarget = toObject(target); - var s, source, i, props, syms, value, key; - for (s = 1; s < arguments.length; ++s) { - source = toObject(arguments[s]); - props = keys(source); - var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols); - if (getSymbols) { - syms = getSymbols(source); - for (i = 0; i < syms.length; ++i) { - key = syms[i]; - if (propIsEnumerable(source, key)) { - push(props, key); - } - } - } - for (i = 0; i < props.length; ++i) { - key = props[i]; - value = source[key]; - if (propIsEnumerable(source, key)) { - objTarget[key] = value; - } - } - } - return objTarget; -}; - -},{"function-bind":52,"has-symbols/shams":53,"object-keys":62}],65:[function(require,module,exports){ -'use strict'; - -var defineProperties = require('define-properties'); - -var implementation = require('./implementation'); -var getPolyfill = require('./polyfill'); -var shim = require('./shim'); - -var polyfill = getPolyfill(); - -defineProperties(polyfill, { - getPolyfill: getPolyfill, - implementation: implementation, - shim: shim -}); - -module.exports = polyfill; - -},{"./implementation":64,"./polyfill":66,"./shim":67,"define-properties":47}],66:[function(require,module,exports){ -'use strict'; - -var implementation = require('./implementation'); - -var lacksProperEnumerationOrder = function () { - if (!Object.assign) { - return false; - } - // v8, specifically in node 4.x, has a bug with incorrect property enumeration order - // note: this does not detect the bug unless there's 20 characters - var str = 'abcdefghijklmnopqrst'; - var letters = str.split(''); - var map = {}; - for (var i = 0; i < letters.length; ++i) { - map[letters[i]] = letters[i]; - } - var obj = Object.assign({}, map); - var actual = ''; - for (var k in obj) { - actual += k; - } - return str !== actual; -}; - -var assignHasPendingExceptions = function () { - if (!Object.assign || !Object.preventExtensions) { - return false; - } - // Firefox 37 still has "pending exception" logic in its Object.assign implementation, - // which is 72% slower than our shim, and Firefox 40's native implementation. - var thrower = Object.preventExtensions({ 1: 2 }); - try { - Object.assign(thrower, 'xy'); - } catch (e) { - return thrower[1] === 'y'; - } - return false; -}; - -module.exports = function getPolyfill() { - if (!Object.assign) { - return implementation; - } - if (lacksProperEnumerationOrder()) { - return implementation; - } - if (assignHasPendingExceptions()) { - return implementation; - } - return Object.assign; -}; - -},{"./implementation":64}],67:[function(require,module,exports){ -'use strict'; - -var define = require('define-properties'); -var getPolyfill = require('./polyfill'); - -module.exports = function shimAssign() { - var polyfill = getPolyfill(); - define( - Object, - { assign: polyfill }, - { assign: function () { return Object.assign !== polyfill; } } - ); - return polyfill; -}; - -},{"./polyfill":66,"define-properties":47}],68:[function(require,module,exports){ -(function (process){ -'use strict'; - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = { nextTick: nextTick }; -} else { - module.exports = process -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - - -}).call(this,require('_process')) -},{"_process":69}],69:[function(require,module,exports){ -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],70:[function(require,module,exports){ -module.exports = require('./lib/_stream_duplex.js'); - -},{"./lib/_stream_duplex.js":71}],71:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. - -'use strict'; - -/*<replacement>*/ - -var pna = require('process-nextick-args'); -/*</replacement>*/ - -/*<replacement>*/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/*</replacement>*/ - -module.exports = Duplex; - -/*<replacement>*/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/*</replacement>*/ - -var Readable = require('./_stream_readable'); -var Writable = require('./_stream_writable'); - -util.inherits(Duplex, Readable); - -{ - // avoid scope creep, the keys array can then be collected - var keys = objectKeys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; - } -} - -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - pna.nextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - pna.nextTick(cb, err); -}; -},{"./_stream_readable":73,"./_stream_writable":75,"core-util-is":44,"inherits":56,"process-nextick-args":68}],72:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - -'use strict'; - -module.exports = PassThrough; - -var Transform = require('./_stream_transform'); - -/*<replacement>*/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/*</replacement>*/ - -util.inherits(PassThrough, Transform); - -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; -},{"./_stream_transform":74,"core-util-is":44,"inherits":56}],73:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -/*<replacement>*/ - -var pna = require('process-nextick-args'); -/*</replacement>*/ - -module.exports = Readable; - -/*<replacement>*/ -var isArray = require('isarray'); -/*</replacement>*/ - -/*<replacement>*/ -var Duplex; -/*</replacement>*/ - -Readable.ReadableState = ReadableState; - -/*<replacement>*/ -var EE = require('events').EventEmitter; - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/*</replacement>*/ - -/*<replacement>*/ -var Stream = require('./internal/streams/stream'); -/*</replacement>*/ - -/*<replacement>*/ - -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/*</replacement>*/ - -/*<replacement>*/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/*</replacement>*/ - -/*<replacement>*/ -var debugUtil = require('util'); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/*</replacement>*/ - -var BufferList = require('./internal/streams/BufferList'); -var destroyImpl = require('./internal/streams/destroy'); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; -} - -function ReadableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var readableHwm = options.readableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted - // immediately, or on a later tick. We set this to true at first, because - // any actions that shouldn't happen until "later" should generally also - // not happen before the first read call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // has it been destroyed - this.destroyed = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options) { - if (typeof options.read === 'function') this._read = options.read; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - - Stream.call(this); -} - -Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - } -}); - -Readable.prototype.destroy = destroyImpl.destroy; -Readable.prototype._undestroy = destroyImpl.undestroy; -Readable.prototype._destroy = function (err, cb) { - this.push(null); - cb(err); -}; - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - var skipChunkCheck; - - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; - -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); - } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - } - } - - return needMoreData(state); -} - -function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - maybeReadMore(stream, state); -} - -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - pna.nextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); -}; - -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - cleanup(); + str = ctx.stylize('[Circular]', 'special'); } } - } - - function onend() { - debug('onend'); - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', unpipe); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - - if (!dest) dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this, unpipeInfo); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this, unpipeInfo); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - pna.nextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - pna.nextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var _this = this; - - var state = this._readableState; - var paused = false; - - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) _this.push(chunk); - } - - _this.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = _this.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - this._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return this; -}; - -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._readableState.highWaterMark; - } -}); - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - pna.nextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./_stream_duplex":71,"./internal/streams/BufferList":76,"./internal/streams/destroy":77,"./internal/streams/stream":78,"_process":69,"core-util-is":44,"events":50,"inherits":56,"isarray":58,"process-nextick-args":68,"safe-buffer":83,"string_decoder/":85,"util":40}],74:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - -'use strict'; - -module.exports = Transform; - -var Duplex = require('./_stream_duplex'); - -/*<replacement>*/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/*</replacement>*/ - -util.inherits(Transform, Duplex); - -function afterTransform(er, data) { - var ts = this._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); - } - - ts.writechunk = null; - ts.writecb = null; - - if (data != null) // single equals check for both `null` and `undefined` - this.push(data); - - cb(er); - - var rs = this._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - this._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: false, - transforming: false, - writecb: null, - writechunk: null, - writeencoding: null - }; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - // When the writable side finishes, then flush out anything remaining. - this.on('prefinish', prefinish); -} - -function prefinish() { - var _this = this; - - if (typeof this._flush === 'function') { - this._flush(function (er, data) { - done(_this, er, data); - }); - } else { - done(this, null, null); - } -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -Transform.prototype._destroy = function (err, cb) { - var _this2 = this; - - Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - _this2.emit('close'); - }); -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} -},{"./_stream_duplex":71,"core-util-is":44,"inherits":56}],75:[function(require,module,exports){ -(function (process,global,setImmediate){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. - -'use strict'; - -/*<replacement>*/ - -var pna = require('process-nextick-args'); -/*</replacement>*/ - -module.exports = Writable; - -/* <replacement> */ -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* </replacement> */ - -/*<replacement>*/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; -/*</replacement>*/ - -/*<replacement>*/ -var Duplex; -/*</replacement>*/ - -Writable.WritableState = WritableState; - -/*<replacement>*/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/*</replacement>*/ - -/*<replacement>*/ -var internalUtil = { - deprecate: require('util-deprecate') -}; -/*</replacement>*/ - -/*<replacement>*/ -var Stream = require('./internal/streams/stream'); -/*</replacement>*/ - -/*<replacement>*/ - -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/*</replacement>*/ - -var destroyImpl = require('./internal/streams/destroy'); - -util.inherits(Writable, Stream); - -function nop() {} - -function WritableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var writableHwm = options.writableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // if _final has been called - this.finalCalled = false; - - // drain event flag. - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // has it been destroyed - this.destroyed = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; - -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') - }); - } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - if (this !== Writable) return false; - - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - - if (typeof options.final === 'function') this._final = options.final; - } - - Stream.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - pna.nextTick(cb, er); -} - -// Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - pna.nextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); - - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - - if (sync) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - pna.nextTick(cb, er); - // this can emit finish, and it will always happen - // after error - pna.nextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must - // always follow error - finishMaybe(stream, state); - } -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /*<replacement>*/ - asyncWrite(afterWrite, stream, state, finished, cb); - /*</replacement>*/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - var allBuffers = true; - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - state.bufferedRequestCount = 0; - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - state.bufferedRequestCount--; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); } } - if (entry === null) state.lastBufferedRequest = null; + return name + ': ' + str; } - state.bufferedRequest = entry; - state.bufferProcessing = false; -} -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); -}; + function reduceToSingleString(output, base, braces) { + var length = output.reduce(function(prev, cur) { + if (cur.indexOf('\n') >= 0) ; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - if (err) { - stream.emit('error', err); + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; } - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + } + + + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray$1(ar) { + return Array.isArray(ar); + } + + function isBoolean(arg) { + return typeof arg === 'boolean'; + } + + function isNull(arg) { + return arg === null; + } + + function isNullOrUndefined(arg) { + return arg == null; + } + + function isNumber(arg) { + return typeof arg === 'number'; + } + + function isString$1(arg) { + return typeof arg === 'string'; + } + + function isSymbol(arg) { + return typeof arg === 'symbol'; + } + + function isUndefined(arg) { + return arg === void 0; + } + + function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; + } + + function isObject(arg) { + return typeof arg === 'object' && arg !== null; + } + + function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; + } + + function isError$1(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); + } + + function isFunction(arg) { + return typeof arg === 'function'; + } + + function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; + } + + function isBuffer$1(maybeBuf) { + return Buffer$1.isBuffer(maybeBuf); + } + + function objectToString(o) { + return Object.prototype.toString.call(o); + } + + + function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); + } + + + var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + + // 26 Feb 16:19:34 + function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); + } + + + // log is just a thin wrapper to console.log that prepends a timestamp + function log() { + console.log('%s - %s', timestamp(), format$1.apply(null, arguments)); + } + + function _extend(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + var _polyfillNode_util = { + inherits: inherits$3, + _extend: _extend, + log: log, + isBuffer: isBuffer$1, + isPrimitive: isPrimitive, + isFunction: isFunction, + isError: isError$1, + isDate: isDate, + isObject: isObject, + isRegExp: isRegExp, + isUndefined: isUndefined, + isSymbol: isSymbol, + isString: isString$1, + isNumber: isNumber, + isNullOrUndefined: isNullOrUndefined, + isNull: isNull, + isBoolean: isBoolean, + isArray: isArray$1, + inspect: inspect, + deprecate: deprecate$1, + format: format$1, + debuglog: debuglog + }; + + var _polyfillNode_util$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + format: format$1, + deprecate: deprecate$1, + debuglog: debuglog, + inspect: inspect, + isArray: isArray$1, + isBoolean: isBoolean, + isNull: isNull, + isNullOrUndefined: isNullOrUndefined, + isNumber: isNumber, + isString: isString$1, + isSymbol: isSymbol, + isUndefined: isUndefined, + isRegExp: isRegExp, + isObject: isObject, + isDate: isDate, + isError: isError$1, + isFunction: isFunction, + isPrimitive: isPrimitive, + isBuffer: isBuffer$1, + log: log, + inherits: inherits$3, + _extend: _extend, + 'default': _polyfillNode_util }); -} -function prefinish(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { - state.pendingcb++; - state.finalCalled = true; - pna.nextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - prefinish(stream, state); - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } -} - -Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { - if (this._writableState === undefined) { - return false; - } - return this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._writableState.destroyed = value; - } -}); - -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; -Writable.prototype._destroy = function (err, cb) { - this.end(); - cb(err); -}; -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) -},{"./_stream_duplex":71,"./internal/streams/destroy":77,"./internal/streams/stream":78,"_process":69,"core-util-is":44,"inherits":56,"process-nextick-args":68,"safe-buffer":83,"timers":86,"util-deprecate":87}],76:[function(require,module,exports){ -'use strict'; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Buffer = require('safe-buffer').Buffer; -var util = require('util'); - -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} - -module.exports = function () { function BufferList() { - _classCallCheck(this, BufferList); - this.head = null; this.tail = null; this.length = 0; } - BufferList.prototype.push = function push(v) { + BufferList.prototype.push = function (v) { var entry = { data: v, next: null }; if (this.length > 0) this.tail.next = entry;else this.head = entry; this.tail = entry; ++this.length; }; - BufferList.prototype.unshift = function unshift(v) { + BufferList.prototype.unshift = function (v) { var entry = { data: v, next: this.head }; if (this.length === 0) this.tail = entry; this.head = entry; ++this.length; }; - BufferList.prototype.shift = function shift() { + BufferList.prototype.shift = function () { if (this.length === 0) return; var ret = this.head.data; if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; @@ -16696,12 +3559,12 @@ return ret; }; - BufferList.prototype.clear = function clear() { + BufferList.prototype.clear = function () { this.head = this.tail = null; this.length = 0; }; - BufferList.prototype.join = function join(s) { + BufferList.prototype.join = function (s) { if (this.length === 0) return ''; var p = this.head; var ret = '' + p.data; @@ -16710,1367 +3573,17045 @@ }return ret; }; - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); + BufferList.prototype.concat = function (n) { + if (this.length === 0) return Buffer$1.alloc(0); if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); + var ret = Buffer$1.allocUnsafe(n >>> 0); var p = this.head; var i = 0; while (p) { - copyBuffer(p.data, ret, i); + p.data.copy(ret, i); i += p.data.length; p = p.next; } return ret; }; - return BufferList; -}(); - -if (util && util.inspect && util.inspect.custom) { - module.exports.prototype[util.inspect.custom] = function () { - var obj = util.inspect({ length: this.length }); - return this.constructor.name + ' ' + obj; - }; -} -},{"safe-buffer":83,"util":40}],77:[function(require,module,exports){ -'use strict'; - -/*<replacement>*/ - -var pna = require('process-nextick-args'); -/*</replacement>*/ - -// undocumented cb() API, needed for core, not for public API -function destroy(err, cb) { - var _this = this; - - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - pna.nextTick(emitErrorNT, this, err); - } - return this; - } - - // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } - - // if this is a duplex stream mark the writable part as destroyed as well - if (this._writableState) { - this._writableState.destroyed = true; - } - - this._destroy(err || null, function (err) { - if (!cb && err) { - pna.nextTick(emitErrorNT, _this, err); - if (_this._writableState) { - _this._writableState.errorEmitted = true; - } - } else if (cb) { - cb(err); - } - }); - - return this; -} - -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} - -function emitErrorNT(self, err) { - self.emit('error', err); -} - -module.exports = { - destroy: destroy, - undestroy: undestroy -}; -},{"process-nextick-args":68}],78:[function(require,module,exports){ -module.exports = require('events').EventEmitter; - -},{"events":50}],79:[function(require,module,exports){ -module.exports = require('./readable').PassThrough - -},{"./readable":80}],80:[function(require,module,exports){ -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = exports; -exports.Readable = exports; -exports.Writable = require('./lib/_stream_writable.js'); -exports.Duplex = require('./lib/_stream_duplex.js'); -exports.Transform = require('./lib/_stream_transform.js'); -exports.PassThrough = require('./lib/_stream_passthrough.js'); - -},{"./lib/_stream_duplex.js":71,"./lib/_stream_passthrough.js":72,"./lib/_stream_readable.js":73,"./lib/_stream_transform.js":74,"./lib/_stream_writable.js":75}],81:[function(require,module,exports){ -module.exports = require('./readable').Transform - -},{"./readable":80}],82:[function(require,module,exports){ -module.exports = require('./lib/_stream_writable.js'); - -},{"./lib/_stream_writable.js":75}],83:[function(require,module,exports){ -/* eslint-disable node/no-deprecated-api */ -var buffer = require('buffer') -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - -},{"buffer":43}],84:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -module.exports = Stream; - -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; + // Copyright Joyent, Inc. and other Node contributors. + var isBufferEncoding = Buffer$1.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + }; - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } + function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); } } - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":50,"inherits":56,"readable-stream/duplex.js":70,"readable-stream/passthrough.js":79,"readable-stream/readable.js":80,"readable-stream/transform.js":81,"readable-stream/writable.js":82}],85:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -/*<replacement>*/ - -var Buffer = require('safe-buffer').Buffer; -/*</replacement>*/ - -var isEncoding = Buffer.isEncoding || function (encoding) { - encoding = '' + encoding; - switch (encoding && encoding.toLowerCase()) { - case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': - return true; - default: - return false; - } -}; - -function _normalizeEncoding(enc) { - if (!enc) return 'utf8'; - var retried; - while (true) { - switch (enc) { + // StringDecoder provides an interface for efficiently splitting a series of + // buffers into a series of JS strings without breaking apart multi-byte + // characters. CESU-8 is handled as part of the UTF-8 encoding. + // + // @TODO Handling all encodings inside a single object makes it very difficult + // to reason about this code, so it should be split up in the future. + // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code + // points as used by CESU-8. + function StringDecoder(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { case 'utf8': - case 'utf-8': - return 'utf8'; + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; case 'ucs2': - case 'ucs-2': case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; case 'base64': - case 'ascii': - case 'hex': - return enc; + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; default: - if (retried) return; // undefined - enc = ('' + enc).toLowerCase(); - retried = true; + this.write = passThroughWrite; + return; } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer$1(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; } -}; -// Do not cache `Buffer.isEncoding` when checking encoding names as some -// modules monkey-patch it to support additional encodings -function normalizeEncoding(enc) { - var nenc = _normalizeEncoding(enc); - if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); - return nenc || enc; -} + // write decodes the given buffer and returns it as JS string that is + // guaranteed to not contain any partial multi-byte characters. Any partial + // character found at the end of the buffer is buffered up, and will be + // returned when calling write again with the remaining bytes. + // + // Note: Converting a Buffer containing an orphan surrogate to a String + // currently works, but converting a String to a Buffer (via `new Buffer`, or + // Buffer#write) will replace incomplete surrogates with the unicode + // replacement character. See https://codereview.chromium.org/121173009/ . + StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. -exports.StringDecoder = StringDecoder; -function StringDecoder(encoding) { - this.encoding = normalizeEncoding(encoding); - var nb; - switch (this.encoding) { - case 'utf16le': - this.text = utf16Text; - this.end = utf16End; - nb = 4; + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } break; - case 'utf8': - this.fillLast = utf8FillLast; - nb = 4; - break; - case 'base64': - this.text = base64Text; - this.end = base64End; - nb = 3; - break; - default: - this.write = simpleWrite; - this.end = simpleEnd; - return; - } - this.lastNeed = 0; - this.lastTotal = 0; - this.lastChar = Buffer.allocUnsafe(nb); -} - -StringDecoder.prototype.write = function (buf) { - if (buf.length === 0) return ''; - var r; - var i; - if (this.lastNeed) { - r = this.fillLast(buf); - if (r === undefined) return ''; - i = this.lastNeed; - this.lastNeed = 0; - } else { - i = 0; - } - if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); - return r || ''; -}; - -StringDecoder.prototype.end = utf8End; - -// Returns only complete characters in a Buffer -StringDecoder.prototype.text = utf8Text; - -// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -StringDecoder.prototype.fillLast = function (buf) { - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); - this.lastNeed -= buf.length; -}; - -// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. If an invalid byte is detected, -2 is returned. -function utf8CheckByte(byte) { - if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return byte >> 6 === 0x02 ? -1 : -2; -} - -// Checks at most 3 bytes at the end of a Buffer in order to detect an -// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -// needed to complete the UTF-8 character (if applicable) are returned. -function utf8CheckIncomplete(self, buf, i) { - var j = buf.length - 1; - if (j < i) return 0; - var nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 1; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 2; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) { - if (nb === 2) nb = 0;else self.lastNeed = nb - 3; } - return nb; - } - return 0; -} -// Validates as many continuation bytes for a multi-byte UTF-8 character as -// needed or are available. If we see a non-continuation byte where we expect -// one, we "replace" the validated continuation bytes we've seen so far with -// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding -// behavior. The continuation byte check is included three times in the case -// where all of the continuation bytes for a character exist in the same buffer. -// It is also done this way as a slight performance increase instead of using a -// loop. -function utf8CheckExtraBytes(self, buf, p) { - if ((buf[0] & 0xC0) !== 0x80) { - self.lastNeed = 0; - return '\ufffd'; - } - if (self.lastNeed > 1 && buf.length > 1) { - if ((buf[1] & 0xC0) !== 0x80) { - self.lastNeed = 1; - return '\ufffd'; + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; } - if (self.lastNeed > 2 && buf.length > 2) { - if ((buf[2] & 0xC0) !== 0x80) { - self.lastNeed = 2; - return '\ufffd'; + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; + }; + + // detectIncompleteChar determines if there is an incomplete UTF-8 character at + // the end of the given buffer. If so, it sets this.charLength to the byte + // length that character, and sets this.charReceived to the number of bytes + // that are available for this character. + StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; } } - } -} + this.charReceived = i; + }; -// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -function utf8FillLast(buf) { - var p = this.lastTotal - this.lastNeed; - var r = utf8CheckExtraBytes(this, buf, p); - if (r !== undefined) return r; - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, p, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, p, 0, buf.length); - this.lastNeed -= buf.length; -} + StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); -// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -// partial character, the character's bytes are buffered until the required -// number of bytes are available. -function utf8Text(buf, i) { - var total = utf8CheckIncomplete(this, buf, i); - if (!this.lastNeed) return buf.toString('utf8', i); - this.lastTotal = total; - var end = buf.length - (total - this.lastNeed); - buf.copy(this.lastChar, 0, end); - return buf.toString('utf8', i, end); -} - -// For UTF-8, a replacement character is added when ending on a partial -// character. -function utf8End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'; - return r; -} - -// UTF-16LE typically needs two bytes per character, but even if we have an even -// number of bytes available, we need to check if we end on a leading/high -// surrogate. In that case, we need to wait for the next two bytes in order to -// decode the last character properly. -function utf16Text(buf, i) { - if ((buf.length - i) % 2 === 0) { - var r = buf.toString('utf16le', i); - if (r) { - var c = r.charCodeAt(r.length - 1); - if (c >= 0xD800 && c <= 0xDBFF) { - this.lastNeed = 2; - this.lastTotal = 4; - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - return r.slice(0, -1); - } + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); } - return r; - } - this.lastNeed = 1; - this.lastTotal = 2; - this.lastChar[0] = buf[buf.length - 1]; - return buf.toString('utf16le', i, buf.length - 1); -} -// For UTF-16LE we do not explicitly append special replacement characters if we -// end on a partial character, we simply let v8 handle that. -function utf16End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) { - var end = this.lastTotal - this.lastNeed; - return r + this.lastChar.toString('utf16le', 0, end); - } - return r; -} + return res; + }; -function base64Text(buf, i) { - var n = (buf.length - i) % 3; - if (n === 0) return buf.toString('base64', i); - this.lastNeed = 3 - n; - this.lastTotal = 3; - if (n === 1) { - this.lastChar[0] = buf[buf.length - 1]; - } else { - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - } - return buf.toString('base64', i, buf.length - n); -} - -function base64End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); - return r; -} - -// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -function simpleWrite(buf) { - return buf.toString(this.encoding); -} - -function simpleEnd(buf) { - return buf && buf.length ? this.write(buf) : ''; -} -},{"safe-buffer":83}],86:[function(require,module,exports){ -(function (setImmediate,clearImmediate){ -var nextTick = require('process/browser.js').nextTick; -var apply = Function.prototype.apply; -var slice = Array.prototype.slice; -var immediateIds = {}; -var nextImmediateId = 0; - -// DOM APIs, for completeness - -exports.setTimeout = function() { - return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); -}; -exports.setInterval = function() { - return new Timeout(apply.call(setInterval, window, arguments), clearInterval); -}; -exports.clearTimeout = -exports.clearInterval = function(timeout) { timeout.close(); }; - -function Timeout(id, clearFn) { - this._id = id; - this._clearFn = clearFn; -} -Timeout.prototype.unref = Timeout.prototype.ref = function() {}; -Timeout.prototype.close = function() { - this._clearFn.call(window, this._id); -}; - -// Does not start the time, just sets up the members needed. -exports.enroll = function(item, msecs) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = msecs; -}; - -exports.unenroll = function(item) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = -1; -}; - -exports._unrefActive = exports.active = function(item) { - clearTimeout(item._idleTimeoutId); - - var msecs = item._idleTimeout; - if (msecs >= 0) { - item._idleTimeoutId = setTimeout(function onTimeout() { - if (item._onTimeout) - item._onTimeout(); - }, msecs); - } -}; - -// That's not how node.js implements it but the exposed api is the same. -exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { - var id = nextImmediateId++; - var args = arguments.length < 2 ? false : slice.call(arguments, 1); - - immediateIds[id] = true; - - nextTick(function onNextTick() { - if (immediateIds[id]) { - // fn.call() is faster so we optimize for the common use-case - // @see http://jsperf.com/call-apply-segu - if (args) { - fn.apply(null, args); - } else { - fn.call(null); - } - // Prevent ids from leaking - exports.clearImmediate(id); - } - }); - - return id; -}; - -exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { - delete immediateIds[id]; -}; -}).call(this,require("timers").setImmediate,require("timers").clearImmediate) -},{"process/browser.js":69,"timers":86}],87:[function(require,module,exports){ -(function (global){ - -/** - * Module exports. - */ - -module.exports = deprecate; - -/** - * Mark that a method should not be used. - * Returns a modified function which warns once by default. - * - * If `localStorage.noDeprecation = true` is set, then it is a no-op. - * - * If `localStorage.throwDeprecation = true` is set, then deprecated functions - * will throw an Error when invoked. - * - * If `localStorage.traceDeprecation = true` is set, then deprecated functions - * will invoke `console.trace()` instead of `console.error()`. - * - * @param {Function} fn - the function to deprecate - * @param {String} msg - the string to print to the console when `fn` is invoked - * @returns {Function} a new "deprecated" version of `fn` - * @api public - */ - -function deprecate (fn, msg) { - if (config('noDeprecation')) { - return fn; + function passThroughWrite(buffer) { + return buffer.toString(this.encoding); } - var warned = false; - function deprecated() { - if (!warned) { - if (config('throwDeprecation')) { - throw new Error(msg); - } else if (config('traceDeprecation')) { - console.trace(msg); - } else { - console.warn(msg); - } - warned = true; - } - return fn.apply(this, arguments); + function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; } - return deprecated; -} - -/** - * Checks `localStorage` for boolean values for the given `name`. - * - * @param {String} name - * @returns {Boolean} - * @api private - */ - -function config (name) { - // accessing global.localStorage can trigger a DOMException in sandboxed iframes - try { - if (!global.localStorage) return false; - } catch (_) { - return false; - } - var val = global.localStorage[name]; - if (null == val) return false; - return String(val).toLowerCase() === 'true'; -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],88:[function(require,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} -},{}],89:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); + function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; } - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; + Readable.ReadableState = ReadableState; + + var debug$2 = debuglog('stream'); + inherits$3(Readable, EventEmitter$2); + + function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); } else { - str += ' ' + inspect(x); + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) + emitter.on(event, fn); + else if (Array.isArray(emitter._events[event])) + emitter._events[event].unshift(fn); + else + emitter._events[event] = [fn, emitter._events[event]]; } } - return str; -}; + function listenerCount (emitter, type) { + return emitter.listeners(type).length; + } + function ReadableState(options, stream) { + options = options || {}; -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } + } + function Readable(options) { + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') this._read = options.read; + + EventEmitter$2.call(this); + } + + // Manually shove something into the read() buffer. + // This returns true if the highWaterMark has not been hit yet, + // similar to how Writable.write() returns true if you should + // write() some more. + Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer$1.from(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); + }; + + // Unshift should *always* be something directly out of read() + Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); + }; + + Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; + }; + + function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); + } + + // if it's past the high water mark, we can push in some more. + // Also, if we have no data yet, we can stand some + // more bytes. This is to work around cases where hwm=0, + // such as the repl. Also, if the push() triggered a + // readable event, and the user called read(largeNumber) such that + // needReadable was set, then we ought to push more, so that another + // 'readable' event will be triggered. + function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + } + + // backwards compatibility. + Readable.prototype.setEncoding = function (enc) { + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; + }; + + // Don't raise the hwm > 8MB + var MAX_HWM = 0x800000; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; + } + + // you can override either this method, or the async _read(n) below. + Readable.prototype.read = function (n) { + debug$2('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug$2('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug$2('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug$2('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug$2('reading or ended', doRead); + } else if (doRead) { + debug$2('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; + }; + + function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer$1.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; + } + + function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); + } + + // Don't emit readable right away in sync mode, because this can trigger + // another read() call => stack overflow. This way, it might trigger + // a nextTick recursion warning, but that's not so bad. + function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug$2('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream); + } + } + + function emitReadable_(stream) { + debug$2('emit readable'); + stream.emit('readable'); + flow(stream); + } + + // at this point, the user has presumably seen the 'readable' event, + // and called read() to consume some data. that may have triggered + // in turn another _read(n) call, in which case reading = true if + // it's in progress. + // However, if we're not ended, or reading, and the length < hwm, + // then go ahead and try to read some more preemptively. + function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + nextTick(maybeReadMore_, stream, state); + } + } + + function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug$2('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; + } + + // abstract method. to be overridden in specific implementation classes. + // call cb(er, data) where data is <= n in length. + // for virtual (non-string, non-buffer) streams, "length" is somewhat + // arbitrary, and perhaps not very meaningful. + Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); + }; + + Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug$2('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false); + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug$2('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug$2('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug$2('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug$2('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug$2('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug$2('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (listenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug$2('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug$2('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug$2('pipe resume'); + src.resume(); + } + + return dest; + }; + + function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug$2('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && src.listeners('data').length) { + state.flowing = true; + flow(src); + } }; } - if (process.noDeprecation === true) { - return fn; - } + Readable.prototype.unpipe = function (dest) { + var state = this._readableState; - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; } - return fn.apply(this, arguments); - } - return deprecated; -}; + // slow case. multiple pipe destinations. + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; } - } - return debugs[set]; -}; + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); + + // set up data events if they are asked for + // Ensure readable listeners eventually get something + Readable.prototype.on = function (ev, fn) { + var res = EventEmitter$2.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + + function nReadingNextTick(self) { + debug$2('readable nexttick read 0'); + self.read(0); } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; + // pause() and resume() are remnants of the legacy readable stream API + // If the user uses them, then switch into old mode. + Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug$2('resume'); + state.flowing = true; + resume(this, state); + } + return this; + }; -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + nextTick(resume_, stream, state); + } } -} + function resume_(stream, state) { + if (!state.reading) { + debug$2('resume read 0'); + stream.read(0); + } -function stylizeNoColor(str, styleType) { - return str; -} + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); + } + Readable.prototype.pause = function () { + debug$2('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug$2('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; + }; -function arrayToHash(array) { - var hash = {}; + function flow(stream) { + var state = stream._readableState; + debug$2('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} + } - array.forEach(function(val, idx) { - hash[val] = true; - }); + // wrap an old-style stream as the async data source. + // This is *not* part of the readable stream interface. + // It is an ugly unfortunate mess of history. + Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; - return hash; -} + var self = this; + stream.on('end', function () { + debug$2('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + self.push(null); + }); -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); + stream.on('data', function (chunk) { + debug$2('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug$2('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; + }; + + // exposed for testing purposes only. + Readable._fromList = fromList; + + // Pluck off n bytes from an array of buffers. + // Length is the combined lengths of all the buffers in the list. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; + } + + // Extracts only enough buffered data to satisfy the amount requested. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); } return ret; } - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; + // Copies a specified amount of characters from the list of buffered data + // chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; } - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); + // Copies a specified amount of bytes from the list of buffered data chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBuffer(n, list) { + var ret = Buffer$1.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; } - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } + function endReadable(stream) { + var state = stream._readableState; - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + nextTick(endReadableNT, state, stream); } } - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; + function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } } - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; + function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } } - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; } - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); + // A bit simpler than readable streams. + Writable.WritableState = WritableState; + inherits$3(Writable, EventEmitter$2); + + function nop() {} + + function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; } - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); + function WritableState(options, stream) { + Object.defineProperty(this, 'buffer', { + get: deprecate$1(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); } - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; + WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; + }; + function Writable(options) { + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + + EventEmitter$2.call(this); } - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + // Otherwise people can pipe Writable streams, which is just wrong. + Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); + }; + + function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + nextTick(cb, er); + } + + // If we get something that is not a buffer, string, null, or undefined, + // and we're not in objectMode, then that's an error. + // Otherwise stream chunks are all considered to be of length=1, and the + // watermarks determine how many objects to keep in the buffer, rather than + // how many bytes or characters. + function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer$1.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + nextTick(cb, er); + valid = false; + } + return valid; + } + + Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer$1.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; + }; + + Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; + }; + + Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } + }; + + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; + }; + + function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer$1.from(chunk, encoding); + } + return chunk; + } + + // if we're already writing something, then just put this + // in the queue, and wait our turn. Otherwise, call _write + // If we return false, then we need a drain event, so set that flag. + function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer$1.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; } else { - return ctx.stylize('[Object]', 'special'); + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; + } + + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + + function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) nextTick(cb, er);else cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } + + function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + } + + function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /*<replacement>*/ + nextTick(afterWrite, stream, state, finished, cb); + /*</replacement>*/ + } else { + afterWrite(stream, state, finished, cb); + } } } - ctx.seen.push(value); + function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); + } - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + // Must force callback to be called on nextTick, so that we don't + // emit 'drain' before the write() consumer gets the 'false' return + // value, and has a chance to attach a 'drain' listener. + function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } + } + + // if there's something in the buffer waiting, then process it + function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; + } + + Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); + }; + + Writable.prototype._writev = null; + + Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); + }; + + function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; + } + + function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } + } + + function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; + } + + function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; + } + + // It seems a linked list but it is not + // there will be only 2 of these for each stream + function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; + } + + inherits$3(Duplex, Readable); + + var keys = Object.keys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); + } + + // the no-half-open enforcer + function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + nextTick(onEndNT, this); + } + + function onEndNT(self) { + self.end(); + } + + // a transform stream is a readable/writable stream where you do + inherits$3(Transform, Duplex); + + function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; + } + + function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } + } + function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); }); } - ctx.seen.pop(); + Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); + }; - return reduceToSingleString(output, base, braces); -} + // This is the part where you do stuff! + // override this function in implementation classes. + // 'chunk' is an input chunk. + // + // Call `push(newChunk)` to pass along transformed output + // to the readable side. You may call 'push' zero or more times. + // + // Call `cb(err)` when you are done with this chunk. If you pass + // an error, then that'll put the hurt on the whole operation. If you + // never call cb(), then you'll never get another chunk. + Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('Not implemented'); + }; + Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } + }; -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} + // Doesn't matter what the args are here. + // _transform does all the work. + // That we got here means that the readable side wants more data. + Transform.prototype._read = function (n) { + var ts = this._transformState; - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { - output.push(''); + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } + }; + + function done(stream, er) { + if (er) return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); + } + + inherits$3(PassThrough, Transform); + function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); + } + + PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); + }; + + inherits$3(Stream, EventEmitter$2); + Stream.Readable = Readable; + Stream.Writable = Writable; + Stream.Duplex = Duplex; + Stream.Transform = Transform; + Stream.PassThrough = PassThrough; + + // Backwards-compat with node 0.4.x + Stream.Stream = Stream; + + // old-style streams. Note that the pipe method (the only relevant + // part of this class) is overridden in the Readable class. + + function Stream() { + EventEmitter$2.call(this); + } + + Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EventEmitter$2.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; + }; + + var _polyfillNode_stream = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': Stream, + Readable: Readable, + Writable: Writable, + Duplex: Duplex, + Transform: Transform, + PassThrough: PassThrough, + Stream: Stream + }); + + var require$$0$2 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_stream); + + var require$$0$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_util$1); + + var WritableStream = require$$0$2.Writable; + var inherits$1 = require$$0$1.inherits; + + var browserStdout = BrowserStdout; + + + inherits$1(BrowserStdout, WritableStream); + + function BrowserStdout(opts) { + if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) + + opts = opts || {}; + WritableStream.call(this, opts); + this.label = (opts.label !== undefined) ? opts.label : 'stdout'; + } + + BrowserStdout.prototype._write = function(chunks, encoding, cb) { + var output = chunks.toString ? chunks.toString() : chunks; + if (this.label === false) { + console.log(output); + } else { + console.log(this.label+':', output); + } + nextTick$1(cb); + }; + + /** + * Parse the given `qs`. + * + * @private + * @param {string} qs + * @return {Object<string, string>} + */ + var parseQuery$1 = function parseQuery(qs) { + return qs + .replace('?', '') + .split('&') + .reduce(function (obj, pair) { + var i = pair.indexOf('='); + var key = pair.slice(0, i); + var val = pair.slice(++i); + + // Due to how the URLSearchParams API treats spaces + obj[key] = decodeURIComponent(val.replace(/\+/g, '%20')); + + return obj; + }, {}); + }; + + /** + * Highlight the given string of `js`. + * + * @private + * @param {string} js + * @return {string} + */ + function highlight(js) { + return js + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>') + .replace(/('.*?')/gm, '<span class="string">$1</span>') + .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>') + .replace(/(\d+)/gm, '<span class="number">$1</span>') + .replace( + /\bnew[ \t]+(\w+)/gm, + '<span class="keyword">new</span> <span class="init">$1</span>' + ) + .replace( + /\b(function|new|throw|return|var|if|else)\b/gm, + '<span class="keyword">$1</span>' + ); + } + + /** + * Highlight the contents of tag `name`. + * + * @private + * @param {string} name + */ + var highlightTags$1 = function highlightTags(name) { + var code = document.getElementById('mocha').getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } + }; + + var mocha$1 = {exports: {}}; + + var escapeStringRegexp = string => { + if (typeof string !== 'string') { + throw new TypeError('Expected a string'); + } + + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a \unnnn escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return string + .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + .replace(/-/g, '\\x2d'); + }; + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // resolves . and .. elements in a path array with directory names there + // must be no slashes, empty elements, or device names (c:\) in the array + // (so also no leading and trailing slashes - it does not distinguish + // relative and absolute paths) + function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; + } + + // Split a filename into [root, dir, basename, ext], unix version + // 'root' is just a slash, or nothing. + var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); + }; + + // path.resolve([from ...], to) + // posix version + function resolve() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : '/'; + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + } + // path.normalize(path) + // posix version + function normalize(path) { + var isPathAbsolute = isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isPathAbsolute).join('/'); + + if (!path && !isPathAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isPathAbsolute ? '/' : '') + path; + } + // posix version + function isAbsolute(path) { + return path.charAt(0) === '/'; + } + + // posix version + function join() { + var paths = Array.prototype.slice.call(arguments, 0); + return normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); + } + + + // path.relative(from, to) + // posix version + function relative(from, to) { + from = resolve(from).substr(1); + to = resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); + } + + var sep = '/'; + var delimiter = ':'; + + function dirname(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; + } + + function basename(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; + } + + + function extname(path) { + return splitPath(path)[3]; + } + var _polyfillNode_path = { + extname: extname, + basename: basename, + dirname: dirname, + sep: sep, + delimiter: delimiter, + relative: relative, + join: join, + isAbsolute: isAbsolute, + normalize: normalize, + resolve: resolve + }; + function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; + } + + // String.prototype.substr - negative index don't work in IE8 + var substr = 'ab'.substr(-1) === 'b' ? + function (str, start, len) { return str.substr(start, len) } : + function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } + ; + + var _polyfillNode_path$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + resolve: resolve, + normalize: normalize, + isAbsolute: isAbsolute, + join: join, + relative: relative, + sep: sep, + delimiter: delimiter, + dirname: dirname, + basename: basename, + extname: extname, + 'default': _polyfillNode_path + }); + + var require$$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_path$1); + + var reporters = {}; + + var base$1 = {exports: {}}; + + var lib = {}; + + var base = {}; + + /*istanbul ignore start*/ + + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports["default"] = Diff; + + /*istanbul ignore end*/ + function Diff() {} + + Diff.prototype = { + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + diff: function diff(oldString, newString) { + /*istanbul ignore start*/ + var + /*istanbul ignore end*/ + options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var callback = options.callback; + + if (typeof options === 'function') { + callback = options; + options = {}; + } + + this.options = options; + var self = this; + + function done(value) { + if (callback) { + setTimeout(function () { + callback(undefined, value); + }, 0); + return true; + } else { + return value; + } + } // Allow subclasses to massage the input prior to running + + + oldString = this.castInput(oldString); + newString = this.castInput(newString); + oldString = this.removeEmpty(this.tokenize(oldString)); + newString = this.removeEmpty(this.tokenize(newString)); + var newLen = newString.length, + oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ + newPos: -1, + components: [] + }]; // Seed editLength = 0, i.e. the content starts with the same values + + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{ + value: this.join(newString), + count: newString.length + }]); + } // Main worker method. checks all permutations of a given edit length for acceptance. + + + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath = + /*istanbul ignore start*/ + void 0 + /*istanbul ignore end*/ + ; + + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + + + if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done + + if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { + return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + + + if (callback) { + (function exec() { + setTimeout(function () { + // This should not happen, but we want to be safe. + + /* istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + })(); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + + if (ret) { + return ret; + } + } + } + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + pushComponent: function pushComponent(components, added, removed) { + var last = components[components.length - 1]; + + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = { + count: last.count + 1, + added: added, + removed: removed + }; + } else { + components.push({ + count: 1, + added: added, + removed: removed + }); + } + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + commonCount = 0; + + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({ + count: commonCount + }); + } + + basePath.newPos = newPos; + return oldPos; + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + equals: function equals(left, right) { + if (this.options.comparator) { + return this.options.comparator(left, right); + } else { + return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); + } + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + removeEmpty: function removeEmpty(array) { + var ret = []; + + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + + return ret; + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + castInput: function castInput(value) { + return value; + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + tokenize: function tokenize(value) { + return value.split(''); + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + join: function join(chars) { + return chars.join(''); + } + }; + + function buildValues(diff, components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = value.map(function (value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + component.value = diff.join(value); + } else { + component.value = diff.join(newString.slice(newPos, newPos + component.count)); + } + + newPos += component.count; // Common case + + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); + oldPos += component.count; // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } // Special case handle for when one terminal is ignored (i.e. whitespace). + // For this case we merge the terminal into the prior string and drop the change. + // This is only available for string mode. + + + var lastComponent = components[componentLen - 1]; + + if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { + components[componentLen - 2].value += lastComponent.value; + components.pop(); + } + + return components; + } + + function clonePath(path) { + return { + newPos: path.newPos, + components: path.components.slice(0) + }; + } + + }(base)); + + var character = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(character, "__esModule", { + value: true + }); + character.diffChars = diffChars; + character.characterDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$6 = _interopRequireDefault$7(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var characterDiff = new + /*istanbul ignore start*/ + _base$6 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + character.characterDiff = characterDiff; + + /*istanbul ignore end*/ + function diffChars(oldStr, newStr, options) { + return characterDiff.diff(oldStr, newStr, options); + } + + var word = {}; + + var params = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(params, "__esModule", { + value: true + }); + params.generateOptions = generateOptions; + + /*istanbul ignore end*/ + function generateOptions(options, defaults) { + if (typeof options === 'function') { + defaults.callback = options; + } else if (options) { + for (var name in options) { + /* istanbul ignore else */ + if (options.hasOwnProperty(name)) { + defaults[name] = options[name]; + } + } + } + + return defaults; + } + + /*istanbul ignore start*/ + + Object.defineProperty(word, "__esModule", { + value: true + }); + word.diffWords = diffWords; + word.diffWordsWithSpace = diffWordsWithSpace; + word.wordDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$5 = _interopRequireDefault$6(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _params$1 = params + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode + // + // Ranges and exceptions: + // Latin-1 Supplement, 0080–00FF + // - U+00D7 × Multiplication sign + // - U+00F7 ÷ Division sign + // Latin Extended-A, 0100–017F + // Latin Extended-B, 0180–024F + // IPA Extensions, 0250–02AF + // Spacing Modifier Letters, 02B0–02FF + // - U+02C7 ˇ ˇ Caron + // - U+02D8 ˘ ˘ Breve + // - U+02D9 ˙ ˙ Dot Above + // - U+02DA ˚ ˚ Ring Above + // - U+02DB ˛ ˛ Ogonek + // - U+02DC ˜ ˜ Small Tilde + // - U+02DD ˝ ˝ Double Acute Accent + // Latin Extended Additional, 1E00–1EFF + var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; + var reWhitespace = /\S/; + var wordDiff = new + /*istanbul ignore start*/ + _base$5 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + word.wordDiff = wordDiff; + + /*istanbul ignore end*/ + wordDiff.equals = function (left, right) { + if (this.options.ignoreCase) { + left = left.toLowerCase(); + right = right.toLowerCase(); + } + + return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); + }; + + wordDiff.tokenize = function (value) { + // All whitespace symbols except newline group into one token, each newline - in separate token + var tokens = value.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. + + for (var i = 0; i < tokens.length - 1; i++) { + // If we have an empty string in the next field and we have only word chars before and after, merge + if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { + tokens[i] += tokens[i + 2]; + tokens.splice(i + 1, 2); + i--; + } + } + + return tokens; + }; + + function diffWords(oldStr, newStr, options) { + options = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _params$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + generateOptions) + /*istanbul ignore end*/ + (options, { + ignoreWhitespace: true + }); + return wordDiff.diff(oldStr, newStr, options); + } + + function diffWordsWithSpace(oldStr, newStr, options) { + return wordDiff.diff(oldStr, newStr, options); + } + + var line = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(line, "__esModule", { + value: true + }); + line.diffLines = diffLines; + line.diffTrimmedLines = diffTrimmedLines; + line.lineDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$4 = _interopRequireDefault$5(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _params = params + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var lineDiff = new + /*istanbul ignore start*/ + _base$4 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + line.lineDiff = lineDiff; + + /*istanbul ignore end*/ + lineDiff.tokenize = function (value) { + var retLines = [], + linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line + + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } // Merge the content and line separators into single tokens + + + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2 && !this.options.newlineIsToken) { + retLines[retLines.length - 1] += line; + } else { + if (this.options.ignoreWhitespace) { + line = line.trim(); + } + + retLines.push(line); + } + } + + return retLines; + }; + + function diffLines(oldStr, newStr, callback) { + return lineDiff.diff(oldStr, newStr, callback); + } + + function diffTrimmedLines(oldStr, newStr, callback) { + var options = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _params + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + generateOptions) + /*istanbul ignore end*/ + (callback, { + ignoreWhitespace: true + }); + return lineDiff.diff(oldStr, newStr, options); + } + + var sentence = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(sentence, "__esModule", { + value: true + }); + sentence.diffSentences = diffSentences; + sentence.sentenceDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$3 = _interopRequireDefault$4(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$4(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var sentenceDiff = new + /*istanbul ignore start*/ + _base$3 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + sentence.sentenceDiff = sentenceDiff; + + /*istanbul ignore end*/ + sentenceDiff.tokenize = function (value) { + return value.split(/(\S.+?[.!?])(?=\s+|$)/); + }; + + function diffSentences(oldStr, newStr, callback) { + return sentenceDiff.diff(oldStr, newStr, callback); + } + + var css = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(css, "__esModule", { + value: true + }); + css.diffCss = diffCss; + css.cssDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$2 = _interopRequireDefault$3(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var cssDiff = new + /*istanbul ignore start*/ + _base$2 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + css.cssDiff = cssDiff; + + /*istanbul ignore end*/ + cssDiff.tokenize = function (value) { + return value.split(/([{}:;,]|\s+)/); + }; + + function diffCss(oldStr, newStr, callback) { + return cssDiff.diff(oldStr, newStr, callback); + } + + var json$1 = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(json$1, "__esModule", { + value: true + }); + json$1.diffJson = diffJson; + json$1.canonicalize = canonicalize; + json$1.jsonDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$1 = _interopRequireDefault$2(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _line$1 = line + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + /*istanbul ignore end*/ + var objectPrototypeToString = Object.prototype.toString; + var jsonDiff = new + /*istanbul ignore start*/ + _base$1 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + + /*istanbul ignore start*/ + json$1.jsonDiff = jsonDiff; + + /*istanbul ignore end*/ + jsonDiff.useLongestToken = true; + jsonDiff.tokenize = + /*istanbul ignore start*/ + _line$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + lineDiff + /*istanbul ignore end*/ + .tokenize; + + jsonDiff.castInput = function (value) { + /*istanbul ignore start*/ + var _this$options = + /*istanbul ignore end*/ + this.options, + undefinedReplacement = _this$options.undefinedReplacement, + _this$options$stringi = _this$options.stringifyReplacer, + stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) + /*istanbul ignore start*/ + { + return ( + /*istanbul ignore end*/ + typeof v === 'undefined' ? undefinedReplacement : v + ); + } : _this$options$stringi; + return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); + }; + + jsonDiff.equals = function (left, right) { + return ( + /*istanbul ignore start*/ + _base$1 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ].prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')) + ); + }; + + function diffJson(oldObj, newObj, options) { + return jsonDiff.diff(oldObj, newObj, options); + } // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. Accepts an optional replacer + + + function canonicalize(obj, stack, replacementStack, replacer, key) { + stack = stack || []; + replacementStack = replacementStack || []; + + if (replacer) { + obj = replacer(key, obj); + } + + var i; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); + } + + stack.pop(); + replacementStack.pop(); + return canonicalizedObj; + } + + if (obj && obj.toJSON) { + obj = obj.toJSON(); + } + + if ( + /*istanbul ignore start*/ + _typeof( + /*istanbul ignore end*/ + obj) === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + + var sortedKeys = [], + _key; + + for (_key in obj) { + /* istanbul ignore else */ + if (obj.hasOwnProperty(_key)) { + sortedKeys.push(_key); + } + } + + sortedKeys.sort(); + + for (i = 0; i < sortedKeys.length; i += 1) { + _key = sortedKeys[i]; + canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); + } + + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + + return canonicalizedObj; + } + + var array$1 = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(array$1, "__esModule", { + value: true + }); + array$1.diffArrays = diffArrays; + array$1.arrayDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base = _interopRequireDefault$1(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$1(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var arrayDiff = new + /*istanbul ignore start*/ + _base + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + array$1.arrayDiff = arrayDiff; + + /*istanbul ignore end*/ + arrayDiff.tokenize = function (value) { + return value.slice(); + }; + + arrayDiff.join = arrayDiff.removeEmpty = function (value) { + return value; + }; + + function diffArrays(oldArr, newArr, callback) { + return arrayDiff.diff(oldArr, newArr, callback); + } + + var apply = {}; + + var parse$2 = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(parse$2, "__esModule", { + value: true + }); + parse$2.parsePatch = parsePatch; + + /*istanbul ignore end*/ + function parsePatch(uniDiff) { + /*istanbul ignore start*/ + var + /*istanbul ignore end*/ + options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], + list = [], + i = 0; + + function parseIndex() { + var index = {}; + list.push(index); // Parse diff metadata + + while (i < diffstr.length) { + var line = diffstr[i]; // File header found, end parsing diff metadata + + if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { + break; + } // Diff index + + + var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); + + if (header) { + index.index = header[1]; + } + + i++; + } // Parse file headers if they are defined. Unified diff requires them, but + // there's no technical issues to have an isolated hunk without file header + + + parseFileHeader(index); + parseFileHeader(index); // Parse hunks + + index.hunks = []; + + while (i < diffstr.length) { + var _line = diffstr[i]; + + if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { + break; + } else if (/^@@/.test(_line)) { + index.hunks.push(parseHunk()); + } else if (_line && options.strict) { + // Ignore unexpected content unless in strict mode + throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); + } else { + i++; + } + } + } // Parses the --- and +++ headers, if none are found, no lines + // are consumed. + + + function parseFileHeader(index) { + var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); + + if (fileHeader) { + var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; + var data = fileHeader[2].split('\t', 2); + var fileName = data[0].replace(/\\\\/g, '\\'); + + if (/^".*"$/.test(fileName)) { + fileName = fileName.substr(1, fileName.length - 2); + } + + index[keyPrefix + 'FileName'] = fileName; + index[keyPrefix + 'Header'] = (data[1] || '').trim(); + i++; + } + } // Parses a hunk + // This assumes that we are at the start of a hunk. + + + function parseHunk() { + var chunkHeaderIndex = i, + chunkHeaderLine = diffstr[i++], + chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); + var hunk = { + oldStart: +chunkHeader[1], + oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2], + newStart: +chunkHeader[3], + newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4], + lines: [], + linedelimiters: [] + }; // Unified Diff Format quirk: If the chunk size is 0, + // the first number is one lower than one would expect. + // https://www.artima.com/weblogs/viewpost.jsp?thread=164293 + + if (hunk.oldLines === 0) { + hunk.oldStart += 1; + } + + if (hunk.newLines === 0) { + hunk.newStart += 1; + } + + var addCount = 0, + removeCount = 0; + + for (; i < diffstr.length; i++) { + // Lines starting with '---' could be mistaken for the "remove line" operation + // But they could be the header for the next file. Therefore prune such cases out. + if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { + break; + } + + var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; + + if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { + hunk.lines.push(diffstr[i]); + hunk.linedelimiters.push(delimiters[i] || '\n'); + + if (operation === '+') { + addCount++; + } else if (operation === '-') { + removeCount++; + } else if (operation === ' ') { + addCount++; + removeCount++; + } + } else { + break; + } + } // Handle the empty block count case + + + if (!addCount && hunk.newLines === 1) { + hunk.newLines = 0; + } + + if (!removeCount && hunk.oldLines === 1) { + hunk.oldLines = 0; + } // Perform optional sanity checking + + + if (options.strict) { + if (addCount !== hunk.newLines) { + throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + + if (removeCount !== hunk.oldLines) { + throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + } + + return hunk; + } + + while (i < diffstr.length) { + parseIndex(); + } + + return list; + } + + var distanceIterator = {}; + + /*istanbul ignore start*/ + + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports["default"] = _default; + + /*istanbul ignore end*/ + // Iterator that traverses in the range of [min, max], stepping + // by distance from a given start position. I.e. for [0, 4], with + // start of 2, this will iterate 2, 3, 1, 4, 0. + function + /*istanbul ignore start*/ + _default + /*istanbul ignore end*/ + (start, minLine, maxLine) { + var wantForward = true, + backwardExhausted = false, + forwardExhausted = false, + localOffset = 1; + return function iterator() { + if (wantForward && !forwardExhausted) { + if (backwardExhausted) { + localOffset++; + } else { + wantForward = false; + } // Check if trying to fit beyond text length, and if not, check it fits + // after offset location (or desired location on first iteration) + + + if (start + localOffset <= maxLine) { + return localOffset; + } + + forwardExhausted = true; + } + + if (!backwardExhausted) { + if (!forwardExhausted) { + wantForward = true; + } // Check if trying to fit before text beginning, and if not, check it fits + // before offset location + + + if (minLine <= start - localOffset) { + return -localOffset++; + } + + backwardExhausted = true; + return iterator(); + } // We tried to fit hunk before text beginning and beyond text length, then + // hunk can't fit on the text. Return undefined + + }; + } + + }(distanceIterator)); + + /*istanbul ignore start*/ + + Object.defineProperty(apply, "__esModule", { + value: true + }); + apply.applyPatch = applyPatch; + apply.applyPatches = applyPatches; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _parse$1 = parse$2 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _distanceIterator = _interopRequireDefault(distanceIterator) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + function applyPatch(source, uniDiff) { + /*istanbul ignore start*/ + var + /*istanbul ignore end*/ + options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (typeof uniDiff === 'string') { + uniDiff = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _parse$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + parsePatch) + /*istanbul ignore end*/ + (uniDiff); + } + + if (Array.isArray(uniDiff)) { + if (uniDiff.length > 1) { + throw new Error('applyPatch only works with a single input.'); + } + + uniDiff = uniDiff[0]; + } // Apply the diff to the input + + + var lines = source.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], + hunks = uniDiff.hunks, + compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) + /*istanbul ignore start*/ + { + return ( + /*istanbul ignore end*/ + line === patchContent + ); + }, + errorCount = 0, + fuzzFactor = options.fuzzFactor || 0, + minLine = 0, + offset = 0, + removeEOFNL, + addEOFNL; + /** + * Checks if the hunk exactly fits on the provided location + */ + + + function hunkFits(hunk, toPos) { + for (var j = 0; j < hunk.lines.length; j++) { + var line = hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line; + + if (operation === ' ' || operation === '-') { + // Context sanity check + if (!compareLine(toPos + 1, lines[toPos], operation, content)) { + errorCount++; + + if (errorCount > fuzzFactor) { + return false; + } + } + + toPos++; + } + } + + return true; + } // Search best fit offsets for each hunk based on the previous ones + + + for (var i = 0; i < hunks.length; i++) { + var hunk = hunks[i], + maxLine = lines.length - hunk.oldLines, + localOffset = 0, + toPos = offset + hunk.oldStart - 1; + var iterator = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _distanceIterator + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ])(toPos, minLine, maxLine); + + for (; localOffset !== undefined; localOffset = iterator()) { + if (hunkFits(hunk, toPos + localOffset)) { + hunk.offset = offset += localOffset; + break; + } + } + + if (localOffset === undefined) { + return false; + } // Set lower text limit to end of the current hunk, so next ones don't try + // to fit over already patched text + + + minLine = hunk.offset + hunk.oldStart + hunk.oldLines; + } // Apply patch hunks + + + var diffOffset = 0; + + for (var _i = 0; _i < hunks.length; _i++) { + var _hunk = hunks[_i], + _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; + + diffOffset += _hunk.newLines - _hunk.oldLines; + + for (var j = 0; j < _hunk.lines.length; j++) { + var line = _hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line, + delimiter = _hunk.linedelimiters[j]; + + if (operation === ' ') { + _toPos++; + } else if (operation === '-') { + lines.splice(_toPos, 1); + delimiters.splice(_toPos, 1); + /* istanbul ignore else */ + } else if (operation === '+') { + lines.splice(_toPos, 0, content); + delimiters.splice(_toPos, 0, delimiter); + _toPos++; + } else if (operation === '\\') { + var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; + + if (previousOperation === '+') { + removeEOFNL = true; + } else if (previousOperation === '-') { + addEOFNL = true; + } + } + } + } // Handle EOFNL insertion/removal + + + if (removeEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + delimiters.pop(); + } + } else if (addEOFNL) { + lines.push(''); + delimiters.push('\n'); + } + + for (var _k = 0; _k < lines.length - 1; _k++) { + lines[_k] = lines[_k] + delimiters[_k]; + } + + return lines.join(''); + } // Wrapper that supports multiple file patches via callbacks. + + + function applyPatches(uniDiff, options) { + if (typeof uniDiff === 'string') { + uniDiff = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _parse$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + parsePatch) + /*istanbul ignore end*/ + (uniDiff); + } + + var currentIndex = 0; + + function processIndex() { + var index = uniDiff[currentIndex++]; + + if (!index) { + return options.complete(); + } + + options.loadFile(index, function (err, data) { + if (err) { + return options.complete(err); + } + + var updatedContent = applyPatch(data, index, options); + options.patched(index, updatedContent, function (err) { + if (err) { + return options.complete(err); + } + + processIndex(); + }); + }); + } + + processIndex(); + } + + var merge$1 = {}; + + var create = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(create, "__esModule", { + value: true + }); + create.structuredPatch = structuredPatch; + create.formatPatch = formatPatch; + create.createTwoFilesPatch = createTwoFilesPatch; + create.createPatch = createPatch; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _line = line + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _toConsumableArray$1(arr) { return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$1(arr) || _nonIterableSpread$1(); } + + function _nonIterableSpread$1() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + + function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } + + function _iterableToArray$1(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + + function _arrayWithoutHoles$1(arr) { if (Array.isArray(arr)) return _arrayLikeToArray$1(arr); } + + function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + /*istanbul ignore end*/ + function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + if (!options) { + options = {}; + } + + if (typeof options.context === 'undefined') { + options.context = 4; + } + + var diff = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _line + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + diffLines) + /*istanbul ignore end*/ + (oldStr, newStr, options); + diff.push({ + value: '', + lines: [] + }); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function (entry) { + return ' ' + entry; + }); + } + + var hunks = []; + var oldRangeStart = 0, + newRangeStart = 0, + curRange = [], + oldLine = 1, + newLine = 1; + + /*istanbul ignore start*/ + var _loop = function _loop( + /*istanbul ignore end*/ + i) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + /*istanbul ignore start*/ + var _curRange; + + /*istanbul ignore end*/ + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } // Output our changes + + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_curRange = + /*istanbul ignore end*/ + curRange).push.apply( + /*istanbul ignore start*/ + _curRange + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray$1( + /*istanbul ignore end*/ + lines.map(function (entry) { + return (current.added ? '+' : '-') + entry; + }))); // Track the updated file position + + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= options.context * 2 && i < diff.length - 2) { + /*istanbul ignore start*/ + var _curRange2; + + /*istanbul ignore end*/ + // Overlapping + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_curRange2 = + /*istanbul ignore end*/ + curRange).push.apply( + /*istanbul ignore start*/ + _curRange2 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray$1( + /*istanbul ignore end*/ + contextLines(lines))); + } else { + /*istanbul ignore start*/ + var _curRange3; + + /*istanbul ignore end*/ + // end the range and output + var contextSize = Math.min(lines.length, options.context); + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_curRange3 = + /*istanbul ignore end*/ + curRange).push.apply( + /*istanbul ignore start*/ + _curRange3 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray$1( + /*istanbul ignore end*/ + contextLines(lines.slice(0, contextSize)))); + + var hunk = { + oldStart: oldRangeStart, + oldLines: oldLine - oldRangeStart + contextSize, + newStart: newRangeStart, + newLines: newLine - newRangeStart + contextSize, + lines: curRange + }; + + if (i >= diff.length - 2 && lines.length <= options.context) { + // EOF is inside this hunk + var oldEOFNewline = /\n$/.test(oldStr); + var newEOFNewline = /\n$/.test(newStr); + var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines; + + if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) { + // special case: old has no eol and no trailing context; no-nl can end up before adds + // however, if the old file is empty, do not output the no-nl line + curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); + } + + if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) { + curRange.push('\\ No newline at end of file'); + } + } + + hunks.push(hunk); + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + + oldLine += lines.length; + newLine += lines.length; + } + }; + + for (var i = 0; i < diff.length; i++) { + /*istanbul ignore start*/ + _loop( + /*istanbul ignore end*/ + i); + } + + return { + oldFileName: oldFileName, + newFileName: newFileName, + oldHeader: oldHeader, + newHeader: newHeader, + hunks: hunks + }; + } + + function formatPatch(diff) { + var ret = []; + + if (diff.oldFileName == diff.newFileName) { + ret.push('Index: ' + diff.oldFileName); + } + + ret.push('==================================================================='); + ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); + ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); + + for (var i = 0; i < diff.hunks.length; i++) { + var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0, + // the first number is one lower than one would expect. + // https://www.artima.com/weblogs/viewpost.jsp?thread=164293 + + if (hunk.oldLines === 0) { + hunk.oldStart -= 1; + } + + if (hunk.newLines === 0) { + hunk.newStart -= 1; + } + + ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); + ret.push.apply(ret, hunk.lines); + } + + return ret.join('\n') + '\n'; + } + + function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options)); + } + + function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { + return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); + } + + var array = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(array, "__esModule", { + value: true + }); + array.arrayEqual = arrayEqual; + array.arrayStartsWith = arrayStartsWith; + + /*istanbul ignore end*/ + function arrayEqual(a, b) { + if (a.length !== b.length) { + return false; + } + + return arrayStartsWith(a, b); + } + + function arrayStartsWith(array, start) { + if (start.length > array.length) { + return false; + } + + for (var i = 0; i < start.length; i++) { + if (start[i] !== array[i]) { + return false; + } + } + + return true; + } + + /*istanbul ignore start*/ + + Object.defineProperty(merge$1, "__esModule", { + value: true + }); + merge$1.calcLineCount = calcLineCount; + merge$1.merge = merge; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _create = create + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _parse = parse$2 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _array = array + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + + function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + + function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + + function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + + function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + + function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + /*istanbul ignore end*/ + function calcLineCount(hunk) { + /*istanbul ignore start*/ + var _calcOldNewLineCount = + /*istanbul ignore end*/ + calcOldNewLineCount(hunk.lines), + oldLines = _calcOldNewLineCount.oldLines, + newLines = _calcOldNewLineCount.newLines; + + if (oldLines !== undefined) { + hunk.oldLines = oldLines; + } else { + delete hunk.oldLines; + } + + if (newLines !== undefined) { + hunk.newLines = newLines; + } else { + delete hunk.newLines; } } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); + + function merge(mine, theirs, base) { + mine = loadPatch(mine, base); + theirs = loadPatch(theirs, base); + var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning. + // Leaving sanity checks on this to the API consumer that may know more about the + // meaning in their own context. + + if (mine.index || theirs.index) { + ret.index = mine.index || theirs.index; + } + + if (mine.newFileName || theirs.newFileName) { + if (!fileNameChanged(mine)) { + // No header or no change in ours, use theirs (and ours if theirs does not exist) + ret.oldFileName = theirs.oldFileName || mine.oldFileName; + ret.newFileName = theirs.newFileName || mine.newFileName; + ret.oldHeader = theirs.oldHeader || mine.oldHeader; + ret.newHeader = theirs.newHeader || mine.newHeader; + } else if (!fileNameChanged(theirs)) { + // No header or no change in theirs, use ours + ret.oldFileName = mine.oldFileName; + ret.newFileName = mine.newFileName; + ret.oldHeader = mine.oldHeader; + ret.newHeader = mine.newHeader; + } else { + // Both changed... figure it out + ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); + ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); + ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); + ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); + } + } + + ret.hunks = []; + var mineIndex = 0, + theirsIndex = 0, + mineOffset = 0, + theirsOffset = 0; + + while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { + var mineCurrent = mine.hunks[mineIndex] || { + oldStart: Infinity + }, + theirsCurrent = theirs.hunks[theirsIndex] || { + oldStart: Infinity + }; + + if (hunkBefore(mineCurrent, theirsCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); + mineIndex++; + theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; + } else if (hunkBefore(theirsCurrent, mineCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); + theirsIndex++; + mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; + } else { + // Overlap, merge as best we can + var mergedHunk = { + oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), + oldLines: 0, + newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), + newLines: 0, + lines: [] + }; + mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); + theirsIndex++; + mineIndex++; + ret.hunks.push(mergedHunk); + } + } + + return ret; + } + + function loadPatch(param, base) { + if (typeof param === 'string') { + if (/^@@/m.test(param) || /^Index:/m.test(param)) { + return ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _parse + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + parsePatch) + /*istanbul ignore end*/ + (param)[0] + ); + } + + if (!base) { + throw new Error('Must provide a base reference or pass in a patch'); + } + + return ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _create + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + structuredPatch) + /*istanbul ignore end*/ + (undefined, undefined, base, param) + ); + } + + return param; + } + + function fileNameChanged(patch) { + return patch.newFileName && patch.newFileName !== patch.oldFileName; + } + + function selectField(index, mine, theirs) { + if (mine === theirs) { + return mine; + } else { + index.conflict = true; + return { + mine: mine, + theirs: theirs + }; + } + } + + function hunkBefore(test, check) { + return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; + } + + function cloneHunk(hunk, offset) { + return { + oldStart: hunk.oldStart, + oldLines: hunk.oldLines, + newStart: hunk.newStart + offset, + newLines: hunk.newLines, + lines: hunk.lines + }; + } + + function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { + // This will generally result in a conflicted hunk, but there are cases where the context + // is the only overlap where we can successfully merge the content here. + var mine = { + offset: mineOffset, + lines: mineLines, + index: 0 + }, + their = { + offset: theirOffset, + lines: theirLines, + index: 0 + }; // Handle any leading content + + insertLeading(hunk, mine, their); + insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each. + + while (mine.index < mine.lines.length && their.index < their.lines.length) { + var mineCurrent = mine.lines[mine.index], + theirCurrent = their.lines[their.index]; + + if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { + // Both modified ... + mutualChange(hunk, mine, their); + } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { + /*istanbul ignore start*/ + var _hunk$lines; + + /*istanbul ignore end*/ + // Mine inserted + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + collectChange(mine))); + } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { + /*istanbul ignore start*/ + var _hunk$lines2; + + /*istanbul ignore end*/ + // Theirs inserted + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines2 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines2 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + collectChange(their))); + } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { + // Mine removed or edited + removal(hunk, mine, their); + } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { + // Their removed or edited + removal(hunk, their, mine, true); + } else if (mineCurrent === theirCurrent) { + // Context identity + hunk.lines.push(mineCurrent); + mine.index++; + their.index++; + } else { + // Context mismatch + conflict(hunk, collectChange(mine), collectChange(their)); + } + } // Now push anything that may be remaining + + + insertTrailing(hunk, mine); + insertTrailing(hunk, their); + calcLineCount(hunk); + } + + function mutualChange(hunk, mine, their) { + var myChanges = collectChange(mine), + theirChanges = collectChange(their); + + if (allRemoves(myChanges) && allRemoves(theirChanges)) { + // Special case for remove changes that are supersets of one another + if ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _array + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + arrayStartsWith) + /*istanbul ignore end*/ + (myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { + /*istanbul ignore start*/ + var _hunk$lines3; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines3 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines3 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + myChanges)); + + return; + } else if ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _array + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + arrayStartsWith) + /*istanbul ignore end*/ + (theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { + /*istanbul ignore start*/ + var _hunk$lines4; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines4 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines4 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + theirChanges)); + + return; + } + } else if ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _array + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + arrayEqual) + /*istanbul ignore end*/ + (myChanges, theirChanges)) { + /*istanbul ignore start*/ + var _hunk$lines5; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines5 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines5 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + myChanges)); + + return; + } + + conflict(hunk, myChanges, theirChanges); + } + + function removal(hunk, mine, their, swap) { + var myChanges = collectChange(mine), + theirChanges = collectContext(their, myChanges); + + if (theirChanges.merged) { + /*istanbul ignore start*/ + var _hunk$lines6; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines6 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines6 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + theirChanges.merged)); + } else { + conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); + } + } + + function conflict(hunk, mine, their) { + hunk.conflict = true; + hunk.lines.push({ + conflict: true, + mine: mine, + theirs: their + }); + } + + function insertLeading(hunk, insert, their) { + while (insert.offset < their.offset && insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + insert.offset++; + } + } + + function insertTrailing(hunk, insert) { + while (insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + } + } + + function collectChange(state) { + var ret = [], + operation = state.lines[state.index][0]; + + while (state.index < state.lines.length) { + var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. + + if (operation === '-' && line[0] === '+') { + operation = '+'; + } + + if (operation === line[0]) { + ret.push(line); + state.index++; + } else { + break; + } + } + + return ret; + } + + function collectContext(state, matchChanges) { + var changes = [], + merged = [], + matchIndex = 0, + contextChanges = false, + conflicted = false; + + while (matchIndex < matchChanges.length && state.index < state.lines.length) { + var change = state.lines[state.index], + match = matchChanges[matchIndex]; // Once we've hit our add, then we are done + + if (match[0] === '+') { + break; + } + + contextChanges = contextChanges || change[0] !== ' '; + merged.push(match); + matchIndex++; // Consume any additions in the other block as a conflict to attempt + // to pull in the remaining context after this + + if (change[0] === '+') { + conflicted = true; + + while (change[0] === '+') { + changes.push(change); + change = state.lines[++state.index]; + } + } + + if (match.substr(1) === change.substr(1)) { + changes.push(change); + state.index++; + } else { + conflicted = true; + } + } + + if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { + conflicted = true; + } + + if (conflicted) { + return changes; + } + + while (matchIndex < matchChanges.length) { + merged.push(matchChanges[matchIndex++]); + } + + return { + merged: merged, + changes: changes + }; + } + + function allRemoves(changes) { + return changes.reduce(function (prev, change) { + return prev && change[0] === '-'; + }, true); + } + + function skipRemoveSuperset(state, removeChanges, delta) { + for (var i = 0; i < delta; i++) { + var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); + + if (state.lines[state.index + i] !== ' ' + changeContent) { + return false; + } + } + + state.index += delta; + return true; + } + + function calcOldNewLineCount(lines) { + var oldLines = 0; + var newLines = 0; + lines.forEach(function (line) { + if (typeof line !== 'string') { + var myCount = calcOldNewLineCount(line.mine); + var theirCount = calcOldNewLineCount(line.theirs); + + if (oldLines !== undefined) { + if (myCount.oldLines === theirCount.oldLines) { + oldLines += myCount.oldLines; + } else { + oldLines = undefined; + } + } + + if (newLines !== undefined) { + if (myCount.newLines === theirCount.newLines) { + newLines += myCount.newLines; + } else { + newLines = undefined; + } + } + } else { + if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { + newLines++; + } + + if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { + oldLines++; + } + } + }); + return { + oldLines: oldLines, + newLines: newLines + }; + } + + var dmp = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(dmp, "__esModule", { + value: true + }); + dmp.convertChangesToDMP = convertChangesToDMP; + + /*istanbul ignore end*/ + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + function convertChangesToDMP(changes) { + var ret = [], + change, + operation; + + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + + ret.push([operation, change.value]); + } + + return ret; + } + + var xml = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(xml, "__esModule", { + value: true + }); + xml.convertChangesToXML = convertChangesToXML; + + /*istanbul ignore end*/ + function convertChangesToXML(changes) { + var ret = []; + + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + + if (change.added) { + ret.push('<ins>'); + } else if (change.removed) { + ret.push('<del>'); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push('</ins>'); + } else if (change.removed) { + ret.push('</del>'); + } + } + + return ret.join(''); + } + + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(/</g, '<'); + n = n.replace(/>/g, '>'); + n = n.replace(/"/g, '"'); + return n; + } + + /*istanbul ignore start*/ + + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "Diff", { + enumerable: true, + get: function get() { + return _base["default"]; } }); - return output; -} + Object.defineProperty(exports, "diffChars", { + enumerable: true, + get: function get() { + return _character.diffChars; + } + }); + Object.defineProperty(exports, "diffWords", { + enumerable: true, + get: function get() { + return _word.diffWords; + } + }); + Object.defineProperty(exports, "diffWordsWithSpace", { + enumerable: true, + get: function get() { + return _word.diffWordsWithSpace; + } + }); + Object.defineProperty(exports, "diffLines", { + enumerable: true, + get: function get() { + return _line.diffLines; + } + }); + Object.defineProperty(exports, "diffTrimmedLines", { + enumerable: true, + get: function get() { + return _line.diffTrimmedLines; + } + }); + Object.defineProperty(exports, "diffSentences", { + enumerable: true, + get: function get() { + return _sentence.diffSentences; + } + }); + Object.defineProperty(exports, "diffCss", { + enumerable: true, + get: function get() { + return _css.diffCss; + } + }); + Object.defineProperty(exports, "diffJson", { + enumerable: true, + get: function get() { + return _json.diffJson; + } + }); + Object.defineProperty(exports, "canonicalize", { + enumerable: true, + get: function get() { + return _json.canonicalize; + } + }); + Object.defineProperty(exports, "diffArrays", { + enumerable: true, + get: function get() { + return _array.diffArrays; + } + }); + Object.defineProperty(exports, "applyPatch", { + enumerable: true, + get: function get() { + return _apply.applyPatch; + } + }); + Object.defineProperty(exports, "applyPatches", { + enumerable: true, + get: function get() { + return _apply.applyPatches; + } + }); + Object.defineProperty(exports, "parsePatch", { + enumerable: true, + get: function get() { + return _parse.parsePatch; + } + }); + Object.defineProperty(exports, "merge", { + enumerable: true, + get: function get() { + return _merge.merge; + } + }); + Object.defineProperty(exports, "structuredPatch", { + enumerable: true, + get: function get() { + return _create.structuredPatch; + } + }); + Object.defineProperty(exports, "createTwoFilesPatch", { + enumerable: true, + get: function get() { + return _create.createTwoFilesPatch; + } + }); + Object.defineProperty(exports, "createPatch", { + enumerable: true, + get: function get() { + return _create.createPatch; + } + }); + Object.defineProperty(exports, "convertChangesToDMP", { + enumerable: true, + get: function get() { + return _dmp.convertChangesToDMP; + } + }); + Object.defineProperty(exports, "convertChangesToXML", { + enumerable: true, + get: function get() { + return _xml.convertChangesToXML; + } + }); + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base = _interopRequireDefault(base) + /*istanbul ignore end*/ + ; -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); + var + /*istanbul ignore start*/ + _character = character + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _word = word + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _line = line + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _sentence = sentence + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _css = css + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _json = json$1 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _array = array$1 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _apply = apply + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _parse = parse$2 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _merge = merge$1 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _create = create + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _dmp = dmp + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _xml = xml + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + + }(lib)); + + /** + * Helpers. + */ + + var s$1 = 1000; + var m$1 = s$1 * 60; + var h$1 = m$1 * 60; + var d$1 = h$1 * 24; + var w$1 = d$1 * 7; + var y$1 = d$1 * 365.25; + + /** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + + var ms$1 = function (val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse$1(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong$1(val) : fmtShort$1(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); + }; + + /** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + + function parse$1(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y$1; + case 'weeks': + case 'week': + case 'w': + return n * w$1; + case 'days': + case 'day': + case 'd': + return n * d$1; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h$1; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m$1; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s$1; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } + } + + /** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtShort$1(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d$1) { + return Math.round(ms / d$1) + 'd'; + } + if (msAbs >= h$1) { + return Math.round(ms / h$1) + 'h'; + } + if (msAbs >= m$1) { + return Math.round(ms / m$1) + 'm'; + } + if (msAbs >= s$1) { + return Math.round(ms / s$1) + 's'; + } + return ms + 'ms'; + } + + /** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtLong$1(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d$1) { + return plural$1(ms, msAbs, d$1, 'day'); + } + if (msAbs >= h$1) { + return plural$1(ms, msAbs, h$1, 'hour'); + } + if (msAbs >= m$1) { + return plural$1(ms, msAbs, m$1, 'minute'); + } + if (msAbs >= s$1) { + return plural$1(ms, msAbs, s$1, 'second'); + } + return ms + ' ms'; + } + + /** + * Pluralization helper. + */ + + function plural$1(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); + } + + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; + var inited = false; + function init () { + inited = true; + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + + revLookup['-'.charCodeAt(0)] = 62; + revLookup['_'.charCodeAt(0)] = 63; + } + + function toByteArray (b64) { + if (!inited) { + init(); + } + var i, j, l, tmp, placeHolders, arr; + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders); + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len; + + var L = 0; + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; + arr[L++] = (tmp >> 16) & 0xFF; + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[L++] = tmp & 0xFF; + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + return arr + } + + function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] + } + + function encodeChunk (uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); + output.push(tripletToBase64(tmp)); + } + return output.join('') + } + + function fromByteArray (uint8) { + if (!inited) { + init(); + } + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var output = ''; + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + output += lookup[tmp >> 2]; + output += lookup[(tmp << 4) & 0x3F]; + output += '=='; + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); + output += lookup[tmp >> 10]; + output += lookup[(tmp >> 4) & 0x3F]; + output += lookup[(tmp << 2) & 0x3F]; + output += '='; + } + + parts.push(output); + + return parts.join('') + } + + function read (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) } else { - str = ctx.stylize('[Getter]', 'special'); + m = m + Math.pow(2, mLen); + e = e - eBias; } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); + + function write (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; + } + + var toString$1 = {}.toString; + + var isArray = Array.isArray || function (arr) { + return toString$1.call(arr) == '[object Array]'; + }; + + var INSPECT_MAX_BYTES = 50; + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ + Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined + ? global$1.TYPED_ARRAY_SUPPORT + : true; + + function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff + } + + function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length); + that.__proto__ = Buffer.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length); + } + that.length = length; + } + + return that + } + + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } + + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe(this, arg) + } + return from(this, arg, encodingOrOffset, length) + } + + Buffer.poolSize = 8192; // not used by this implementation + + // TODO: Legacy, not needed anymore. Remove in next major version. + Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype; + return arr + }; + + function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } + + return fromObject(that, value) + } + + /** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) + }; + + if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype; + Buffer.__proto__ = Uint8Array; + } + + function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } + } + + function alloc (that, size, fill, encoding) { + assertSize(size); + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) + } + + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) + }; + + function allocUnsafe (that, size) { + assertSize(size); + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0; + } + } + return that + } + + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) + }; + + function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength(string, encoding) | 0; + that = createBuffer(that, length); + + var actual = that.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual); + } + + return that + } + + function fromArrayLike (that, array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0; + that = createBuffer(that, length); + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255; + } + return that + } + + function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength; // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array); + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset); + } else { + array = new Uint8Array(array, byteOffset, length); + } + + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array; + that.__proto__ = Buffer.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike(that, array); + } + return that + } + + function fromObject (that, obj) { + if (internalIsBuffer(obj)) { + var len = checked(obj.length) | 0; + that = createBuffer(that, len); + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len); + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } + + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') + } + + function checked (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 + } + Buffer.isBuffer = isBuffer; + function internalIsBuffer (b) { + return !!(b != null && b._isBuffer) + } + + Buffer.compare = function compare (a, b) { + if (!internalIsBuffer(a) || !internalIsBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } + }; + + Buffer.concat = function concat (list, length) { + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i; + if (length === undefined) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer.allocUnsafe(length); + var pos = 0; + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + if (!internalIsBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos); + pos += buf.length; + } + return buffer + }; + + function byteLength (string, encoding) { + if (internalIsBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string; + } + + var len = string.length; + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer.byteLength = byteLength; + + function slowToString (encoding, start, end) { + var loweredCase = false; + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0; + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8'; + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } + } + } + + // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect + // Buffer instances. + Buffer.prototype._isBuffer = true; + + function swap (b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; + } + + Buffer.prototype.swap16 = function swap16 () { + var len = this.length; + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this + }; + + Buffer.prototype.swap32 = function swap32 () { + var len = this.length; + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this + }; + + Buffer.prototype.swap64 = function swap64 () { + var len = this.length; + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this + }; + + Buffer.prototype.toString = function toString () { + var length = this.length | 0; + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) + }; + + Buffer.prototype.equals = function equals (b) { + if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 + }; + + Buffer.prototype.inspect = function inspect () { + var str = ''; + var max = INSPECT_MAX_BYTES; + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); + if (this.length > max) str += ' ... '; + } + return '<Buffer ' + str + '>' + }; + + Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!internalIsBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0; + } + if (end === undefined) { + end = target ? target.length : 0; + } + if (thisStart === undefined) { + thisStart = 0; + } + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + + if (this === target) return 0 + + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1); + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (internalIsBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') + } + + function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i; + if (dir) { + var foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; } } } else { - str = ctx.stylize('[Circular]', 'special'); + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + var found = true; + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break + } + } + if (found) return i + } + } + + return -1 + } + + Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 + }; + + Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) + }; + + Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) + }; + + function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + // must be an even number of digits + var strLen = string.length; + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2; + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (isNaN(parsed)) return i + buf[offset + i] = parsed; + } + return i + } + + function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) + } + + function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) + } + + function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) + } + + function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) + } + + function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) + } + + Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0; + if (isFinite(length)) { + length = length | 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8'; + + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } + }; + + function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return fromByteArray(buf) + } else { + return fromByteArray(buf.slice(start, end)) } } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { + + function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + + var i = start; + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + break + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } + } + break + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } + } + break + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray(res) + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH = 0x1000; + + function decodeCodePointsArray (codePoints) { + var len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = ''; + var i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ); + } + return res + } + + function asciiSlice (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + return ret + } + + function latin1Slice (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret + } + + function hexSlice (buf, start, end) { + var len = buf.length; + + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + + var out = ''; + for (var i = start; i < end; ++i) { + out += toHex(buf[i]); + } + return out + } + + function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res + } + + Buffer.prototype.slice = function slice (start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + + var newBuf; + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end); + newBuf.__proto__ = Buffer.prototype; + } else { + var sliceLen = end - start; + newBuf = new Buffer(sliceLen, undefined); + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start]; + } + } + + return newBuf + }; + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') + } + + Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val + }; + + Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + checkOffset(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val + }; + + Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset] + }; + + Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8) + }; + + Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1] + }; + + Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) + }; + + Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + }; + + Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) + }; + + Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset] | (this[offset + 1] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset + 1] | (this[offset] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + }; + + Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) + }; + + Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + return read(this, offset, true, 23, 4) + }; + + Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + return read(this, offset, false, 23, 4) + }; + + Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length); + return read(this, offset, true, 52, 8) + }; + + Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length); + return read(this, offset, false, 52, 8) + }; + + function checkInt (buf, value, offset, ext, max, min) { + if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') + } + + Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + this[offset] = (value & 0xff); + return offset + 1 + }; + + function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8; + } + } + + Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16(this, value, offset, true); + } + return offset + 2 + }; + + Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16(this, value, offset, false); + } + return offset + 2 + }; + + function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; + } + } + + Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24); + this[offset + 2] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, true); + } + return offset + 4 + }; + + Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, false); + } + return offset + 4 + }; + + Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + if (value < 0) value = 0xff + value + 1; + this[offset] = (value & 0xff); + return offset + 1 + }; + + Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16(this, value, offset, true); + } + return offset + 2 + }; + + Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16(this, value, offset, false); + } + return offset + 2 + }; + + Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + this[offset + 2] = (value >>> 16); + this[offset + 3] = (value >>> 24); + } else { + objectWriteUInt32(this, value, offset, true); + } + return offset + 4 + }; + + Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, false); + } + return offset + 4 + }; + + function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') + } + + function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4); + } + write(buf, value, offset, littleEndian, 23, 4); + return offset + 4 + } + + Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) + }; + + Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) + }; + + function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8); + } + write(buf, value, offset, littleEndian, 52, 8); + return offset + 8 + } + + Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) + }; + + Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) + }; + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + var i; + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ); + } + + return len + }; + + // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + if (val.length === 1) { + var code = val.charCodeAt(0); + if (code < 256) { + val = code; + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255; + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + + if (!val) val = 0; + + var i; + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = internalIsBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()); + var len = bytes.length; + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this + }; + + // HELPER FUNCTIONS + // ================ + + var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; + + function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, ''); + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '='; + } + return str + } + + function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') + } + + function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) + } + + function utf8ToBytes (string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } + + // valid lead + leadSurrogate = codePoint; + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + } + + leadSurrogate = null; + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else { + throw new Error('Invalid code point') + } + } + + return bytes + } + + function asciiToBytes (str) { + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + return byteArray + } + + function utf16leToBytes (str, units) { + var c, hi, lo; + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray + } + + + function base64ToBytes (str) { + return toByteArray(base64clean(str)) + } + + function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i]; + } + return i + } + + function isnan (val) { + return val !== val // eslint-disable-line no-self-compare + } + + + // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence + // The _isBuffer check is for Safari 5-7 support, because it's missing + // Object.prototype.constructor. Remove this eventually + function isBuffer(obj) { + return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) + } + + function isFastBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) + } + + // For Node v0.10 support. Remove this eventually. + function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) + } + + var browser$2 = true; + + var utils$3 = {}; + + let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'; + let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = ''; + let i = size; + while (i--) { + id += alphabet[(Math.random() * alphabet.length) | 0]; + } + return id + } + }; + let nanoid = (size = 21) => { + let id = ''; + let i = size; + while (i--) { + id += urlAlphabet[(Math.random() * 64) | 0]; + } + return id + }; + var nonSecure = { nanoid, customAlphabet }; + + var he = {exports: {}}; + + /*! https://mths.be/he v1.2.0 by @mathias | MIT license */ + + (function (module, exports) { + (function(root) { + + // Detect free variables `exports`. + var freeExports = exports; + + // Detect free variable `module`. + var freeModule = module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, + // and use it as `root`. + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + // All astral symbols. + var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + // All ASCII symbols (not just printable ASCII) except those listed in the + // first column of the overrides table. + // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides + var regexAsciiWhitelist = /[\x01-\x7F]/g; + // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or + // code points listed in the first column of the overrides table on + // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides. + var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g; + + var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g; + var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'}; + + var regexEscape = /["&'<>`]/g; + var escapeMap = { + '"': '"', + '&': '&', + '\'': ''', + '<': '<', + // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the + // following is not strictly necessary unless it’s part of a tag or an + // unquoted attribute value. We’re only escaping it to support those + // situations, and for XML support. + '>': '>', + // In Internet Explorer ≤ 8, the backtick character can be used + // to break out of (un)quoted attribute values or HTML comments. + // See http://html5sec.org/#102, http://html5sec.org/#108, and + // http://html5sec.org/#133. + '`': '`' + }; + + var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/; + var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; + var regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g; + var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'}; + var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'}; + var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'}; + var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]; + + /*--------------------------------------------------------------------------*/ + + var stringFromCharCode = String.fromCharCode; + + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + var has = function(object, propertyName) { + return hasOwnProperty.call(object, propertyName); + }; + + var contains = function(array, value) { + var index = -1; + var length = array.length; + while (++index < length) { + if (array[index] == value) { + return true; + } + } + return false; + }; + + var merge = function(options, defaults) { + if (!options) { + return defaults; + } + var result = {}; + var key; + for (key in defaults) { + // A `hasOwnProperty` check is not needed here, since only recognized + // option names are used anyway. Any others are ignored. + result[key] = has(options, key) ? options[key] : defaults[key]; + } + return result; + }; + + // Modified version of `ucs2encode`; see https://mths.be/punycode. + var codePointToSymbol = function(codePoint, strict) { + var output = ''; + if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) { + // See issue #4: + // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is + // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD + // REPLACEMENT CHARACTER.” + if (strict) { + parseError('character reference outside the permissible Unicode range'); + } + return '\uFFFD'; + } + if (has(decodeMapNumeric, codePoint)) { + if (strict) { + parseError('disallowed character reference'); + } + return decodeMapNumeric[codePoint]; + } + if (strict && contains(invalidReferenceCodePoints, codePoint)) { + parseError('disallowed character reference'); + } + if (codePoint > 0xFFFF) { + codePoint -= 0x10000; + output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + output += stringFromCharCode(codePoint); + return output; + }; + + var hexEscape = function(codePoint) { + return '&#x' + codePoint.toString(16).toUpperCase() + ';'; + }; + + var decEscape = function(codePoint) { + return '&#' + codePoint + ';'; + }; + + var parseError = function(message) { + throw Error('Parse error: ' + message); + }; + + /*--------------------------------------------------------------------------*/ + + var encode = function(string, options) { + options = merge(options, encode.options); + var strict = options.strict; + if (strict && regexInvalidRawCodePoint.test(string)) { + parseError('forbidden code point'); + } + var encodeEverything = options.encodeEverything; + var useNamedReferences = options.useNamedReferences; + var allowUnsafeSymbols = options.allowUnsafeSymbols; + var escapeCodePoint = options.decimal ? decEscape : hexEscape; + + var escapeBmpSymbol = function(symbol) { + return escapeCodePoint(symbol.charCodeAt(0)); + }; + + if (encodeEverything) { + // Encode ASCII symbols. + string = string.replace(regexAsciiWhitelist, function(symbol) { + // Use named references if requested & possible. + if (useNamedReferences && has(encodeMap, symbol)) { + return '&' + encodeMap[symbol] + ';'; + } + return escapeBmpSymbol(symbol); + }); + // Shorten a few escapes that represent two symbols, of which at least one + // is within the ASCII range. + if (useNamedReferences) { + string = string + .replace(/>\u20D2/g, '>⃒') + .replace(/<\u20D2/g, '<⃒') + .replace(/fj/g, 'fj'); + } + // Encode non-ASCII symbols. + if (useNamedReferences) { + // Encode non-ASCII symbols that can be replaced with a named reference. + string = string.replace(regexEncodeNonAscii, function(string) { + // Note: there is no need to check `has(encodeMap, string)` here. + return '&' + encodeMap[string] + ';'; + }); + } + // Note: any remaining non-ASCII symbols are handled outside of the `if`. + } else if (useNamedReferences) { + // Apply named character references. + // Encode `<>"'&` using named character references. + if (!allowUnsafeSymbols) { + string = string.replace(regexEscape, function(string) { + return '&' + encodeMap[string] + ';'; // no need to check `has()` here + }); + } + // Shorten escapes that represent two symbols, of which at least one is + // `<>"'&`. + string = string + .replace(/>\u20D2/g, '>⃒') + .replace(/<\u20D2/g, '<⃒'); + // Encode non-ASCII symbols that can be replaced with a named reference. + string = string.replace(regexEncodeNonAscii, function(string) { + // Note: there is no need to check `has(encodeMap, string)` here. + return '&' + encodeMap[string] + ';'; + }); + } else if (!allowUnsafeSymbols) { + // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled + // using named character references. + string = string.replace(regexEscape, escapeBmpSymbol); + } + return string + // Encode astral symbols. + .replace(regexAstralSymbols, function($0) { + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + var high = $0.charCodeAt(0); + var low = $0.charCodeAt(1); + var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; + return escapeCodePoint(codePoint); + }) + // Encode any remaining BMP symbols that are not printable ASCII symbols + // using a hexadecimal escape. + .replace(regexBmpWhitelist, escapeBmpSymbol); + }; + // Expose default options (so they can be overridden globally). + encode.options = { + 'allowUnsafeSymbols': false, + 'encodeEverything': false, + 'strict': false, + 'useNamedReferences': false, + 'decimal' : false + }; + + var decode = function(html, options) { + options = merge(options, decode.options); + var strict = options.strict; + if (strict && regexInvalidEntity.test(html)) { + parseError('malformed character reference'); + } + return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) { + var codePoint; + var semicolon; + var decDigits; + var hexDigits; + var reference; + var next; + + if ($1) { + reference = $1; + // Note: there is no need to check `has(decodeMap, reference)`. + return decodeMap[reference]; + } + + if ($2) { + // Decode named character references without trailing `;`, e.g. `&`. + // This is only a parse error if it gets converted to `&`, or if it is + // followed by `=` in an attribute context. + reference = $2; + next = $3; + if (next && options.isAttributeValue) { + if (strict && next == '=') { + parseError('`&` did not start a character reference'); + } + return $0; + } else { + if (strict) { + parseError( + 'named character reference was not terminated by a semicolon' + ); + } + // Note: there is no need to check `has(decodeMapLegacy, reference)`. + return decodeMapLegacy[reference] + (next || ''); + } + } + + if ($4) { + // Decode decimal escapes, e.g. `𝌆`. + decDigits = $4; + semicolon = $5; + if (strict && !semicolon) { + parseError('character reference was not terminated by a semicolon'); + } + codePoint = parseInt(decDigits, 10); + return codePointToSymbol(codePoint, strict); + } + + if ($6) { + // Decode hexadecimal escapes, e.g. `𝌆`. + hexDigits = $6; + semicolon = $7; + if (strict && !semicolon) { + parseError('character reference was not terminated by a semicolon'); + } + codePoint = parseInt(hexDigits, 16); + return codePointToSymbol(codePoint, strict); + } + + // If we’re still here, `if ($7)` is implied; it’s an ambiguous + // ampersand for sure. https://mths.be/notes/ambiguous-ampersands + if (strict) { + parseError( + 'named character reference was not terminated by a semicolon' + ); + } + return $0; + }); + }; + // Expose default options (so they can be overridden globally). + decode.options = { + 'isAttributeValue': false, + 'strict': false + }; + + var escape = function(string) { + return string.replace(regexEscape, function($0) { + // Note: there is no need to check `has(escapeMap, $0)` here. + return escapeMap[$0]; + }); + }; + + /*--------------------------------------------------------------------------*/ + + var he = { + 'version': '1.2.0', + 'encode': encode, + 'decode': decode, + 'escape': escape, + 'unescape': decode + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = he; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in he) { + has(he, key) && (freeExports[key] = he[key]); + } + } + } else { // in Rhino or a web browser + root.he = he; + } + + }(commonjsGlobal)); + }(he, he.exports)); + + (function (exports) { + + /** + * Various utility functions used throughout Mocha's codebase. + * @module utils + */ + + /** + * Module dependencies. + */ + + const {nanoid} = nonSecure; + var path = require$$1; + var util = require$$0$1; + var he$1 = he.exports; + + const MOCHA_ID_PROP_NAME = '__mocha_id__'; + + /** + * Inherit the prototype methods from one constructor into another. + * + * @param {function} ctor - Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor - Constructor function to inherit prototype from. + * @throws {TypeError} if either constructor is null, or if super constructor + * lacks a prototype. + */ + exports.inherits = util.inherits; + + /** + * Escape special characters in the given string of html. + * + * @private + * @param {string} html + * @return {string} + */ + exports.escape = function (html) { + return he$1.encode(String(html), {useNamedReferences: false}); + }; + + /** + * Test if the given obj is type of string. + * + * @private + * @param {Object} obj + * @return {boolean} + */ + exports.isString = function (obj) { + return typeof obj === 'string'; + }; + + /** + * Compute a slug from the given `str`. + * + * @private + * @param {string} str + * @return {string} + */ + exports.slug = function (str) { + return str + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^-\w]/g, '') + .replace(/-{2,}/g, '-'); + }; + + /** + * Strip the function definition from `str`, and re-indent for pre whitespace. + * + * @param {string} str + * @return {string} + */ + exports.clean = function (str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, '\n') + .replace(/^\uFEFF/, '') + // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content + .replace( + /^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, + '$1$2$3' + ); + + var spaces = str.match(/^\n?( *)/)[1].length; + var tabs = str.match(/^\n?(\t*)/)[1].length; + var re = new RegExp( + '^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs || spaces) + '}', + 'gm' + ); + + str = str.replace(re, ''); + + return str.trim(); + }; + + /** + * If a value could have properties, and has none, this function is called, + * which returns a string representation of the empty value. + * + * Functions w/ no properties return `'[Function]'` + * Arrays w/ length === 0 return `'[]'` + * Objects w/ no properties return `'{}'` + * All else: return result of `value.toString()` + * + * @private + * @param {*} value The value to inspect. + * @param {string} typeHint The type of the value + * @returns {string} + */ + function emptyRepresentation(value, typeHint) { + switch (typeHint) { + case 'function': + return '[Function]'; + case 'object': + return '{}'; + case 'array': + return '[]'; + default: + return value.toString(); + } + } + + /** + * Takes some variable and asks `Object.prototype.toString()` what it thinks it + * is. + * + * @private + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString + * @param {*} value The value to test. + * @returns {string} Computed type + * @example + * canonicalType({}) // 'object' + * canonicalType([]) // 'array' + * canonicalType(1) // 'number' + * canonicalType(false) // 'boolean' + * canonicalType(Infinity) // 'number' + * canonicalType(null) // 'null' + * canonicalType(new Date()) // 'date' + * canonicalType(/foo/) // 'regexp' + * canonicalType('type') // 'string' + * canonicalType(global) // 'global' + * canonicalType(new String('foo') // 'object' + * canonicalType(async function() {}) // 'asyncfunction' + * canonicalType(await import(name)) // 'module' + */ + var canonicalType = (exports.canonicalType = function canonicalType(value) { + if (value === undefined) { + return 'undefined'; + } else if (value === null) { + return 'null'; + } else if (isBuffer(value)) { + return 'buffer'; + } + return Object.prototype.toString + .call(value) + .replace(/^\[.+\s(.+?)]$/, '$1') + .toLowerCase(); + }); + + /** + * + * Returns a general type or data structure of a variable + * @private + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures + * @param {*} value The value to test. + * @returns {string} One of undefined, boolean, number, string, bigint, symbol, object + * @example + * type({}) // 'object' + * type([]) // 'array' + * type(1) // 'number' + * type(false) // 'boolean' + * type(Infinity) // 'number' + * type(null) // 'null' + * type(new Date()) // 'object' + * type(/foo/) // 'object' + * type('type') // 'string' + * type(global) // 'object' + * type(new String('foo') // 'string' + */ + exports.type = function type(value) { + // Null is special + if (value === null) return 'null'; + const primitives = new Set([ + 'undefined', + 'boolean', + 'number', + 'string', + 'bigint', + 'symbol' + ]); + const _type = typeof value; + if (_type === 'function') return _type; + if (primitives.has(_type)) return _type; + if (value instanceof String) return 'string'; + if (value instanceof Error) return 'error'; + if (Array.isArray(value)) return 'array'; + + return _type; + }; + + /** + * Stringify `value`. Different behavior depending on type of value: + * + * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. + * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. + * - If `value` is an *empty* object, function, or array, return result of function + * {@link emptyRepresentation}. + * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of + * JSON.stringify(). + * + * @private + * @see exports.type + * @param {*} value + * @return {string} + */ + exports.stringify = function (value) { + var typeHint = canonicalType(value); + + if (!~['object', 'array', 'function'].indexOf(typeHint)) { + if (typeHint === 'buffer') { + var json = Buffer.prototype.toJSON.call(value); + // Based on the toJSON result + return jsonStringify( + json.data && json.type ? json.data : json, + 2 + ).replace(/,(\n|$)/g, '$1'); + } + + // IE7/IE8 has a bizarre String constructor; needs to be coerced + // into an array and back to obj. + if (typeHint === 'string' && typeof value === 'object') { + value = value.split('').reduce(function (acc, char, idx) { + acc[idx] = char; + return acc; + }, {}); + typeHint = 'object'; + } else { + return jsonStringify(value); + } + } + + for (var prop in value) { + if (Object.prototype.hasOwnProperty.call(value, prop)) { + return jsonStringify( + exports.canonicalize(value, null, typeHint), + 2 + ).replace(/,(\n|$)/g, '$1'); + } + } + + return emptyRepresentation(value, typeHint); + }; + + /** + * like JSON.stringify but more sense. + * + * @private + * @param {Object} object + * @param {number=} spaces + * @param {number=} depth + * @returns {*} + */ + function jsonStringify(object, spaces, depth) { + if (typeof spaces === 'undefined') { + // primitive types + return _stringify(object); + } + + depth = depth || 1; + var space = spaces * depth; + var str = Array.isArray(object) ? '[' : '{'; + var end = Array.isArray(object) ? ']' : '}'; + var length = + typeof object.length === 'number' + ? object.length + : Object.keys(object).length; + // `.repeat()` polyfill + function repeat(s, n) { + return new Array(n).join(s); + } + + function _stringify(val) { + switch (canonicalType(val)) { + case 'null': + case 'undefined': + val = '[' + val + ']'; + break; + case 'array': + case 'object': + val = jsonStringify(val, spaces, depth + 1); + break; + case 'boolean': + case 'regexp': + case 'symbol': + case 'number': + val = + val === 0 && 1 / val === -Infinity // `-0` + ? '-0' + : val.toString(); + break; + case 'bigint': + val = val.toString() + 'n'; + break; + case 'date': + var sDate = isNaN(val.getTime()) ? val.toString() : val.toISOString(); + val = '[Date: ' + sDate + ']'; + break; + case 'buffer': + var json = val.toJSON(); + // Based on the toJSON result + json = json.data && json.type ? json.data : json; + val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; + break; + default: + val = + val === '[Function]' || val === '[Circular]' + ? val + : JSON.stringify(val); // string + } + return val; + } + + for (var i in object) { + if (!Object.prototype.hasOwnProperty.call(object, i)) { + continue; // not my business + } + --length; + str += + '\n ' + + repeat(' ', space) + + (Array.isArray(object) ? '' : '"' + i + '": ') + // key + _stringify(object[i]) + // value + (length ? ',' : ''); // comma + } + + return ( + str + + // [], {} + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end) + ); + } + + /** + * Return a new Thing that has the keys in sorted order. Recursive. + * + * If the Thing... + * - has already been seen, return string `'[Circular]'` + * - is `undefined`, return string `'[undefined]'` + * - is `null`, return value `null` + * - is some other primitive, return the value + * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method + * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. + * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` + * + * @private + * @see {@link exports.stringify} + * @param {*} value Thing to inspect. May or may not have properties. + * @param {Array} [stack=[]] Stack of seen values + * @param {string} [typeHint] Type hint + * @return {(Object|Array|Function|string|undefined)} + */ + exports.canonicalize = function canonicalize(value, stack, typeHint) { + var canonicalizedObj; + /* eslint-disable no-unused-vars */ + var prop; + /* eslint-enable no-unused-vars */ + typeHint = typeHint || canonicalType(value); + function withStack(value, fn) { + stack.push(value); + fn(); + stack.pop(); + } + + stack = stack || []; + + if (stack.indexOf(value) !== -1) { + return '[Circular]'; + } + + switch (typeHint) { + case 'undefined': + case 'buffer': + case 'null': + canonicalizedObj = value; + break; + case 'array': + withStack(value, function () { + canonicalizedObj = value.map(function (item) { + return exports.canonicalize(item, stack); + }); + }); + break; + case 'function': + /* eslint-disable-next-line no-unused-vars, no-unreachable-loop */ + for (prop in value) { + canonicalizedObj = {}; + break; + } + /* eslint-enable guard-for-in */ + if (!canonicalizedObj) { + canonicalizedObj = emptyRepresentation(value, typeHint); + break; + } + /* falls through */ + case 'object': + canonicalizedObj = canonicalizedObj || {}; + withStack(value, function () { + Object.keys(value) + .sort() + .forEach(function (key) { + canonicalizedObj[key] = exports.canonicalize(value[key], stack); + }); + }); + break; + case 'date': + case 'number': + case 'regexp': + case 'boolean': + case 'symbol': + canonicalizedObj = value; + break; + default: + canonicalizedObj = value + ''; + } + + return canonicalizedObj; + }; + + /** + * @summary + * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) + * @description + * When invoking this function you get a filter function that get the Error.stack as an input, + * and return a prettify output. + * (i.e: strip Mocha and internal node functions from stack trace). + * @returns {Function} + */ + exports.stackTraceFilter = function () { + // TODO: Replace with `process.browser` + var is = typeof document === 'undefined' ? {node: true} : {browser: true}; + var slash = path.sep; + var cwd; + if (is.node) { + cwd = exports.cwd() + slash; + } else { + cwd = ( + typeof location === 'undefined' ? window.location : location + ).href.replace(/\/[^/]*$/, '/'); + slash = '/'; + } + + function isMochaInternal(line) { + return ( + ~line.indexOf('node_modules' + slash + 'mocha' + slash) || + ~line.indexOf(slash + 'mocha.js') || + ~line.indexOf(slash + 'mocha.min.js') + ); + } + + function isNodeInternal(line) { + return ( + ~line.indexOf('(timers.js:') || + ~line.indexOf('(events.js:') || + ~line.indexOf('(node.js:') || + ~line.indexOf('(module.js:') || + ~line.indexOf('GeneratorFunctionPrototype.next (native)') || + false + ); + } + + return function (stack) { + stack = stack.split('\n'); + + stack = stack.reduce(function (list, line) { + if (isMochaInternal(line)) { + return list; + } + + if (is.node && isNodeInternal(line)) { + return list; + } + + // Clean up cwd(absolute) + if (/:\d+:\d+\)?$/.test(line)) { + line = line.replace('(' + cwd, '('); + } + + list.push(line); + return list; + }, []); + + return stack.join('\n'); + }; + }; + + /** + * Crude, but effective. + * @public + * @param {*} value + * @returns {boolean} Whether or not `value` is a Promise + */ + exports.isPromise = function isPromise(value) { + return ( + typeof value === 'object' && + value !== null && + typeof value.then === 'function' + ); + }; + + /** + * Clamps a numeric value to an inclusive range. + * + * @param {number} value - Value to be clamped. + * @param {number[]} range - Two element array specifying [min, max] range. + * @returns {number} clamped value + */ + exports.clamp = function clamp(value, range) { + return Math.min(Math.max(value, range[0]), range[1]); + }; + + /** + * It's a noop. + * @public + */ + exports.noop = function () {}; + + /** + * Creates a map-like object. + * + * @description + * A "map" is an object with no prototype, for our purposes. In some cases + * this would be more appropriate than a `Map`, especially if your environment + * doesn't support it. Recommended for use in Mocha's public APIs. + * + * @public + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Custom_and_Null_objects|MDN:Map} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Custom_and_Null_objects|MDN:Object.create - Custom objects} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Custom_and_Null_objects|MDN:Object.assign} + * @param {...*} [obj] - Arguments to `Object.assign()`. + * @returns {Object} An object with no prototype, having `...obj` properties + */ + exports.createMap = function (obj) { + return Object.assign.apply( + null, + [Object.create(null)].concat(Array.prototype.slice.call(arguments)) + ); + }; + + /** + * Creates a read-only map-like object. + * + * @description + * This differs from {@link module:utils.createMap createMap} only in that + * the argument must be non-empty, because the result is frozen. + * + * @see {@link module:utils.createMap createMap} + * @param {...*} [obj] - Arguments to `Object.assign()`. + * @returns {Object} A frozen object with no prototype, having `...obj` properties + * @throws {TypeError} if argument is not a non-empty object. + */ + exports.defineConstants = function (obj) { + if (canonicalType(obj) !== 'object' || !Object.keys(obj).length) { + throw new TypeError('Invalid argument; expected a non-empty object'); + } + return Object.freeze(exports.createMap(obj)); + }; + + /** + * Returns current working directory + * + * Wrapper around `process.cwd()` for isolation + * @private + */ + exports.cwd = function cwd() { + return process.cwd(); + }; + + /** + * Returns `true` if Mocha is running in a browser. + * Checks for `process.browser`. + * @returns {boolean} + * @private + */ + exports.isBrowser = function isBrowser() { + return Boolean(browser$2); + }; + + /* + * Casts `value` to an array; useful for optionally accepting array parameters + * + * It follows these rules, depending on `value`. If `value` is... + * 1. `undefined`: return an empty Array + * 2. `null`: return an array with a single `null` element + * 3. Any other object: return the value of `Array.from()` _if_ the object is iterable + * 4. otherwise: return an array with a single element, `value` + * @param {*} value - Something to cast to an Array + * @returns {Array<*>} + */ + exports.castArray = function castArray(value) { + if (value === undefined) { + return []; + } + if (value === null) { + return [null]; + } + if ( + typeof value === 'object' && + (typeof value[Symbol.iterator] === 'function' || value.length !== undefined) + ) { + return Array.from(value); + } + return [value]; + }; + + exports.constants = exports.defineConstants({ + MOCHA_ID_PROP_NAME + }); + + /** + * Creates a new unique identifier + * @returns {string} Unique identifier + */ + exports.uniqueID = () => nanoid(); + + exports.assignNewMochaID = obj => { + const id = exports.uniqueID(); + Object.defineProperty(obj, MOCHA_ID_PROP_NAME, { + get() { + return id; + } + }); + return obj; + }; + + /** + * Retrieves a Mocha ID from an object, if present. + * @param {*} [obj] - Object + * @returns {string|void} + */ + exports.getMochaID = obj => + obj && typeof obj === 'object' ? obj[MOCHA_ID_PROP_NAME] : undefined; + }(utils$3)); + + var _nodeResolve_empty = {}; + + var _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': _nodeResolve_empty + }); + + var require$$18 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty$1); + + var browser$1 = { + info: 'ℹ️', + success: '✅', + warning: '⚠️', + error: '❌️' + }; + + var require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_events); + + /** + @module Pending + */ + + var pending = Pending$2; + + /** + * Initialize a new `Pending` error with the given message. + * + * @param {string} message + */ + function Pending$2(message) { + this.message = message; + } + + var browser = {exports: {}}; + + /** + * Helpers. + */ + + var s = 1000; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + + /** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + + var ms = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); + }; + + /** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + + function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } + } + + /** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; + } + + /** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; + } + + /** + * Pluralization helper. + */ + + function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); + } + + /** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = ms; + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + + return enabledCache; + }, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; + } + + var common$1 = setup; + + (function (module, exports) { + /** + * This is the web browser implementation of `debug()`. + */ + + exports.formatArgs = formatArgs; + exports.save = save; + exports.load = load; + exports.useColors = useColors; + exports.storage = localstorage(); + exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; + })(); + + /** + * Colors. + */ + + exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' + ]; + + /** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + + // eslint-disable-next-line complexity + function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); + } + + /** + * Colorize log arguments if enabled. + * + * @api public + */ + + function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); + } + + /** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ + exports.log = console.debug || console.log || (() => {}); + + /** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + /** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; + } + + /** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + + function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + module.exports = common$1(exports); + + const {formatters} = module.exports; + + /** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + + formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } + }; + }(browser, browser.exports)); + + const {format} = require$$0$1; + + /** + * Contains error codes, factory functions to create throwable error objects, + * and warning/deprecation functions. + * @module + */ + + /** + * process.emitWarning or a polyfill + * @see https://nodejs.org/api/process.html#process_process_emitwarning_warning_options + * @ignore + */ + const emitWarning = (msg, type) => { + if (process.emitWarning) { + process.emitWarning(msg, type); + } else { + /* istanbul ignore next */ + nextTick$1(function () { + console.warn(type + ': ' + msg); + }); + } + }; + + /** + * Show a deprecation warning. Each distinct message is only displayed once. + * Ignores empty messages. + * + * @param {string} [msg] - Warning to print + * @private + */ + const deprecate = msg => { + msg = String(msg); + if (msg && !deprecate.cache[msg]) { + deprecate.cache[msg] = true; + emitWarning(msg, 'DeprecationWarning'); + } + }; + deprecate.cache = {}; + + /** + * Show a generic warning. + * Ignores empty messages. + * + * @param {string} [msg] - Warning to print + * @private + */ + const warn = msg => { + if (msg) { + emitWarning(msg); + } + }; + + /** + * When Mocha throws exceptions (or rejects `Promise`s), it attempts to assign a `code` property to the `Error` object, for easier handling. These are the potential values of `code`. + * @public + * @namespace + * @memberof module:lib/errors + */ + var constants$4 = { + /** + * An unrecoverable error. + * @constant + * @default + */ + FATAL: 'ERR_MOCHA_FATAL', + + /** + * The type of an argument to a function call is invalid + * @constant + * @default + */ + INVALID_ARG_TYPE: 'ERR_MOCHA_INVALID_ARG_TYPE', + + /** + * The value of an argument to a function call is invalid + * @constant + * @default + */ + INVALID_ARG_VALUE: 'ERR_MOCHA_INVALID_ARG_VALUE', + + /** + * Something was thrown, but it wasn't an `Error` + * @constant + * @default + */ + INVALID_EXCEPTION: 'ERR_MOCHA_INVALID_EXCEPTION', + + /** + * An interface (e.g., `Mocha.interfaces`) is unknown or invalid + * @constant + * @default + */ + INVALID_INTERFACE: 'ERR_MOCHA_INVALID_INTERFACE', + + /** + * A reporter (.e.g, `Mocha.reporters`) is unknown or invalid + * @constant + * @default + */ + INVALID_REPORTER: 'ERR_MOCHA_INVALID_REPORTER', + + /** + * `done()` was called twice in a `Test` or `Hook` callback + * @constant + * @default + */ + MULTIPLE_DONE: 'ERR_MOCHA_MULTIPLE_DONE', + + /** + * No files matched the pattern provided by the user + * @constant + * @default + */ + NO_FILES_MATCH_PATTERN: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN', + + /** + * Known, but unsupported behavior of some kind + * @constant + * @default + */ + UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED', + + /** + * Invalid state transition occurring in `Mocha` instance + * @constant + * @default + */ + INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', + + /** + * Invalid state transition occurring in `Mocha` instance + * @constant + * @default + */ + INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + + /** + * Use of `only()` w/ `--forbid-only` results in this error. + * @constant + * @default + */ + FORBIDDEN_EXCLUSIVITY: 'ERR_MOCHA_FORBIDDEN_EXCLUSIVITY', + + /** + * To be thrown when a user-defined plugin implementation (e.g., `mochaHooks`) is invalid + * @constant + * @default + */ + INVALID_PLUGIN_IMPLEMENTATION: 'ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION', + + /** + * To be thrown when a builtin or third-party plugin definition (the _definition_ of `mochaHooks`) is invalid + * @constant + * @default + */ + INVALID_PLUGIN_DEFINITION: 'ERR_MOCHA_INVALID_PLUGIN_DEFINITION', + + /** + * When a runnable exceeds its allowed run time. + * @constant + * @default + */ + TIMEOUT: 'ERR_MOCHA_TIMEOUT', + + /** + * Input file is not able to be parsed + * @constant + * @default + */ + UNPARSABLE_FILE: 'ERR_MOCHA_UNPARSABLE_FILE' + }; + + /** + * A set containing all string values of all Mocha error constants, for use by {@link isMochaError}. + * @private + */ + const MOCHA_ERRORS = new Set(Object.values(constants$4)); + + /** + * Creates an error object to be thrown when no files to be tested could be found using specified pattern. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} pattern - User-specified argument value. + * @returns {Error} instance detailing the error condition + */ + function createNoFilesMatchPatternError(message, pattern) { + var err = new Error(message); + err.code = constants$4.NO_FILES_MATCH_PATTERN; + err.pattern = pattern; + return err; + } + + /** + * Creates an error object to be thrown when the reporter specified in the options was not found. + * + * @public + * @param {string} message - Error message to be displayed. + * @param {string} reporter - User-specified reporter value. + * @returns {Error} instance detailing the error condition + */ + function createInvalidReporterError(message, reporter) { + var err = new TypeError(message); + err.code = constants$4.INVALID_REPORTER; + err.reporter = reporter; + return err; + } + + /** + * Creates an error object to be thrown when the interface specified in the options was not found. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} ui - User-specified interface value. + * @returns {Error} instance detailing the error condition + */ + function createInvalidInterfaceError(message, ui) { + var err = new Error(message); + err.code = constants$4.INVALID_INTERFACE; + err.interface = ui; + return err; + } + + /** + * Creates an error object to be thrown when a behavior, option, or parameter is unsupported. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ + function createUnsupportedError$2(message) { + var err = new Error(message); + err.code = constants$4.UNSUPPORTED; + return err; + } + + /** + * Creates an error object to be thrown when an argument is missing. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} argument - Argument name. + * @param {string} expected - Expected argument datatype. + * @returns {Error} instance detailing the error condition + */ + function createMissingArgumentError$1(message, argument, expected) { + return createInvalidArgumentTypeError$1(message, argument, expected); + } + + /** + * Creates an error object to be thrown when an argument did not use the supported type + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} argument - Argument name. + * @param {string} expected - Expected argument datatype. + * @returns {Error} instance detailing the error condition + */ + function createInvalidArgumentTypeError$1(message, argument, expected) { + var err = new TypeError(message); + err.code = constants$4.INVALID_ARG_TYPE; + err.argument = argument; + err.expected = expected; + err.actual = typeof argument; + return err; + } + + /** + * Creates an error object to be thrown when an argument did not use the supported value + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} argument - Argument name. + * @param {string} value - Argument value. + * @param {string} [reason] - Why value is invalid. + * @returns {Error} instance detailing the error condition + */ + function createInvalidArgumentValueError(message, argument, value, reason) { + var err = new TypeError(message); + err.code = constants$4.INVALID_ARG_VALUE; + err.argument = argument; + err.value = value; + err.reason = typeof reason !== 'undefined' ? reason : 'is invalid'; + return err; + } + + /** + * Creates an error object to be thrown when an exception was caught, but the `Error` is falsy or undefined. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ + function createInvalidExceptionError$2(message, value) { + var err = new Error(message); + err.code = constants$4.INVALID_EXCEPTION; + err.valueType = typeof value; + err.value = value; + return err; + } + + /** + * Creates an error object to be thrown when an unrecoverable error occurs. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ + function createFatalError$1(message, value) { + var err = new Error(message); + err.code = constants$4.FATAL; + err.valueType = typeof value; + err.value = value; + return err; + } + + /** + * Dynamically creates a plugin-type-specific error based on plugin type + * @param {string} message - Error message + * @param {"reporter"|"ui"} pluginType - Plugin type. Future: expand as needed + * @param {string} [pluginId] - Name/path of plugin, if any + * @throws When `pluginType` is not known + * @public + * @static + * @returns {Error} + */ + function createInvalidLegacyPluginError(message, pluginType, pluginId) { + switch (pluginType) { + case 'reporter': + return createInvalidReporterError(message, pluginId); + case 'ui': + return createInvalidInterfaceError(message, pluginId); + default: + throw new Error('unknown pluginType "' + pluginType + '"'); + } + } + + /** + * **DEPRECATED**. Use {@link createInvalidLegacyPluginError} instead Dynamically creates a plugin-type-specific error based on plugin type + * @deprecated + * @param {string} message - Error message + * @param {"reporter"|"interface"} pluginType - Plugin type. Future: expand as needed + * @param {string} [pluginId] - Name/path of plugin, if any + * @throws When `pluginType` is not known + * @public + * @static + * @returns {Error} + */ + function createInvalidPluginError(...args) { + deprecate('Use createInvalidLegacyPluginError() instead'); + return createInvalidLegacyPluginError(...args); + } + + /** + * Creates an error object to be thrown when a mocha object's `run` method is executed while it is already disposed. + * @param {string} message The error message to be displayed. + * @param {boolean} cleanReferencesAfterRun the value of `cleanReferencesAfterRun` + * @param {Mocha} instance the mocha instance that throw this error + * @static + */ + function createMochaInstanceAlreadyDisposedError( + message, + cleanReferencesAfterRun, + instance + ) { + var err = new Error(message); + err.code = constants$4.INSTANCE_ALREADY_DISPOSED; + err.cleanReferencesAfterRun = cleanReferencesAfterRun; + err.instance = instance; + return err; + } + + /** + * Creates an error object to be thrown when a mocha object's `run` method is called while a test run is in progress. + * @param {string} message The error message to be displayed. + * @static + * @public + */ + function createMochaInstanceAlreadyRunningError(message, instance) { + var err = new Error(message); + err.code = constants$4.INSTANCE_ALREADY_RUNNING; + err.instance = instance; + return err; + } + + /** + * Creates an error object to be thrown when done() is called multiple times in a test + * + * @public + * @param {Runnable} runnable - Original runnable + * @param {Error} [originalErr] - Original error, if any + * @returns {Error} instance detailing the error condition + * @static + */ + function createMultipleDoneError$1(runnable, originalErr) { + var title; + try { + title = format('<%s>', runnable.fullTitle()); + if (runnable.parent.root) { + title += ' (of root suite)'; + } + } catch (ignored) { + title = format('<%s> (of unknown suite)', runnable.title); + } + var message = format( + 'done() called multiple times in %s %s', + runnable.type ? runnable.type : 'unknown runnable', + title + ); + if (runnable.file) { + message += format(' of file %s', runnable.file); + } + if (originalErr) { + message += format('; in addition, done() received error: %s', originalErr); + } + + var err = new Error(message); + err.code = constants$4.MULTIPLE_DONE; + err.valueType = typeof originalErr; + err.value = originalErr; + return err; + } + + /** + * Creates an error object to be thrown when `.only()` is used with + * `--forbid-only`. + * @static + * @public + * @param {Mocha} mocha - Mocha instance + * @returns {Error} Error with code {@link constants.FORBIDDEN_EXCLUSIVITY} + */ + function createForbiddenExclusivityError$1(mocha) { + var err = new Error( + mocha.isWorker + ? '`.only` is not supported in parallel mode' + : '`.only` forbidden by --forbid-only' + ); + err.code = constants$4.FORBIDDEN_EXCLUSIVITY; + return err; + } + + /** + * Creates an error object to be thrown when a plugin definition is invalid + * @static + * @param {string} msg - Error message + * @param {PluginDefinition} [pluginDef] - Problematic plugin definition + * @public + * @returns {Error} Error with code {@link constants.INVALID_PLUGIN_DEFINITION} + */ + function createInvalidPluginDefinitionError(msg, pluginDef) { + const err = new Error(msg); + err.code = constants$4.INVALID_PLUGIN_DEFINITION; + err.pluginDef = pluginDef; + return err; + } + + /** + * Creates an error object to be thrown when a plugin implementation (user code) is invalid + * @static + * @param {string} msg - Error message + * @param {Object} [opts] - Plugin definition and user-supplied implementation + * @param {PluginDefinition} [opts.pluginDef] - Plugin Definition + * @param {*} [opts.pluginImpl] - Plugin Implementation (user-supplied) + * @public + * @returns {Error} Error with code {@link constants.INVALID_PLUGIN_DEFINITION} + */ + function createInvalidPluginImplementationError( + msg, + {pluginDef, pluginImpl} = {} + ) { + const err = new Error(msg); + err.code = constants$4.INVALID_PLUGIN_IMPLEMENTATION; + err.pluginDef = pluginDef; + err.pluginImpl = pluginImpl; + return err; + } + + /** + * Creates an error object to be thrown when a runnable exceeds its allowed run time. + * @static + * @param {string} msg - Error message + * @param {number} [timeout] - Timeout in ms + * @param {string} [file] - File, if given + * @returns {MochaTimeoutError} + */ + function createTimeoutError$1(msg, timeout, file) { + const err = new Error(msg); + err.code = constants$4.TIMEOUT; + err.timeout = timeout; + err.file = file; + return err; + } + + /** + * Creates an error object to be thrown when file is unparsable + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} filename - File name + * @returns {Error} Error with code {@link constants.UNPARSABLE_FILE} + */ + function createUnparsableFileError(message, filename) { + var err = new Error(message); + err.code = constants$4.UNPARSABLE_FILE; + return err; + } + + /** + * Returns `true` if an error came out of Mocha. + * _Can suffer from false negatives, but not false positives._ + * @static + * @public + * @param {*} err - Error, or anything + * @returns {boolean} + */ + const isMochaError$1 = err => + Boolean(err && typeof err === 'object' && MOCHA_ERRORS.has(err.code)); + + var errors$2 = { + constants: constants$4, + createFatalError: createFatalError$1, + createForbiddenExclusivityError: createForbiddenExclusivityError$1, + createInvalidArgumentTypeError: createInvalidArgumentTypeError$1, + createInvalidArgumentValueError, + createInvalidExceptionError: createInvalidExceptionError$2, + createInvalidInterfaceError, + createInvalidLegacyPluginError, + createInvalidPluginDefinitionError, + createInvalidPluginError, + createInvalidPluginImplementationError, + createInvalidReporterError, + createMissingArgumentError: createMissingArgumentError$1, + createMochaInstanceAlreadyDisposedError, + createMochaInstanceAlreadyRunningError, + createMultipleDoneError: createMultipleDoneError$1, + createNoFilesMatchPatternError, + createTimeoutError: createTimeoutError$1, + createUnparsableFileError, + createUnsupportedError: createUnsupportedError$2, + deprecate, + isMochaError: isMochaError$1, + warn + }; + + var EventEmitter$1 = require$$0.EventEmitter; + var Pending$1 = pending; + var debug$1 = browser.exports('mocha:runnable'); + var milliseconds = ms$1; + var utils$2 = utils$3; + const { + createInvalidExceptionError: createInvalidExceptionError$1, + createMultipleDoneError, + createTimeoutError + } = errors$2; + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + * @private + */ + var Date$3 = commonjsGlobal.Date; + var setTimeout$2 = commonjsGlobal.setTimeout; + var clearTimeout$1 = commonjsGlobal.clearTimeout; + var toString = Object.prototype.toString; + + var runnable = Runnable$3; + + /** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @class + * @extends external:EventEmitter + * @public + * @param {String} title + * @param {Function} fn + */ + function Runnable$3(title, fn) { + this.title = title; + this.fn = fn; + this.body = (fn || '').toString(); + this.async = fn && fn.length; + this.sync = !this.async; + this._timeout = 2000; + this._slow = 75; + this._retries = -1; + utils$2.assignNewMochaID(this); + Object.defineProperty(this, 'id', { + get() { + return utils$2.getMochaID(this); + } + }); + this.reset(); + } + + /** + * Inherit from `EventEmitter.prototype`. + */ + utils$2.inherits(Runnable$3, EventEmitter$1); + + /** + * Resets the state initially or for a next run. + */ + Runnable$3.prototype.reset = function () { + this.timedOut = false; + this._currentRetry = 0; + this.pending = false; + delete this.state; + delete this.err; + }; + + /** + * Get current timeout value in msecs. + * + * @private + * @returns {number} current timeout threshold value + */ + /** + * @summary + * Set timeout threshold value (msecs). + * + * @description + * A string argument can use shorthand (e.g., "2s") and will be converted. + * The value will be clamped to range [<code>0</code>, <code>2^<sup>31</sup>-1</code>]. + * If clamped value matches either range endpoint, timeouts will be disabled. + * + * @private + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value} + * @param {number|string} ms - Timeout threshold value. + * @returns {Runnable} this + * @chainable + */ + Runnable$3.prototype.timeout = function (ms) { + if (!arguments.length) { + return this._timeout; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + + // Clamp to range + var INT_MAX = Math.pow(2, 31) - 1; + var range = [0, INT_MAX]; + ms = utils$2.clamp(ms, range); + + // see #1652 for reasoning + if (ms === range[0] || ms === range[1]) { + this._timeout = 0; + } else { + this._timeout = ms; + } + debug$1('timeout %d', this._timeout); + + if (this.timer) { + this.resetTimeout(); + } + return this; + }; + + /** + * Set or get slow `ms`. + * + * @private + * @param {number|string} ms + * @return {Runnable|number} ms or Runnable instance. + */ + Runnable$3.prototype.slow = function (ms) { + if (!arguments.length || typeof ms === 'undefined') { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug$1('slow %d', ms); + this._slow = ms; + return this; + }; + + /** + * Halt and mark as pending. + * + * @memberof Mocha.Runnable + * @public + */ + Runnable$3.prototype.skip = function () { + this.pending = true; + throw new Pending$1('sync skip; aborting execution'); + }; + + /** + * Check if this runnable or its parent suite is marked as pending. + * + * @private + */ + Runnable$3.prototype.isPending = function () { + return this.pending || (this.parent && this.parent.isPending()); + }; + + /** + * Return `true` if this Runnable has failed. + * @return {boolean} + * @private + */ + Runnable$3.prototype.isFailed = function () { + return !this.isPending() && this.state === constants$3.STATE_FAILED; + }; + + /** + * Return `true` if this Runnable has passed. + * @return {boolean} + * @private + */ + Runnable$3.prototype.isPassed = function () { + return !this.isPending() && this.state === constants$3.STATE_PASSED; + }; + + /** + * Set or get number of retries. + * + * @private + */ + Runnable$3.prototype.retries = function (n) { + if (!arguments.length) { + return this._retries; + } + this._retries = n; + }; + + /** + * Set or get current retry + * + * @private + */ + Runnable$3.prototype.currentRetry = function (n) { + if (!arguments.length) { + return this._currentRetry; + } + this._currentRetry = n; + }; + + /** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @memberof Mocha.Runnable + * @public + * @return {string} + */ + Runnable$3.prototype.fullTitle = function () { + return this.titlePath().join(' '); + }; + + /** + * Return the title path generated by concatenating the parent's title path with the title. + * + * @memberof Mocha.Runnable + * @public + * @return {string} + */ + Runnable$3.prototype.titlePath = function () { + return this.parent.titlePath().concat([this.title]); + }; + + /** + * Clear the timeout. + * + * @private + */ + Runnable$3.prototype.clearTimeout = function () { + clearTimeout$1(this.timer); + }; + + /** + * Reset the timeout. + * + * @private + */ + Runnable$3.prototype.resetTimeout = function () { + var self = this; + var ms = this.timeout(); + + if (ms === 0) { + return; + } + this.clearTimeout(); + this.timer = setTimeout$2(function () { + if (self.timeout() === 0) { + return; + } + self.callback(self._timeoutError(ms)); + self.timedOut = true; + }, ms); + }; + + /** + * Set or get a list of whitelisted globals for this test run. + * + * @private + * @param {string[]} globals + */ + Runnable$3.prototype.globals = function (globals) { + if (!arguments.length) { + return this._allowedGlobals; + } + this._allowedGlobals = globals; + }; + + /** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @private + */ + Runnable$3.prototype.run = function (fn) { + var self = this; + var start = new Date$3(); + var ctx = this.ctx; + var finished; + var errorWasHandled = false; + + if (this.isPending()) return fn(); + + // Sometimes the ctx exists, but it is not runnable + if (ctx && ctx.runnable) { + ctx.runnable(this); + } + + // called multiple times + function multiple(err) { + if (errorWasHandled) { + return; + } + errorWasHandled = true; + self.emit('error', createMultipleDoneError(self, err)); + } + + // finished + function done(err) { + var ms = self.timeout(); + if (self.timedOut) { + return; + } + + if (finished) { + return multiple(err); + } + + self.clearTimeout(); + self.duration = new Date$3() - start; + finished = true; + if (!err && self.duration > ms && ms > 0) { + err = self._timeoutError(ms); + } + fn(err); + } + + // for .resetTimeout() and Runner#uncaught() + this.callback = done; + + if (this.fn && typeof this.fn.call !== 'function') { + done( + new TypeError( + 'A runnable must be passed a function as its second argument.' + ) + ); + return; + } + + // explicit async with `done` argument + if (this.async) { + this.resetTimeout(); + + // allows skip() to be used in an explicit async context + this.skip = function asyncSkip() { + this.pending = true; + done(); + // halt execution, the uncaught handler will ignore the failure. + throw new Pending$1('async skip; aborting execution'); + }; + + try { + callFnAsync(this.fn); + } catch (err) { + // handles async runnables which actually run synchronously + errorWasHandled = true; + if (err instanceof Pending$1) { + return; // done() is already called in this.skip() + } else if (this.allowUncaught) { + throw err; + } + done(Runnable$3.toValueOrError(err)); + } + return; + } + + // sync or promise-returning + try { + callFn(this.fn); + } catch (err) { + errorWasHandled = true; + if (err instanceof Pending$1) { + return done(); + } else if (this.allowUncaught) { + throw err; + } + done(Runnable$3.toValueOrError(err)); + } + + function callFn(fn) { + var result = fn.call(ctx); + if (result && typeof result.then === 'function') { + self.resetTimeout(); + result.then( + function () { + done(); + // Return null so libraries like bluebird do not warn about + // subsequently constructed Promises. + return null; + }, + function (reason) { + done(reason || new Error('Promise rejected with no or falsy reason')); + } + ); + } else { + if (self.asyncOnly) { + return done( + new Error( + '--async-only option in use without declaring `done()` or returning a promise' + ) + ); + } + + done(); + } + } + + function callFnAsync(fn) { + var result = fn.call(ctx, function (err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err) { + if (Object.prototype.toString.call(err) === '[object Object]') { + return done( + new Error('done() invoked with non-Error: ' + JSON.stringify(err)) + ); + } + return done(new Error('done() invoked with non-Error: ' + err)); + } + if (result && utils$2.isPromise(result)) { + return done( + new Error( + 'Resolution method is overspecified. Specify a callback *or* return a Promise; not both.' + ) + ); + } + + done(); + }); + } + }; + + /** + * Instantiates a "timeout" error + * + * @param {number} ms - Timeout (in milliseconds) + * @returns {Error} a "timeout" error + * @private + */ + Runnable$3.prototype._timeoutError = function (ms) { + let msg = `Timeout of ${ms}ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.`; + if (this.file) { + msg += ' (' + this.file + ')'; + } + return createTimeoutError(msg, ms, this.file); + }; + + var constants$3 = utils$2.defineConstants( + /** + * {@link Runnable}-related constants. + * @public + * @memberof Runnable + * @readonly + * @static + * @alias constants + * @enum {string} + */ + { + /** + * Value of `state` prop when a `Runnable` has failed + */ + STATE_FAILED: 'failed', + /** + * Value of `state` prop when a `Runnable` has passed + */ + STATE_PASSED: 'passed', + /** + * Value of `state` prop when a `Runnable` has been skipped by user + */ + STATE_PENDING: 'pending' + } + ); + + /** + * Given `value`, return identity if truthy, otherwise create an "invalid exception" error and return that. + * @param {*} [value] - Value to return, if present + * @returns {*|Error} `value`, otherwise an `Error` + * @private + */ + Runnable$3.toValueOrError = function (value) { + return ( + value || + createInvalidExceptionError$1( + 'Runnable failed with falsy or undefined exception. Please throw an Error instead.', + value + ) + ); + }; + + Runnable$3.constants = constants$3; + + var suite = {exports: {}}; + + var Runnable$2 = runnable; + const {inherits, constants: constants$2} = utils$3; + const {MOCHA_ID_PROP_NAME: MOCHA_ID_PROP_NAME$1} = constants$2; + + /** + * Expose `Hook`. + */ + + var hook = Hook; + + /** + * Initialize a new `Hook` with the given `title` and callback `fn` + * + * @class + * @extends Runnable + * @param {String} title + * @param {Function} fn + */ + function Hook(title, fn) { + Runnable$2.call(this, title, fn); + this.type = 'hook'; + } + + /** + * Inherit from `Runnable.prototype`. + */ + inherits(Hook, Runnable$2); + + /** + * Resets the state for a next run. + */ + Hook.prototype.reset = function () { + Runnable$2.prototype.reset.call(this); + delete this._error; + }; + + /** + * Get or set the test `err`. + * + * @memberof Hook + * @public + * @param {Error} err + * @return {Error} + */ + Hook.prototype.error = function (err) { + if (!arguments.length) { + err = this._error; + this._error = null; + return err; + } + + this._error = err; + }; + + /** + * Returns an object suitable for IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ + Hook.prototype.serialize = function serialize() { + return { + $$currentRetry: this.currentRetry(), + $$fullTitle: this.fullTitle(), + $$isPending: Boolean(this.isPending()), + $$titlePath: this.titlePath(), + ctx: + this.ctx && this.ctx.currentTest + ? { + currentTest: { + title: this.ctx.currentTest.title, + [MOCHA_ID_PROP_NAME$1]: this.ctx.currentTest.id + } + } + : {}, + duration: this.duration, + file: this.file, + parent: { + $$fullTitle: this.parent.fullTitle(), + [MOCHA_ID_PROP_NAME$1]: this.parent.id + }, + state: this.state, + title: this.title, + type: this.type, + [MOCHA_ID_PROP_NAME$1]: this.id + }; + }; + + (function (module, exports) { + + /** + * Module dependencies. + * @private + */ + const {EventEmitter} = require$$0; + const Hook = hook; + var { + assignNewMochaID, + clamp, + constants: utilsConstants, + defineConstants, + getMochaID, + inherits, + isString + } = utils$3; + const debug = browser.exports('mocha:suite'); + const milliseconds = ms$1; + const errors = errors$2; + + const {MOCHA_ID_PROP_NAME} = utilsConstants; + + /** + * Expose `Suite`. + */ + + module.exports = Suite; + + /** + * Create a new `Suite` with the given `title` and parent `Suite`. + * + * @public + * @param {Suite} parent - Parent suite (required!) + * @param {string} title - Title + * @return {Suite} + */ + Suite.create = function (parent, title) { + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; + }; + + /** + * Constructs a new `Suite` instance with the given `title`, `ctx`, and `isRoot`. + * + * @public + * @class + * @extends EventEmitter + * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter|EventEmitter} + * @param {string} title - Suite title. + * @param {Context} parentContext - Parent context instance. + * @param {boolean} [isRoot=false] - Whether this is the root suite. + */ + function Suite(title, parentContext, isRoot) { + if (!isString(title)) { + throw errors.createInvalidArgumentTypeError( + 'Suite argument "title" must be a string. Received type "' + + typeof title + + '"', + 'title', + 'string' + ); + } + this.title = title; + function Context() {} + Context.prototype = parentContext; + this.ctx = new Context(); + this.suites = []; + this.tests = []; + this.root = isRoot === true; + this.pending = false; + this._retries = -1; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this._timeout = 2000; + this._slow = 75; + this._bail = false; + this._onlyTests = []; + this._onlySuites = []; + assignNewMochaID(this); + + Object.defineProperty(this, 'id', { + get() { + return getMochaID(this); + } + }); + + this.reset(); + } + + /** + * Inherit from `EventEmitter.prototype`. + */ + inherits(Suite, EventEmitter); + + /** + * Resets the state initially or for a next run. + */ + Suite.prototype.reset = function () { + this.delayed = false; + function doReset(thingToReset) { + thingToReset.reset(); + } + this.suites.forEach(doReset); + this.tests.forEach(doReset); + this._beforeEach.forEach(doReset); + this._afterEach.forEach(doReset); + this._beforeAll.forEach(doReset); + this._afterAll.forEach(doReset); + }; + + /** + * Return a clone of this `Suite`. + * + * @private + * @return {Suite} + */ + Suite.prototype.clone = function () { + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.root = this.root; + suite.timeout(this.timeout()); + suite.retries(this.retries()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; + }; + + /** + * Set or get timeout `ms` or short-hand such as "2s". + * + * @private + * @todo Do not attempt to set value if `ms` is undefined + * @param {number|string} ms + * @return {Suite|number} for chaining + */ + Suite.prototype.timeout = function (ms) { + if (!arguments.length) { + return this._timeout; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + + // Clamp to range + var INT_MAX = Math.pow(2, 31) - 1; + var range = [0, INT_MAX]; + ms = clamp(ms, range); + + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; + }; + + /** + * Set or get number of times to retry a failed test. + * + * @private + * @param {number|string} n + * @return {Suite|number} for chaining + */ + Suite.prototype.retries = function (n) { + if (!arguments.length) { + return this._retries; + } + debug('retries %d', n); + this._retries = parseInt(n, 10) || 0; + return this; + }; + + /** + * Set or get slow `ms` or short-hand such as "2s". + * + * @private + * @param {number|string} ms + * @return {Suite|number} for chaining + */ + Suite.prototype.slow = function (ms) { + if (!arguments.length) { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug('slow %d', ms); + this._slow = ms; + return this; + }; + + /** + * Set or get whether to bail after first error. + * + * @private + * @param {boolean} bail + * @return {Suite|number} for chaining + */ + Suite.prototype.bail = function (bail) { + if (!arguments.length) { + return this._bail; + } + debug('bail %s', bail); + this._bail = bail; + return this; + }; + + /** + * Check if this suite or its parent suite is marked as pending. + * + * @private + */ + Suite.prototype.isPending = function () { + return this.pending || (this.parent && this.parent.isPending()); + }; + + /** + * Generic hook-creator. + * @private + * @param {string} title - Title of hook + * @param {Function} fn - Hook callback + * @returns {Hook} A new hook + */ + Suite.prototype._createHook = function (title, fn) { + var hook = new Hook(title, fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.retries(this.retries()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + hook.file = this.file; + return hook; + }; + + /** + * Run `fn(test[, done])` before running tests. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.beforeAll = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"before all" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._beforeAll.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_ALL, hook); + return this; + }; + + /** + * Run `fn(test[, done])` after running tests. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.afterAll = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"after all" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._afterAll.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_ALL, hook); + return this; + }; + + /** + * Run `fn(test[, done])` before each test case. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.beforeEach = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"before each" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._beforeEach.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_EACH, hook); + return this; + }; + + /** + * Run `fn(test[, done])` after each test case. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.afterEach = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"after each" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._afterEach.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_EACH, hook); + return this; + }; + + /** + * Add a test `suite`. + * + * @private + * @param {Suite} suite + * @return {Suite} for chaining + */ + Suite.prototype.addSuite = function (suite) { + suite.parent = this; + suite.root = false; + suite.timeout(this.timeout()); + suite.retries(this.retries()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit(constants.EVENT_SUITE_ADD_SUITE, suite); + return this; + }; + + /** + * Add a `test` to this suite. + * + * @private + * @param {Test} test + * @return {Suite} for chaining + */ + Suite.prototype.addTest = function (test) { + test.parent = this; + test.timeout(this.timeout()); + test.retries(this.retries()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit(constants.EVENT_SUITE_ADD_TEST, test); + return this; + }; + + /** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @memberof Suite + * @public + * @return {string} + */ + Suite.prototype.fullTitle = function () { + return this.titlePath().join(' '); + }; + + /** + * Return the title path generated by recursively concatenating the parent's + * title path. + * + * @memberof Suite + * @public + * @return {string} + */ + Suite.prototype.titlePath = function () { + var result = []; + if (this.parent) { + result = result.concat(this.parent.titlePath()); + } + if (!this.root) { + result.push(this.title); + } + return result; + }; + + /** + * Return the total number of tests. + * + * @memberof Suite + * @public + * @return {number} + */ + Suite.prototype.total = function () { + return ( + this.suites.reduce(function (sum, suite) { + return sum + suite.total(); + }, 0) + this.tests.length + ); + }; + + /** + * Iterates through each suite recursively to find all tests. Applies a + * function in the format `fn(test)`. + * + * @private + * @param {Function} fn + * @return {Suite} + */ + Suite.prototype.eachTest = function (fn) { + this.tests.forEach(fn); + this.suites.forEach(function (suite) { + suite.eachTest(fn); + }); + return this; + }; + + /** + * This will run the root suite if we happen to be running in delayed mode. + * @private + */ + Suite.prototype.run = function run() { + if (this.root) { + this.emit(constants.EVENT_ROOT_SUITE_RUN); + } + }; + + /** + * Determines whether a suite has an `only` test or suite as a descendant. + * + * @private + * @returns {Boolean} + */ + Suite.prototype.hasOnly = function hasOnly() { + return ( + this._onlyTests.length > 0 || + this._onlySuites.length > 0 || + this.suites.some(function (suite) { + return suite.hasOnly(); + }) + ); + }; + + /** + * Filter suites based on `isOnly` logic. + * + * @private + * @returns {Boolean} + */ + Suite.prototype.filterOnly = function filterOnly() { + if (this._onlyTests.length) { + // If the suite contains `only` tests, run those and ignore any nested suites. + this.tests = this._onlyTests; + this.suites = []; + } else { + // Otherwise, do not run any of the tests in this suite. + this.tests = []; + this._onlySuites.forEach(function (onlySuite) { + // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. + // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. + if (onlySuite.hasOnly()) { + onlySuite.filterOnly(); + } + }); + // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. + var onlySuites = this._onlySuites; + this.suites = this.suites.filter(function (childSuite) { + return onlySuites.indexOf(childSuite) !== -1 || childSuite.filterOnly(); + }); + } + // Keep the suite only if there is something to run + return this.tests.length > 0 || this.suites.length > 0; + }; + + /** + * Adds a suite to the list of subsuites marked `only`. + * + * @private + * @param {Suite} suite + */ + Suite.prototype.appendOnlySuite = function (suite) { + this._onlySuites.push(suite); + }; + + /** + * Marks a suite to be `only`. + * + * @private + */ + Suite.prototype.markOnly = function () { + this.parent && this.parent.appendOnlySuite(this); + }; + + /** + * Adds a test to the list of tests marked `only`. + * + * @private + * @param {Test} test + */ + Suite.prototype.appendOnlyTest = function (test) { + this._onlyTests.push(test); + }; + + /** + * Returns the array of hooks by hook name; see `HOOK_TYPE_*` constants. + * @private + */ + Suite.prototype.getHooks = function getHooks(name) { + return this['_' + name]; + }; + + /** + * cleans all references from this suite and all child suites. + */ + Suite.prototype.dispose = function () { + this.suites.forEach(function (suite) { + suite.dispose(); + }); + this.cleanReferences(); + }; + + /** + * Cleans up the references to all the deferred functions + * (before/after/beforeEach/afterEach) and tests of a Suite. + * These must be deleted otherwise a memory leak can happen, + * as those functions may reference variables from closures, + * thus those variables can never be garbage collected as long + * as the deferred functions exist. + * + * @private + */ + Suite.prototype.cleanReferences = function cleanReferences() { + function cleanArrReferences(arr) { + for (var i = 0; i < arr.length; i++) { + delete arr[i].fn; + } + } + + if (Array.isArray(this._beforeAll)) { + cleanArrReferences(this._beforeAll); + } + + if (Array.isArray(this._beforeEach)) { + cleanArrReferences(this._beforeEach); + } + + if (Array.isArray(this._afterAll)) { + cleanArrReferences(this._afterAll); + } + + if (Array.isArray(this._afterEach)) { + cleanArrReferences(this._afterEach); + } + + for (var i = 0; i < this.tests.length; i++) { + delete this.tests[i].fn; + } + }; + + /** + * Returns an object suitable for IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ + Suite.prototype.serialize = function serialize() { + return { + _bail: this._bail, + $$fullTitle: this.fullTitle(), + $$isPending: Boolean(this.isPending()), + root: this.root, + title: this.title, + [MOCHA_ID_PROP_NAME]: this.id, + parent: this.parent ? {[MOCHA_ID_PROP_NAME]: this.parent.id} : null + }; + }; + + var constants = defineConstants( + /** + * {@link Suite}-related constants. + * @public + * @memberof Suite + * @alias constants + * @readonly + * @static + * @enum {string} + */ + { + /** + * Event emitted after a test file has been loaded. Not emitted in browser. + */ + EVENT_FILE_POST_REQUIRE: 'post-require', + /** + * Event emitted before a test file has been loaded. In browser, this is emitted once an interface has been selected. + */ + EVENT_FILE_PRE_REQUIRE: 'pre-require', + /** + * Event emitted immediately after a test file has been loaded. Not emitted in browser. + */ + EVENT_FILE_REQUIRE: 'require', + /** + * Event emitted when `global.run()` is called (use with `delay` option). + */ + EVENT_ROOT_SUITE_RUN: 'run', + + /** + * Namespace for collection of a `Suite`'s "after all" hooks. + */ + HOOK_TYPE_AFTER_ALL: 'afterAll', + /** + * Namespace for collection of a `Suite`'s "after each" hooks. + */ + HOOK_TYPE_AFTER_EACH: 'afterEach', + /** + * Namespace for collection of a `Suite`'s "before all" hooks. + */ + HOOK_TYPE_BEFORE_ALL: 'beforeAll', + /** + * Namespace for collection of a `Suite`'s "before each" hooks. + */ + HOOK_TYPE_BEFORE_EACH: 'beforeEach', + + /** + * Emitted after a child `Suite` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_SUITE: 'suite', + /** + * Emitted after an "after all" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_AFTER_ALL: 'afterAll', + /** + * Emitted after an "after each" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_AFTER_EACH: 'afterEach', + /** + * Emitted after an "before all" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_BEFORE_ALL: 'beforeAll', + /** + * Emitted after an "before each" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_BEFORE_EACH: 'beforeEach', + /** + * Emitted after a `Test` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_TEST: 'test' + } + ); + + Suite.constants = constants; + }(suite)); + + /** + * Module dependencies. + * @private + */ + var EventEmitter = require$$0.EventEmitter; + var Pending = pending; + var utils$1 = utils$3; + var debug = browser.exports('mocha:runner'); + var Runnable$1 = runnable; + var Suite$2 = suite.exports; + var HOOK_TYPE_BEFORE_EACH = Suite$2.constants.HOOK_TYPE_BEFORE_EACH; + var HOOK_TYPE_AFTER_EACH = Suite$2.constants.HOOK_TYPE_AFTER_EACH; + var HOOK_TYPE_AFTER_ALL = Suite$2.constants.HOOK_TYPE_AFTER_ALL; + var HOOK_TYPE_BEFORE_ALL = Suite$2.constants.HOOK_TYPE_BEFORE_ALL; + var EVENT_ROOT_SUITE_RUN = Suite$2.constants.EVENT_ROOT_SUITE_RUN; + var STATE_FAILED = Runnable$1.constants.STATE_FAILED; + var STATE_PASSED = Runnable$1.constants.STATE_PASSED; + var STATE_PENDING = Runnable$1.constants.STATE_PENDING; + var stackFilter = utils$1.stackTraceFilter(); + var stringify = utils$1.stringify; + + const { + createInvalidExceptionError, + createUnsupportedError: createUnsupportedError$1, + createFatalError, + isMochaError, + constants: errorConstants + } = errors$2; + + /** + * Non-enumerable globals. + * @private + * @readonly + */ + var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date', + 'setImmediate', + 'clearImmediate' + ]; + + var constants$1 = utils$1.defineConstants( + /** + * {@link Runner}-related constants. + * @public + * @memberof Runner + * @readonly + * @alias constants + * @static + * @enum {string} + */ + { + /** + * Emitted when {@link Hook} execution begins + */ + EVENT_HOOK_BEGIN: 'hook', + /** + * Emitted when {@link Hook} execution ends + */ + EVENT_HOOK_END: 'hook end', + /** + * Emitted when Root {@link Suite} execution begins (all files have been parsed and hooks/tests are ready for execution) + */ + EVENT_RUN_BEGIN: 'start', + /** + * Emitted when Root {@link Suite} execution has been delayed via `delay` option + */ + EVENT_DELAY_BEGIN: 'waiting', + /** + * Emitted when delayed Root {@link Suite} execution is triggered by user via `global.run()` + */ + EVENT_DELAY_END: 'ready', + /** + * Emitted when Root {@link Suite} execution ends + */ + EVENT_RUN_END: 'end', + /** + * Emitted when {@link Suite} execution begins + */ + EVENT_SUITE_BEGIN: 'suite', + /** + * Emitted when {@link Suite} execution ends + */ + EVENT_SUITE_END: 'suite end', + /** + * Emitted when {@link Test} execution begins + */ + EVENT_TEST_BEGIN: 'test', + /** + * Emitted when {@link Test} execution ends + */ + EVENT_TEST_END: 'test end', + /** + * Emitted when {@link Test} execution fails + */ + EVENT_TEST_FAIL: 'fail', + /** + * Emitted when {@link Test} execution succeeds + */ + EVENT_TEST_PASS: 'pass', + /** + * Emitted when {@link Test} becomes pending + */ + EVENT_TEST_PENDING: 'pending', + /** + * Emitted when {@link Test} execution has failed, but will retry + */ + EVENT_TEST_RETRY: 'retry', + /** + * Initial state of Runner + */ + STATE_IDLE: 'idle', + /** + * State set to this value when the Runner has started running + */ + STATE_RUNNING: 'running', + /** + * State set to this value when the Runner has stopped + */ + STATE_STOPPED: 'stopped' + } + ); + + class Runner extends EventEmitter { + /** + * Initialize a `Runner` at the Root {@link Suite}, which represents a hierarchy of {@link Suite|Suites} and {@link Test|Tests}. + * + * @extends external:EventEmitter + * @public + * @class + * @param {Suite} suite - Root suite + * @param {Object} [opts] - Settings object + * @param {boolean} [opts.cleanReferencesAfterRun] - Whether to clean references to test fns and hooks when a suite is done. + * @param {boolean} [opts.delay] - Whether to delay execution of root suite until ready. + * @param {boolean} [opts.dryRun] - Whether to report tests without running them. + * @param {boolean} [opts.failZero] - Whether to fail test run if zero tests encountered. + */ + constructor(suite, opts = {}) { + super(); + + var self = this; + this._globals = []; + this._abort = false; + this.suite = suite; + this._opts = opts; + this.state = constants$1.STATE_IDLE; + this.total = suite.total(); + this.failures = 0; + /** + * @type {Map<EventEmitter,Map<string,Set<EventListener>>>} + */ + this._eventListeners = new Map(); + this.on(constants$1.EVENT_TEST_END, function (test) { + if (test.type === 'test' && test.retriedTest() && test.parent) { + var idx = + test.parent.tests && test.parent.tests.indexOf(test.retriedTest()); + if (idx > -1) test.parent.tests[idx] = test; + } + self.checkGlobals(test); + }); + this.on(constants$1.EVENT_HOOK_END, function (hook) { + self.checkGlobals(hook); + }); + this._defaultGrep = /.*/; + this.grep(this._defaultGrep); + this.globals(this.globalProps()); + + this.uncaught = this._uncaught.bind(this); + this.unhandled = (reason, promise) => { + if (isMochaError(reason)) { + debug( + 'trapped unhandled rejection coming out of Mocha; forwarding to uncaught handler:', + reason + ); + this.uncaught(reason); + } else { + debug( + 'trapped unhandled rejection from (probably) user code; re-emitting on process' + ); + this._removeEventListener( + process, + 'unhandledRejection', + this.unhandled + ); + try { + process.emit('unhandledRejection', reason, promise); + } finally { + this._addEventListener(process, 'unhandledRejection', this.unhandled); + } + } + }; + } + } + + /** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @private + */ + Runner.immediately = commonjsGlobal.setImmediate || nextTick$1; + + /** + * Replacement for `target.on(eventName, listener)` that does bookkeeping to remove them when this runner instance is disposed. + * @param {EventEmitter} target - The `EventEmitter` + * @param {string} eventName - The event name + * @param {string} fn - Listener function + * @private + */ + Runner.prototype._addEventListener = function (target, eventName, listener) { + debug( + '_addEventListener(): adding for event %s; %d current listeners', + eventName, + target.listenerCount(eventName) + ); + /* istanbul ignore next */ + if ( + this._eventListeners.has(target) && + this._eventListeners.get(target).has(eventName) && + this._eventListeners.get(target).get(eventName).has(listener) + ) { + debug( + 'warning: tried to attach duplicate event listener for %s', + eventName + ); + return; + } + target.on(eventName, listener); + const targetListeners = this._eventListeners.has(target) + ? this._eventListeners.get(target) + : new Map(); + const targetEventListeners = targetListeners.has(eventName) + ? targetListeners.get(eventName) + : new Set(); + targetEventListeners.add(listener); + targetListeners.set(eventName, targetEventListeners); + this._eventListeners.set(target, targetListeners); + }; + + /** + * Replacement for `target.removeListener(eventName, listener)` that also updates the bookkeeping. + * @param {EventEmitter} target - The `EventEmitter` + * @param {string} eventName - The event name + * @param {function} listener - Listener function + * @private + */ + Runner.prototype._removeEventListener = function (target, eventName, listener) { + target.removeListener(eventName, listener); + + if (this._eventListeners.has(target)) { + const targetListeners = this._eventListeners.get(target); + if (targetListeners.has(eventName)) { + const targetEventListeners = targetListeners.get(eventName); + targetEventListeners.delete(listener); + if (!targetEventListeners.size) { + targetListeners.delete(eventName); + } + } + if (!targetListeners.size) { + this._eventListeners.delete(target); + } + } else { + debug('trying to remove listener for untracked object %s', target); + } + }; + + /** + * Removes all event handlers set during a run on this instance. + * Remark: this does _not_ clean/dispose the tests or suites themselves. + */ + Runner.prototype.dispose = function () { + this.removeAllListeners(); + this._eventListeners.forEach((targetListeners, target) => { + targetListeners.forEach((targetEventListeners, eventName) => { + targetEventListeners.forEach(listener => { + target.removeListener(eventName, listener); + }); + }); + }); + this._eventListeners.clear(); + }; + + /** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @public + * @memberof Runner + * @param {RegExp} re + * @param {boolean} invert + * @return {Runner} Runner instance. + */ + Runner.prototype.grep = function (re, invert) { + debug('grep(): setting to %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; + }; + + /** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @memberof Runner + * @public + * @param {Suite} suite + * @return {number} + */ + Runner.prototype.grepTotal = function (suite) { + var self = this; + var total = 0; + + suite.eachTest(function (test) { + var match = self._grep.test(test.fullTitle()); + if (self._invert) { + match = !match; + } + if (match) { + total++; + } + }); + + return total; + }; + + /** + * Return a list of global properties. + * + * @return {Array} + * @private + */ + Runner.prototype.globalProps = function () { + var props = Object.keys(commonjsGlobal); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~props.indexOf(globals[i])) { + continue; + } + props.push(globals[i]); + } + + return props; + }; + + /** + * Allow the given `arr` of globals. + * + * @public + * @memberof Runner + * @param {Array} arr + * @return {Runner} Runner instance. + */ + Runner.prototype.globals = function (arr) { + if (!arguments.length) { + return this._globals; + } + debug('globals(): setting to %O', arr); + this._globals = this._globals.concat(arr); + return this; + }; + + /** + * Check for global variable leaks. + * + * @private + */ + Runner.prototype.checkGlobals = function (test) { + if (!this.checkLeaks) { + return; + } + var ok = this._globals; + + var globals = this.globalProps(); + var leaks; + + if (test) { + ok = ok.concat(test._allowedGlobals || []); + } + + if (this.prevGlobalsLength === globals.length) { + return; + } + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length) { + var msg = `global leak(s) detected: ${leaks.map(e => `'${e}'`).join(', ')}`; + this.fail(test, new Error(msg)); + } + }; + + /** + * Fail the given `test`. + * + * If `test` is a hook, failures work in the following pattern: + * - If bail, run corresponding `after each` and `after` hooks, + * then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @private + * @param {Runnable} test + * @param {Error} err + * @param {boolean} [force=false] - Whether to fail a pending test. + */ + Runner.prototype.fail = function (test, err, force) { + force = force === true; + if (test.isPending() && !force) { + return; + } + if (this.state === constants$1.STATE_STOPPED) { + if (err.code === errorConstants.MULTIPLE_DONE) { + throw err; + } + throw createFatalError( + 'Test failed after root suite execution completed!', + err + ); + } + + ++this.failures; + debug('total number of failures: %d', this.failures); + test.state = STATE_FAILED; + + if (!isError(err)) { + err = thrown2Error(err); + } + + try { + err.stack = + this.fullStackTrace || !err.stack ? err.stack : stackFilter(err.stack); + } catch (ignore) { + // some environments do not take kindly to monkeying with the stack + } + + this.emit(constants$1.EVENT_TEST_FAIL, test, err); + }; + + /** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @private + * @param {string} name + * @param {Function} fn + */ + + Runner.prototype.hook = function (name, fn) { + if (this._opts.dryRun) return fn(); + + var suite = this.suite; + var hooks = suite.getHooks(name); + var self = this; + + function next(i) { + var hook = hooks[i]; + if (!hook) { + return fn(); + } + self.currentRunnable = hook; + + if (name === HOOK_TYPE_BEFORE_ALL) { + hook.ctx.currentTest = hook.parent.tests[0]; + } else if (name === HOOK_TYPE_AFTER_ALL) { + hook.ctx.currentTest = hook.parent.tests[hook.parent.tests.length - 1]; + } else { + hook.ctx.currentTest = self.test; + } + + setHookTitle(hook); + + hook.allowUncaught = self.allowUncaught; + + self.emit(constants$1.EVENT_HOOK_BEGIN, hook); + + if (!hook.listeners('error').length) { + self._addEventListener(hook, 'error', function (err) { + self.fail(hook, err); + }); + } + + hook.run(function cbHookRun(err) { + var testError = hook.error(); + if (testError) { + self.fail(self.test, testError); + } + // conditional skip + if (hook.pending) { + if (name === HOOK_TYPE_AFTER_EACH) { + // TODO define and implement use case + if (self.test) { + self.test.pending = true; + } + } else if (name === HOOK_TYPE_BEFORE_EACH) { + if (self.test) { + self.test.pending = true; + } + self.emit(constants$1.EVENT_HOOK_END, hook); + hook.pending = false; // activates hook for next test + return fn(new Error('abort hookDown')); + } else if (name === HOOK_TYPE_BEFORE_ALL) { + suite.tests.forEach(function (test) { + test.pending = true; + }); + suite.suites.forEach(function (suite) { + suite.pending = true; + }); + hooks = []; + } else { + hook.pending = false; + var errForbid = createUnsupportedError$1('`this.skip` forbidden'); + self.fail(hook, errForbid); + return fn(errForbid); + } + } else if (err) { + self.fail(hook, err); + // stop executing hooks, notify callee of hook err + return fn(err); + } + self.emit(constants$1.EVENT_HOOK_END, hook); + delete hook.ctx.currentTest; + setHookTitle(hook); + next(++i); + }); + + function setHookTitle(hook) { + hook.originalTitle = hook.originalTitle || hook.title; + if (hook.ctx && hook.ctx.currentTest) { + hook.title = `${hook.originalTitle} for "${hook.ctx.currentTest.title}"`; + } else { + var parentTitle; + if (hook.parent.title) { + parentTitle = hook.parent.title; + } else { + parentTitle = hook.parent.root ? '{root}' : ''; + } + hook.title = `${hook.originalTitle} in "${parentTitle}"`; + } + } + } + + Runner.immediately(function () { + next(0); + }); + }; + + /** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @private + * @param {string} name + * @param {Array} suites + * @param {Function} fn + */ + Runner.prototype.hooks = function (name, suites, fn) { + var self = this; + var orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function (err) { + if (err) { + var errSuite = self.suite; + self.suite = orig; + return fn(err, errSuite); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); + }; + + /** + * Run 'afterEach' hooks from bottom up. + * + * @param {String} name + * @param {Function} fn + * @private + */ + Runner.prototype.hookUp = function (name, fn) { + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); + }; + + /** + * Run 'beforeEach' hooks from top level down. + * + * @param {String} name + * @param {Function} fn + * @private + */ + Runner.prototype.hookDown = function (name, fn) { + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); + }; + + /** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @private + */ + Runner.prototype.parents = function () { + var suite = this.suite; + var suites = []; + while (suite.parent) { + suite = suite.parent; + suites.push(suite); + } + return suites; + }; + + /** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @private + */ + Runner.prototype.runTest = function (fn) { + if (this._opts.dryRun) return Runner.immediately(fn); + + var self = this; + var test = this.test; + + if (!test) { + return; + } + + if (this.asyncOnly) { + test.asyncOnly = true; + } + this._addEventListener(test, 'error', function (err) { + self.fail(test, err); + }); + if (this.allowUncaught) { + test.allowUncaught = true; + return test.run(fn); + } + try { + test.run(fn); + } catch (err) { + fn(err); + } + }; + + /** + * Run tests in the given `suite` and invoke the callback `fn()` when complete. + * + * @private + * @param {Suite} suite + * @param {Function} fn + */ + Runner.prototype.runTests = function (suite, fn) { + var self = this; + var tests = suite.tests.slice(); + var test; + + function hookErr(_, errSuite, after) { + // before/after Each hook for errSuite failed: + var orig = self.suite; + + // for failed 'after each' hook start from errSuite parent, + // otherwise start from errSuite itself + self.suite = after ? errSuite.parent : errSuite; + + if (self.suite) { + self.hookUp(HOOK_TYPE_AFTER_EACH, function (err2, errSuite2) { + self.suite = orig; + // some hooks may fail even now + if (err2) { + return hookErr(err2, errSuite2, true); + } + // report error suite + fn(errSuite); + }); + } else { + // there is no need calling other 'after each' hooks + self.suite = orig; + fn(errSuite); + } + } + + function next(err, errSuite) { + // if we bail after first err + if (self.failures && suite._bail) { + tests = []; + } + + if (self._abort) { + return fn(); + } + + if (err) { + return hookErr(err, errSuite, true); + } + + // next test + test = tests.shift(); + + // all done + if (!test) { + return fn(); + } + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) { + match = !match; + } + if (!match) { + // Run immediately only if we have defined a grep. When we + // define a grep — It can cause maximum callstack error if + // the grep is doing a large recursive loop by neglecting + // all tests. The run immediately function also comes with + // a performance cost. So we don't want to run immediately + // if we run the whole test suite, because running the whole + // test suite don't do any immediate recursive loops. Thus, + // allowing a JS runtime to breathe. + if (self._grep !== self._defaultGrep) { + Runner.immediately(next); + } else { + next(); + } + return; + } + + // static skip, no hooks are executed + if (test.isPending()) { + if (self.forbidPending) { + self.fail(test, new Error('Pending test forbidden'), true); + } else { + test.state = STATE_PENDING; + self.emit(constants$1.EVENT_TEST_PENDING, test); + } + self.emit(constants$1.EVENT_TEST_END, test); + return next(); + } + + // execute test and hook(s) + self.emit(constants$1.EVENT_TEST_BEGIN, (self.test = test)); + self.hookDown(HOOK_TYPE_BEFORE_EACH, function (err, errSuite) { + // conditional skip within beforeEach + if (test.isPending()) { + if (self.forbidPending) { + self.fail(test, new Error('Pending test forbidden'), true); + } else { + test.state = STATE_PENDING; + self.emit(constants$1.EVENT_TEST_PENDING, test); + } + self.emit(constants$1.EVENT_TEST_END, test); + // skip inner afterEach hooks below errSuite level + var origSuite = self.suite; + self.suite = errSuite || self.suite; + return self.hookUp(HOOK_TYPE_AFTER_EACH, function (e, eSuite) { + self.suite = origSuite; + next(e, eSuite); + }); + } + if (err) { + return hookErr(err, errSuite, false); + } + self.currentRunnable = self.test; + self.runTest(function (err) { + test = self.test; + // conditional skip within it + if (test.pending) { + if (self.forbidPending) { + self.fail(test, new Error('Pending test forbidden'), true); + } else { + test.state = STATE_PENDING; + self.emit(constants$1.EVENT_TEST_PENDING, test); + } + self.emit(constants$1.EVENT_TEST_END, test); + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } else if (err) { + var retry = test.currentRetry(); + if (retry < test.retries()) { + var clonedTest = test.clone(); + clonedTest.currentRetry(retry + 1); + tests.unshift(clonedTest); + + self.emit(constants$1.EVENT_TEST_RETRY, test, err); + + // Early return + hook trigger so that it doesn't + // increment the count wrong + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } else { + self.fail(test, err); + } + self.emit(constants$1.EVENT_TEST_END, test); + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } + + test.state = STATE_PASSED; + self.emit(constants$1.EVENT_TEST_PASS, test); + self.emit(constants$1.EVENT_TEST_END, test); + self.hookUp(HOOK_TYPE_AFTER_EACH, next); + }); + }); + } + + this.next = next; + this.hookErr = hookErr; + next(); + }; + + /** + * Run the given `suite` and invoke the callback `fn()` when complete. + * + * @private + * @param {Suite} suite + * @param {Function} fn + */ + Runner.prototype.runSuite = function (suite, fn) { + var i = 0; + var self = this; + var total = this.grepTotal(suite); + + debug('runSuite(): running %s', suite.fullTitle()); + + if (!total || (self.failures && suite._bail)) { + debug('runSuite(): bailing'); + return fn(); + } + + this.emit(constants$1.EVENT_SUITE_BEGIN, (this.suite = suite)); + + function next(errSuite) { + if (errSuite) { + // current suite failed on a hook from errSuite + if (errSuite === suite) { + // if errSuite is current suite + // continue to the next sibling suite + return done(); + } + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); + } + + if (self._abort) { + return done(); + } + + var curr = suite.suites[i++]; + if (!curr) { + return done(); + } + + // Avoid grep neglecting large number of tests causing a + // huge recursive loop and thus a maximum call stack error. + // See comment in `this.runTests()` for more information. + if (self._grep !== self._defaultGrep) { + Runner.immediately(function () { + self.runSuite(curr, next); + }); + } else { + self.runSuite(curr, next); + } + } + + function done(errSuite) { + self.suite = suite; + self.nextSuite = next; + + // remove reference to test + delete self.test; + + self.hook(HOOK_TYPE_AFTER_ALL, function () { + self.emit(constants$1.EVENT_SUITE_END, suite); + fn(errSuite); + }); + } + + this.nextSuite = next; + + this.hook(HOOK_TYPE_BEFORE_ALL, function (err) { + if (err) { + return done(); + } + self.runTests(suite, next); + }); + }; + + /** + * Handle uncaught exceptions within runner. + * + * This function is bound to the instance as `Runner#uncaught` at instantiation + * time. It's intended to be listening on the `Process.uncaughtException` event. + * In order to not leak EE listeners, we need to ensure no more than a single + * `uncaughtException` listener exists per `Runner`. The only way to do + * this--because this function needs the context (and we don't have lambdas)--is + * to use `Function.prototype.bind`. We need strict equality to unregister and + * _only_ unregister the _one_ listener we set from the + * `Process.uncaughtException` event; would be poor form to just remove + * everything. See {@link Runner#run} for where the event listener is registered + * and unregistered. + * @param {Error} err - Some uncaught error + * @private + */ + Runner.prototype._uncaught = function (err) { + // this is defensive to prevent future developers from mis-calling this function. + // it's more likely that it'd be called with the incorrect context--say, the global + // `process` object--than it would to be called with a context that is not a "subclass" + // of `Runner`. + if (!(this instanceof Runner)) { + throw createFatalError( + 'Runner#uncaught() called with invalid context', + this + ); + } + if (err instanceof Pending) { + debug('uncaught(): caught a Pending'); + return; + } + // browser does not exit script when throwing in global.onerror() + if (this.allowUncaught && !utils$1.isBrowser()) { + debug('uncaught(): bubbling exception due to --allow-uncaught'); + throw err; + } + + if (this.state === constants$1.STATE_STOPPED) { + debug('uncaught(): throwing after run has completed!'); + throw err; + } + + if (err) { + debug('uncaught(): got truthy exception %O', err); + } else { + debug('uncaught(): undefined/falsy exception'); + err = createInvalidExceptionError( + 'Caught falsy/undefined exception which would otherwise be uncaught. No stack trace found; try a debugger', + err + ); + } + + if (!isError(err)) { + err = thrown2Error(err); + debug('uncaught(): converted "error" %o to Error', err); + } + err.uncaught = true; + + var runnable = this.currentRunnable; + + if (!runnable) { + runnable = new Runnable$1('Uncaught error outside test suite'); + debug('uncaught(): no current Runnable; created a phony one'); + runnable.parent = this.suite; + + if (this.state === constants$1.STATE_RUNNING) { + debug('uncaught(): failing gracefully'); + this.fail(runnable, err); + } else { + // Can't recover from this failure + debug('uncaught(): test run has not yet started; unrecoverable'); + this.emit(constants$1.EVENT_RUN_BEGIN); + this.fail(runnable, err); + this.emit(constants$1.EVENT_RUN_END); + } + + return; + } + + runnable.clearTimeout(); + + if (runnable.isFailed()) { + debug('uncaught(): Runnable has already failed'); + // Ignore error if already failed + return; + } else if (runnable.isPending()) { + debug('uncaught(): pending Runnable wound up failing!'); + // report 'pending test' retrospectively as failed + this.fail(runnable, err, true); + return; + } + + // we cannot recover gracefully if a Runnable has already passed + // then fails asynchronously + if (runnable.isPassed()) { + debug('uncaught(): Runnable has already passed; bailing gracefully'); + this.fail(runnable, err); + this.abort(); + } else { + debug('uncaught(): forcing Runnable to complete with Error'); + return runnable.callback(err); + } + }; + + /** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @public + * @memberof Runner + * @param {Function} fn - Callback when finished + * @param {Object} [opts] - For subclasses + * @param {string[]} opts.files - Files to run + * @param {Options} opts.options - command-line options + * @returns {Runner} Runner instance. + */ + Runner.prototype.run = function (fn, opts = {}) { + var rootSuite = this.suite; + var options = opts.options || {}; + + debug('run(): got options: %O', options); + fn = fn || function () {}; + + const end = () => { + if (!this.total && this._opts.failZero) this.failures = 1; + + debug('run(): root suite completed; emitting %s', constants$1.EVENT_RUN_END); + this.emit(constants$1.EVENT_RUN_END); + }; + + const begin = () => { + debug('run(): emitting %s', constants$1.EVENT_RUN_BEGIN); + this.emit(constants$1.EVENT_RUN_BEGIN); + debug('run(): emitted %s', constants$1.EVENT_RUN_BEGIN); + + this.runSuite(rootSuite, end); + }; + + const prepare = () => { + debug('run(): starting'); + // If there is an `only` filter + if (rootSuite.hasOnly()) { + rootSuite.filterOnly(); + debug('run(): filtered exclusive Runnables'); + } + this.state = constants$1.STATE_RUNNING; + if (this._opts.delay) { + this.emit(constants$1.EVENT_DELAY_END); + debug('run(): "delay" ended'); + } + + return begin(); + }; + + // references cleanup to avoid memory leaks + if (this._opts.cleanReferencesAfterRun) { + this.on(constants$1.EVENT_SUITE_END, suite => { + suite.cleanReferences(); + }); + } + + // callback + this.on(constants$1.EVENT_RUN_END, function () { + this.state = constants$1.STATE_STOPPED; + debug('run(): emitted %s', constants$1.EVENT_RUN_END); + fn(this.failures); + }); + + this._removeEventListener(process, 'uncaughtException', this.uncaught); + this._removeEventListener(process, 'unhandledRejection', this.unhandled); + this._addEventListener(process, 'uncaughtException', this.uncaught); + this._addEventListener(process, 'unhandledRejection', this.unhandled); + + if (this._opts.delay) { + // for reporters, I guess. + // might be nice to debounce some dots while we wait. + this.emit(constants$1.EVENT_DELAY_BEGIN, rootSuite); + rootSuite.once(EVENT_ROOT_SUITE_RUN, prepare); + debug('run(): waiting for green light due to --delay'); + } else { + Runner.immediately(prepare); + } + + return this; + }; + + /** + * Toggle partial object linking behavior; used for building object references from + * unique ID's. Does nothing in serial mode, because the object references already exist. + * Subclasses can implement this (e.g., `ParallelBufferedRunner`) + * @abstract + * @param {boolean} [value] - If `true`, enable partial object linking, otherwise disable + * @returns {Runner} + * @chainable + * @public + * @example + * // this reporter needs proper object references when run in parallel mode + * class MyReporter() { + * constructor(runner) { + * this.runner.linkPartialObjects(true) + * .on(EVENT_SUITE_BEGIN, suite => { + // this Suite may be the same object... + * }) + * .on(EVENT_TEST_BEGIN, test => { + * // ...as the `test.parent` property + * }); + * } + * } + */ + Runner.prototype.linkPartialObjects = function (value) { + return this; + }; + + /* + * Like {@link Runner#run}, but does not accept a callback and returns a `Promise` instead of a `Runner`. + * This function cannot reject; an `unhandledRejection` event will bubble up to the `process` object instead. + * @public + * @memberof Runner + * @param {Object} [opts] - Options for {@link Runner#run} + * @returns {Promise<number>} Failure count + */ + Runner.prototype.runAsync = async function runAsync(opts = {}) { + return new Promise(resolve => { + this.run(resolve, opts); + }); + }; + + /** + * Cleanly abort execution. + * + * @memberof Runner + * @public + * @return {Runner} Runner instance. + */ + Runner.prototype.abort = function () { + debug('abort(): aborting'); + this._abort = true; + + return this; + }; + + /** + * Returns `true` if Mocha is running in parallel mode. For reporters. + * + * Subclasses should return an appropriate value. + * @public + * @returns {false} + */ + Runner.prototype.isParallelMode = function isParallelMode() { + return false; + }; + + /** + * Configures an alternate reporter for worker processes to use. Subclasses + * using worker processes should implement this. + * @public + * @param {string} path - Absolute path to alternate reporter for worker processes to use + * @returns {Runner} + * @throws When in serial mode + * @chainable + * @abstract + */ + Runner.prototype.workerReporter = function () { + throw createUnsupportedError$1('workerReporter() not supported in serial mode'); + }; + + /** + * Filter leaks with the given globals flagged as `ok`. + * + * @private + * @param {Array} ok + * @param {Array} globals + * @return {Array} + */ + function filterLeaks(ok, globals) { + return globals.filter(function (key) { + // Firefox and Chrome exposes iframes as index inside the window object + if (/^\d+/.test(key)) { + return false; + } + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method + // not init at first it is assigned in some seconds + if (commonjsGlobal.navigator && /^getInterface/.test(key)) { + return false; + } + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (commonjsGlobal.navigator && /^\d+/.test(key)) { + return false; + } + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) { + return false; + } + + var matched = ok.filter(function (ok) { + if (~ok.indexOf('*')) { + return key.indexOf(ok.split('*')[0]) === 0; + } + return key === ok; + }); + return !matched.length && (!commonjsGlobal.navigator || key !== 'onerror'); + }); + } + + /** + * Check if argument is an instance of Error object or a duck-typed equivalent. + * + * @private + * @param {Object} err - object to check + * @param {string} err.message - error message + * @returns {boolean} + */ + function isError(err) { + return err instanceof Error || (err && typeof err.message === 'string'); + } + + /** + * + * Converts thrown non-extensible type into proper Error. + * + * @private + * @param {*} thrown - Non-extensible type thrown by code + * @return {Error} + */ + function thrown2Error(err) { + return new Error( + `the ${utils$1.canonicalType(err)} ${stringify( + err + )} was thrown, throw an Error :)` + ); + } + + Runner.constants = constants$1; + + /** + * Node.js' `EventEmitter` + * @external EventEmitter + * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter} + */ + + var runner = Runner; + + (function (module, exports) { + /** + * @module Base + */ + /** + * Module dependencies. + */ + + var diff = lib; + var milliseconds = ms$1; + var utils = utils$3; + var supportsColor = require$$18; + var symbols = browser$1; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + + const isBrowser = utils.isBrowser(); + + function getBrowserWindowSize() { + if ('innerHeight' in commonjsGlobal) { + return [commonjsGlobal.innerHeight, commonjsGlobal.innerWidth]; + } + // In a Web Worker, the DOM Window is not available. + return [640, 480]; + } + + /** + * Expose `Base`. + */ + + exports = module.exports = Base; + + /** + * Check if both stdio streams are associated with a tty. + */ + + var isatty = isBrowser || (process.stdout.isTTY && process.stderr.isTTY); + + /** + * Save log references to avoid tests interfering (see GH-3604). + */ + var consoleLog = console.log; + + /** + * Enable coloring by default, except in the browser interface. + */ + + exports.useColors = + !isBrowser && + (supportsColor.stdout || process.env.MOCHA_COLORS !== undefined); + + /** + * Inline diffs instead of +/- + */ + + exports.inlineDiffs = false; + + /** + * Truncate diffs longer than this value to avoid slow performance + */ + exports.maxDiffSize = 8192; + + /** + * Default color map. + */ + + exports.colors = { + pass: 90, + fail: 31, + 'bright pass': 92, + 'bright fail': 91, + 'bright yellow': 93, + pending: 36, + suite: 0, + 'error title': 0, + 'error message': 31, + 'error stack': 90, + checkmark: 32, + fast: 90, + medium: 33, + slow: 31, + green: 32, + light: 90, + 'diff gutter': 90, + 'diff added': 32, + 'diff removed': 31, + 'diff added inline': '30;42', + 'diff removed inline': '30;41' + }; + + /** + * Default symbol map. + */ + + exports.symbols = { + ok: symbols.success, + err: symbols.error, + dot: '.', + comma: ',', + bang: '!' + }; + + /** + * Color `str` with the given `type`, + * allowing colors to be disabled, + * as well as user-defined color + * schemes. + * + * @private + * @param {string} type + * @param {string} str + * @return {string} + */ + var color = (exports.color = function (type, str) { + if (!exports.useColors) { + return String(str); + } + return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; + }); + + /** + * Expose term window size, with some defaults for when stderr is not a tty. + */ + + exports.window = { + width: 75 + }; + + if (isatty) { + if (isBrowser) { + exports.window.width = getBrowserWindowSize()[1]; + } else { + exports.window.width = process.stdout.getWindowSize(1)[0]; + } + } + + /** + * Expose some basic cursor interactions that are common among reporters. + */ + + exports.cursor = { + hide: function () { + isatty && process.stdout.write('\u001b[?25l'); + }, + + show: function () { + isatty && process.stdout.write('\u001b[?25h'); + }, + + deleteLine: function () { + isatty && process.stdout.write('\u001b[2K'); + }, + + beginningOfLine: function () { + isatty && process.stdout.write('\u001b[0G'); + }, + + CR: function () { + if (isatty) { + exports.cursor.deleteLine(); + exports.cursor.beginningOfLine(); + } else { + process.stdout.write('\r'); + } + } + }; + + var showDiff = (exports.showDiff = function (err) { + return ( + err && + err.showDiff !== false && + sameType(err.actual, err.expected) && + err.expected !== undefined + ); + }); + + function stringifyDiffObjs(err) { + if (!utils.isString(err.actual) || !utils.isString(err.expected)) { + err.actual = utils.stringify(err.actual); + err.expected = utils.stringify(err.expected); + } + } + + /** + * Returns a diff between 2 strings with coloured ANSI output. + * + * @description + * The diff will be either inline or unified dependent on the value + * of `Base.inlineDiff`. + * + * @param {string} actual + * @param {string} expected + * @return {string} Diff + */ + + var generateDiff = (exports.generateDiff = function (actual, expected) { + try { + var maxLen = exports.maxDiffSize; + var skipped = 0; + if (maxLen > 0) { + skipped = Math.max(actual.length - maxLen, expected.length - maxLen); + actual = actual.slice(0, maxLen); + expected = expected.slice(0, maxLen); + } + let result = exports.inlineDiffs + ? inlineDiff(actual, expected) + : unifiedDiff(actual, expected); + if (skipped > 0) { + result = `${result}\n [mocha] output truncated to ${maxLen} characters, see "maxDiffSize" reporter-option\n`; + } + return result; + } catch (err) { + var msg = + '\n ' + + color('diff added', '+ expected') + + ' ' + + color('diff removed', '- actual: failed to generate Mocha diff') + + '\n'; + return msg; + } + }); + + /** + * Outputs the given `failures` as a list. + * + * @public + * @memberof Mocha.reporters.Base + * @variation 1 + * @param {Object[]} failures - Each is Test instance with corresponding + * Error property + */ + exports.list = function (failures) { + var multipleErr, multipleTest; + Base.consoleLog(); + failures.forEach(function (test, i) { + // format + var fmt = + color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); + + // msg + var msg; + var err; + if (test.err && test.err.multiple) { + if (multipleTest !== test) { + multipleTest = test; + multipleErr = [test.err].concat(test.err.multiple); + } + err = multipleErr.shift(); + } else { + err = test.err; + } + var message; + if (typeof err.inspect === 'function') { + message = err.inspect() + ''; + } else if (err.message && typeof err.message.toString === 'function') { + message = err.message + ''; + } else { + message = ''; + } + var stack = err.stack || message; + var index = message ? stack.indexOf(message) : -1; + + if (index === -1) { + msg = message; + } else { + index += message.length; + msg = stack.slice(0, index); + // remove msg from stack + stack = stack.slice(index + 1); + } + + // uncaught + if (err.uncaught) { + msg = 'Uncaught ' + msg; + } + // explicitly show diff + if (!exports.hideDiff && showDiff(err)) { + stringifyDiffObjs(err); + fmt = + color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); + var match = message.match(/^([^:]+): expected/); + msg = '\n ' + color('error message', match ? match[1] : msg); + + msg += generateDiff(err.actual, err.expected); + } + + // indent stack trace + stack = stack.replace(/^/gm, ' '); + + // indented test title + var testTitle = ''; + test.titlePath().forEach(function (str, index) { + if (index !== 0) { + testTitle += '\n '; + } + for (var i = 0; i < index; i++) { + testTitle += ' '; + } + testTitle += str; + }); + + Base.consoleLog(fmt, i + 1, testTitle, msg, stack); + }); + }; + + /** + * Constructs a new `Base` reporter instance. + * + * @description + * All other reporters generally inherit from this reporter. + * + * @public + * @class + * @memberof Mocha.reporters + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Base(runner, options) { + var failures = (this.failures = []); + + if (!runner) { + throw new TypeError('Missing runner argument'); + } + this.options = options || {}; + this.runner = runner; + this.stats = runner.stats; // assigned so Reporters keep a closer reference + + var maxDiffSizeOpt = + this.options.reporterOption && this.options.reporterOption.maxDiffSize; + if (maxDiffSizeOpt !== undefined && !isNaN(Number(maxDiffSizeOpt))) { + exports.maxDiffSize = Number(maxDiffSizeOpt); + } + + runner.on(EVENT_TEST_PASS, function (test) { + if (test.duration > test.slow()) { + test.speed = 'slow'; + } else if (test.duration > test.slow() / 2) { + test.speed = 'medium'; + } else { + test.speed = 'fast'; + } + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + if (showDiff(err)) { + stringifyDiffObjs(err); + } + // more than one error per test + if (test.err && err instanceof Error) { + test.err.multiple = (test.err.multiple || []).concat(err); + } else { + test.err = err; + } + failures.push(test); + }); + } + + /** + * Outputs common epilogue used by many of the bundled reporters. + * + * @public + * @memberof Mocha.reporters + */ + Base.prototype.epilogue = function () { + var stats = this.stats; + var fmt; + + Base.consoleLog(); + + // passes + fmt = + color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); + + Base.consoleLog(fmt, stats.passes || 0, milliseconds(stats.duration)); + + // pending + if (stats.pending) { + fmt = color('pending', ' ') + color('pending', ' %d pending'); + + Base.consoleLog(fmt, stats.pending); + } + + // failures + if (stats.failures) { + fmt = color('fail', ' %d failing'); + + Base.consoleLog(fmt, stats.failures); + + Base.list(this.failures); + Base.consoleLog(); + } + + Base.consoleLog(); + }; + + /** + * Pads the given `str` to `len`. + * + * @private + * @param {string} str + * @param {string} len + * @return {string} + */ + function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; + } + + /** + * Returns inline diff between 2 strings with coloured ANSI output. + * + * @private + * @param {String} actual + * @param {String} expected + * @return {string} Diff + */ + function inlineDiff(actual, expected) { + var msg = errorDiff(actual, expected); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines + .map(function (str, i) { + return pad(++i, width) + ' |' + ' ' + str; + }) + .join('\n'); + } + + // legend + msg = + '\n' + + color('diff removed inline', 'actual') + + ' ' + + color('diff added inline', 'expected') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + return msg; + } + + /** + * Returns unified diff between two strings with coloured ANSI output. + * + * @private + * @param {String} actual + * @param {String} expected + * @return {string} The diff. + */ + function unifiedDiff(actual, expected) { + var indent = ' '; + function cleanUp(line) { + if (line[0] === '+') { + return indent + colorLines('diff added', line); + } + if (line[0] === '-') { + return indent + colorLines('diff removed', line); + } + if (line.match(/@@/)) { + return '--'; + } + if (line.match(/\\ No newline/)) { + return null; + } + return indent + line; + } + function notBlank(line) { + return typeof line !== 'undefined' && line !== null; + } + var msg = diff.createPatch('string', actual, expected); + var lines = msg.split('\n').splice(5); + return ( + '\n ' + + colorLines('diff added', '+ expected') + + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n') + ); + } + + /** + * Returns character diff for `err`. + * + * @private + * @param {String} actual + * @param {String} expected + * @return {string} the diff + */ + function errorDiff(actual, expected) { + return diff + .diffWordsWithSpace(actual, expected) + .map(function (str) { + if (str.added) { + return colorLines('diff added inline', str.value); + } + if (str.removed) { + return colorLines('diff removed inline', str.value); + } + return str.value; + }) + .join(''); + } + + /** + * Colors lines for `str`, using the color `name`. + * + * @private + * @param {string} name + * @param {string} str + * @return {string} + */ + function colorLines(name, str) { + return str + .split('\n') + .map(function (str) { + return color(name, str); + }) + .join('\n'); + } + + /** + * Object#toString reference. + */ + var objToString = Object.prototype.toString; + + /** + * Checks that a / b have the same type. + * + * @private + * @param {Object} a + * @param {Object} b + * @return {boolean} + */ + function sameType(a, b) { + return objToString.call(a) === objToString.call(b); + } + + Base.consoleLog = consoleLog; + + Base.abstract = true; + }(base$1, base$1.exports)); + + var dot = {exports: {}}; + + (function (module, exports) { + /** + * @module Dot + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_RUN_END = constants.EVENT_RUN_END; + + /** + * Expose `Dot`. + */ + + module.exports = Dot; + + /** + * Constructs a new `Dot` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Dot(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.75) | 0; + var n = -1; + + runner.on(EVENT_RUN_BEGIN, function () { + process.stdout.write('\n'); + }); + + runner.on(EVENT_TEST_PENDING, function () { + if (++n % width === 0) { + process.stdout.write('\n '); + } + process.stdout.write(Base.color('pending', Base.symbols.comma)); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + if (++n % width === 0) { + process.stdout.write('\n '); + } + if (test.speed === 'slow') { + process.stdout.write(Base.color('bright yellow', Base.symbols.dot)); + } else { + process.stdout.write(Base.color(test.speed, Base.symbols.dot)); + } + }); + + runner.on(EVENT_TEST_FAIL, function () { + if (++n % width === 0) { + process.stdout.write('\n '); + } + process.stdout.write(Base.color('fail', Base.symbols.bang)); + }); + + runner.once(EVENT_RUN_END, function () { + process.stdout.write('\n'); + self.epilogue(); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Dot, Base); + + Dot.description = 'dot matrix representation'; + }(dot)); + + var doc = {exports: {}}; + + (function (module, exports) { + /** + * @module Doc + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + + /** + * Expose `Doc`. + */ + + module.exports = Doc; + + /** + * Constructs a new `Doc` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Doc(runner, options) { + Base.call(this, runner, options); + + var indents = 2; + + function indent() { + return Array(indents).join(' '); + } + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + if (suite.root) { + return; + } + ++indents; + Base.consoleLog('%s<section class="suite">', indent()); + ++indents; + Base.consoleLog('%s<h1>%s</h1>', indent(), utils.escape(suite.title)); + Base.consoleLog('%s<dl>', indent()); + }); + + runner.on(EVENT_SUITE_END, function (suite) { + if (suite.root) { + return; + } + Base.consoleLog('%s</dl>', indent()); + --indents; + Base.consoleLog('%s</section>', indent()); + --indents; + }); + + runner.on(EVENT_TEST_PASS, function (test) { + Base.consoleLog('%s <dt>%s</dt>', indent(), utils.escape(test.title)); + Base.consoleLog('%s <dt>%s</dt>', indent(), utils.escape(test.file)); + var code = utils.escape(utils.clean(test.body)); + Base.consoleLog('%s <dd><pre><code>%s</code></pre></dd>', indent(), code); + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + Base.consoleLog( + '%s <dt class="error">%s</dt>', + indent(), + utils.escape(test.title) + ); + Base.consoleLog( + '%s <dt class="error">%s</dt>', + indent(), + utils.escape(test.file) + ); + var code = utils.escape(utils.clean(test.body)); + Base.consoleLog( + '%s <dd class="error"><pre><code>%s</code></pre></dd>', + indent(), + code + ); + Base.consoleLog( + '%s <dd class="error">%s</dd>', + indent(), + utils.escape(err) + ); + }); + } + + Doc.description = 'HTML documentation'; + }(doc)); + + var tap = {exports: {}}; + + (function (module, exports) { + /** + * @module TAP + */ + /** + * Module dependencies. + */ + + var util = require$$0$1; + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var inherits = utils$3.inherits; + var sprintf = util.format; + + /** + * Expose `TAP`. + */ + + module.exports = TAP; + + /** + * Constructs a new `TAP` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function TAP(runner, options) { + Base.call(this, runner, options); + + var self = this; + var n = 1; + + var tapVersion = '12'; + if (options && options.reporterOptions) { + if (options.reporterOptions.tapVersion) { + tapVersion = options.reporterOptions.tapVersion.toString(); + } + } + + this._producer = createProducer(tapVersion); + + runner.once(EVENT_RUN_BEGIN, function () { + self._producer.writeVersion(); + }); + + runner.on(EVENT_TEST_END, function () { + ++n; + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + self._producer.writePending(n, test); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + self._producer.writePass(n, test); + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + self._producer.writeFail(n, test, err); + }); + + runner.once(EVENT_RUN_END, function () { + self._producer.writeEpilogue(runner.stats); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(TAP, Base); + + /** + * Returns a TAP-safe title of `test`. + * + * @private + * @param {Test} test - Test instance. + * @return {String} title with any hash character removed + */ + function title(test) { + return test.fullTitle().replace(/#/g, ''); + } + + /** + * Writes newline-terminated formatted string to reporter output stream. + * + * @private + * @param {string} format - `printf`-like format string + * @param {...*} [varArgs] - Format string arguments + */ + function println(format, varArgs) { + var vargs = Array.from(arguments); + vargs[0] += '\n'; + process.stdout.write(sprintf.apply(null, vargs)); + } + + /** + * Returns a `tapVersion`-appropriate TAP producer instance, if possible. + * + * @private + * @param {string} tapVersion - Version of TAP specification to produce. + * @returns {TAPProducer} specification-appropriate instance + * @throws {Error} if specification version has no associated producer. + */ + function createProducer(tapVersion) { + var producers = { + 12: new TAP12Producer(), + 13: new TAP13Producer() + }; + var producer = producers[tapVersion]; + + if (!producer) { + throw new Error( + 'invalid or unsupported TAP version: ' + JSON.stringify(tapVersion) + ); + } + + return producer; + } + + /** + * @summary + * Constructs a new TAPProducer. + * + * @description + * <em>Only</em> to be used as an abstract base class. + * + * @private + * @constructor + */ + function TAPProducer() {} + + /** + * Writes the TAP version to reporter output stream. + * + * @abstract + */ + TAPProducer.prototype.writeVersion = function () {}; + + /** + * Writes the plan to reporter output stream. + * + * @abstract + * @param {number} ntests - Number of tests that are planned to run. + */ + TAPProducer.prototype.writePlan = function (ntests) { + println('%d..%d', 1, ntests); + }; + + /** + * Writes that test passed to reporter output stream. + * + * @abstract + * @param {number} n - Index of test that passed. + * @param {Test} test - Instance containing test information. + */ + TAPProducer.prototype.writePass = function (n, test) { + println('ok %d %s', n, title(test)); + }; + + /** + * Writes that test was skipped to reporter output stream. + * + * @abstract + * @param {number} n - Index of test that was skipped. + * @param {Test} test - Instance containing test information. + */ + TAPProducer.prototype.writePending = function (n, test) { + println('ok %d %s # SKIP -', n, title(test)); + }; + + /** + * Writes that test failed to reporter output stream. + * + * @abstract + * @param {number} n - Index of test that failed. + * @param {Test} test - Instance containing test information. + * @param {Error} err - Reason the test failed. + */ + TAPProducer.prototype.writeFail = function (n, test, err) { + println('not ok %d %s', n, title(test)); + }; + + /** + * Writes the summary epilogue to reporter output stream. + * + * @abstract + * @param {Object} stats - Object containing run statistics. + */ + TAPProducer.prototype.writeEpilogue = function (stats) { + // :TBD: Why is this not counting pending tests? + println('# tests ' + (stats.passes + stats.failures)); + println('# pass ' + stats.passes); + // :TBD: Why are we not showing pending results? + println('# fail ' + stats.failures); + this.writePlan(stats.passes + stats.failures + stats.pending); + }; + + /** + * @summary + * Constructs a new TAP12Producer. + * + * @description + * Produces output conforming to the TAP12 specification. + * + * @private + * @constructor + * @extends TAPProducer + * @see {@link https://testanything.org/tap-specification.html|Specification} + */ + function TAP12Producer() { + /** + * Writes that test failed to reporter output stream, with error formatting. + * @override + */ + this.writeFail = function (n, test, err) { + TAPProducer.prototype.writeFail.call(this, n, test, err); + if (err.message) { + println(err.message.replace(/^/gm, ' ')); + } + if (err.stack) { + println(err.stack.replace(/^/gm, ' ')); + } + }; + } + + /** + * Inherit from `TAPProducer.prototype`. + */ + inherits(TAP12Producer, TAPProducer); + + /** + * @summary + * Constructs a new TAP13Producer. + * + * @description + * Produces output conforming to the TAP13 specification. + * + * @private + * @constructor + * @extends TAPProducer + * @see {@link https://testanything.org/tap-version-13-specification.html|Specification} + */ + function TAP13Producer() { + /** + * Writes the TAP version to reporter output stream. + * @override + */ + this.writeVersion = function () { + println('TAP version 13'); + }; + + /** + * Writes that test failed to reporter output stream, with error formatting. + * @override + */ + this.writeFail = function (n, test, err) { + TAPProducer.prototype.writeFail.call(this, n, test, err); + var emitYamlBlock = err.message != null || err.stack != null; + if (emitYamlBlock) { + println(indent(1) + '---'); + if (err.message) { + println(indent(2) + 'message: |-'); + println(err.message.replace(/^/gm, indent(3))); + } + if (err.stack) { + println(indent(2) + 'stack: |-'); + println(err.stack.replace(/^/gm, indent(3))); + } + println(indent(1) + '...'); + } + }; + + function indent(level) { + return Array(level + 1).join(' '); + } + } + + /** + * Inherit from `TAPProducer.prototype`. + */ + inherits(TAP13Producer, TAPProducer); + + TAP.description = 'TAP-compatible output'; + }(tap)); + + var json = {exports: {}}; + + var _polyfillNode_fs = {}; + + var _polyfillNode_fs$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': _polyfillNode_fs + }); + + var require$$2 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_fs$1); + + (function (module, exports) { + /** + * @module JSON + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var fs = require$$2; + var path = require$$1; + const createUnsupportedError = errors$2.createUnsupportedError; + const utils = utils$3; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var EVENT_RUN_END = constants.EVENT_RUN_END; + + /** + * Expose `JSON`. + */ + + module.exports = JSONReporter; + + /** + * Constructs a new `JSON` reporter instance. + * + * @public + * @class JSON + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function JSONReporter(runner, options = {}) { + Base.call(this, runner, options); + + var self = this; + var tests = []; + var pending = []; + var failures = []; + var passes = []; + var output; + + if (options.reporterOption && options.reporterOption.output) { + if (utils.isBrowser()) { + throw createUnsupportedError('file output not supported in browser'); + } + output = options.reporterOption.output; + } + + runner.on(EVENT_TEST_END, function (test) { + tests.push(test); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + passes.push(test); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + failures.push(test); + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + pending.push(test); + }); + + runner.once(EVENT_RUN_END, function () { + var obj = { + stats: self.stats, + tests: tests.map(clean), + pending: pending.map(clean), + failures: failures.map(clean), + passes: passes.map(clean) + }; + + runner.testResults = obj; + + var json = JSON.stringify(obj, null, 2); + if (output) { + try { + fs.mkdirSync(path.dirname(output), {recursive: true}); + fs.writeFileSync(output, json); + } catch (err) { + console.error( + `${Base.symbols.err} [mocha] writing output to "${output}" failed: ${err.message}\n` + ); + process.stdout.write(json); + } + } else { + process.stdout.write(json); + } + }); + } + + /** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @private + * @param {Object} test + * @return {Object} + */ + function clean(test) { + var err = test.err || {}; + if (err instanceof Error) { + err = errorJSON(err); + } + + return { + title: test.title, + fullTitle: test.fullTitle(), + file: test.file, + duration: test.duration, + currentRetry: test.currentRetry(), + speed: test.speed, + err: cleanCycles(err) + }; + } + + /** + * Replaces any circular references inside `obj` with '[object Object]' + * + * @private + * @param {Object} obj + * @return {Object} + */ + function cleanCycles(obj) { + var cache = []; + return JSON.parse( + JSON.stringify(obj, function (key, value) { + if (typeof value === 'object' && value !== null) { + if (cache.indexOf(value) !== -1) { + // Instead of going in a circle, we'll print [object Object] + return '' + value; + } + cache.push(value); + } + + return value; + }) + ); + } + + /** + * Transform an Error object into a JSON object. + * + * @private + * @param {Error} err + * @return {Object} + */ + function errorJSON(err) { + var res = {}; + Object.getOwnPropertyNames(err).forEach(function (key) { + res[key] = err[key]; + }, err); + return res; + } + + JSONReporter.description = 'single JSON object'; + }(json)); + + var html = {exports: {}}; + + /** + @module browser/Progress + */ + + /** + * Expose `Progress`. + */ + + var progress$1 = Progress; + + /** + * Initialize a new `Progress` indicator. + */ + function Progress() { + this.percent = 0; + this.size(0); + this.fontSize(11); + this.font('helvetica, arial, sans-serif'); + } + + /** + * Set progress size to `size`. + * + * @public + * @param {number} size + * @return {Progress} Progress instance. + */ + Progress.prototype.size = function (size) { + this._size = size; + return this; + }; + + /** + * Set text to `text`. + * + * @public + * @param {string} text + * @return {Progress} Progress instance. + */ + Progress.prototype.text = function (text) { + this._text = text; + return this; + }; + + /** + * Set font size to `size`. + * + * @public + * @param {number} size + * @return {Progress} Progress instance. + */ + Progress.prototype.fontSize = function (size) { + this._fontSize = size; + return this; + }; + + /** + * Set font to `family`. + * + * @param {string} family + * @return {Progress} Progress instance. + */ + Progress.prototype.font = function (family) { + this._font = family; + return this; + }; + + /** + * Update percentage to `n`. + * + * @param {number} n + * @return {Progress} Progress instance. + */ + Progress.prototype.update = function (n) { + this.percent = n; + return this; + }; + + /** + * Draw on `ctx`. + * + * @param {CanvasRenderingContext2d} ctx + * @return {Progress} Progress instance. + */ + Progress.prototype.draw = function (ctx) { + try { + var percent = Math.min(this.percent, 100); + var size = this._size; + var half = size / 2; + var x = half; + var y = half; + var rad = half - 1; + var fontSize = this._fontSize; + + ctx.font = fontSize + 'px ' + this._font; + + var angle = Math.PI * 2 * (percent / 100); + ctx.clearRect(0, 0, size, size); + + // outer circle + ctx.strokeStyle = '#9f9f9f'; + ctx.beginPath(); + ctx.arc(x, y, rad, 0, angle, false); + ctx.stroke(); + + // inner circle + ctx.strokeStyle = '#eee'; + ctx.beginPath(); + ctx.arc(x, y, rad - 1, 0, angle, true); + ctx.stroke(); + + // text + var text = this._text || (percent | 0) + '%'; + var w = ctx.measureText(text).width; + + ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1); + } catch (ignore) { + // don't fail if we can't render progress + } + return this; + }; + + (function (module, exports) { + + /* eslint-env browser */ + /** + * @module HTML + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var Progress = progress$1; + var escapeRe = escapeStringRegexp; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var escape = utils.escape; + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + + var Date = commonjsGlobal.Date; + + /** + * Expose `HTML`. + */ + + module.exports = HTML; + + /** + * Stats template. + */ + + var statsTemplate = + '<ul id="mocha-stats">' + + '<li class="progress"><canvas width="40" height="40"></canvas></li>' + + '<li class="passes"><a href="javascript:void(0);">passes:</a> <em>0</em></li>' + + '<li class="failures"><a href="javascript:void(0);">failures:</a> <em>0</em></li>' + + '<li class="duration">duration: <em>0</em>s</li>' + + '</ul>'; + + var playIcon = '‣'; + + /** + * Constructs a new `HTML` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function HTML(runner, options) { + Base.call(this, runner, options); + + var self = this; + var stats = this.stats; + var stat = fragment(statsTemplate); + var items = stat.getElementsByTagName('li'); + var passes = items[1].getElementsByTagName('em')[0]; + var passesLink = items[1].getElementsByTagName('a')[0]; + var failures = items[2].getElementsByTagName('em')[0]; + var failuresLink = items[2].getElementsByTagName('a')[0]; + var duration = items[3].getElementsByTagName('em')[0]; + var canvas = stat.getElementsByTagName('canvas')[0]; + var report = fragment('<ul id="mocha-report"></ul>'); + var stack = [report]; + var progress; + var ctx; + var root = document.getElementById('mocha'); + + if (canvas.getContext) { + var ratio = window.devicePixelRatio || 1; + canvas.style.width = canvas.width; + canvas.style.height = canvas.height; + canvas.width *= ratio; + canvas.height *= ratio; + ctx = canvas.getContext('2d'); + ctx.scale(ratio, ratio); + progress = new Progress(); + } + + if (!root) { + return error('#mocha div missing, add it to your document'); + } + + // pass toggle + on(passesLink, 'click', function (evt) { + evt.preventDefault(); + unhide(); + var name = /pass/.test(report.className) ? '' : ' pass'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) { + hideSuitesWithout('test pass'); + } + }); + + // failure toggle + on(failuresLink, 'click', function (evt) { + evt.preventDefault(); + unhide(); + var name = /fail/.test(report.className) ? '' : ' fail'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) { + hideSuitesWithout('test fail'); + } + }); + + root.appendChild(stat); + root.appendChild(report); + + if (progress) { + progress.size(40); + } + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + if (suite.root) { + return; + } + + // suite + var url = self.suiteURL(suite); + var el = fragment( + '<li class="suite"><h1><a href="%s">%s</a></h1></li>', + url, + escape(suite.title) + ); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on(EVENT_SUITE_END, function (suite) { + if (suite.root) { + updateStats(); + return; + } + stack.shift(); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var url = self.testURL(test); + var markup = + '<li class="test pass %e"><h2>%e<span class="duration">%ems</span> ' + + '<a href="%s" class="replay">' + + playIcon + + '</a></h2></li>'; + var el = fragment(markup, test.speed, test.title, test.duration, url); + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + var el = fragment( + '<li class="test fail"><h2>%e <a href="%e" class="replay">' + + playIcon + + '</a></h2></li>', + test.title, + self.testURL(test) + ); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if (message === '[object Error]') { + message = test.err.message; + } + + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; + } else { + stackString = test.err.stack.slice( + test.err.message.length + indexOfMessage + ); + } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; + } + + stackString = stackString || ''; + + if (test.err.htmlMessage && stackString) { + el.appendChild( + fragment( + '<div class="html-error">%s\n<pre class="error">%e</pre></div>', + test.err.htmlMessage, + stackString + ) + ); + } else if (test.err.htmlMessage) { + el.appendChild( + fragment('<div class="html-error">%s</div>', test.err.htmlMessage) + ); + } else { + el.appendChild( + fragment('<pre class="error">%e%e</pre>', message, stackString) + ); + } + + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + var el = fragment( + '<li class="test pass pending"><h2>%e</h2></li>', + test.title + ); + appendToStack(el); + updateStats(); + }); + + function appendToStack(el) { + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) { + stack[0].appendChild(el); + } + } + + function updateStats() { + // TODO: add to stats + var percent = ((stats.tests / runner.total) * 100) | 0; + if (progress) { + progress.update(percent).draw(ctx); + } + + // update stats + var ms = new Date() - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + } + } + + /** + * Makes a URL, preserving querystring ("search") parameters. + * + * @param {string} s + * @return {string} A new URL. + */ + function makeUrl(s) { + var search = window.location.search; + + // Remove previous grep query parameter if present + if (search) { + search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); + } + + return ( + window.location.pathname + + (search ? search + '&' : '?') + + 'grep=' + + encodeURIComponent(escapeRe(s)) + ); + } + + /** + * Provide suite URL. + * + * @param {Object} [suite] + */ + HTML.prototype.suiteURL = function (suite) { + return makeUrl(suite.fullTitle()); + }; + + /** + * Provide test URL. + * + * @param {Object} [test] + */ + HTML.prototype.testURL = function (test) { + return makeUrl(test.fullTitle()); + }; + + /** + * Adds code toggle functionality for the provided test's list element. + * + * @param {HTMLLIElement} el + * @param {string} contents + */ + HTML.prototype.addCodeToggle = function (el, contents) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function () { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; + }); + + var pre = fragment('<pre><code>%e</code></pre>', utils.clean(contents)); + el.appendChild(pre); + pre.style.display = 'none'; + }; + + /** + * Display error `msg`. + * + * @param {string} msg + */ + function error(msg) { + document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg)); + } + + /** + * Return a DOM fragment from `html`. + * + * @param {string} html + */ + function fragment(html) { + var args = arguments; + var div = document.createElement('div'); + var i = 1; + + div.innerHTML = html.replace(/%([se])/g, function (_, type) { + switch (type) { + case 's': + return String(args[i++]); + case 'e': + return escape(args[i++]); + // no default + } + }); + + return div.firstChild; + } + + /** + * Check for suites that do not have elements + * with `classname`, and hide them. + * + * @param {text} classname + */ + function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (!els.length) { + suites[i].className += ' hidden'; + } + } + } + + /** + * Unhide .hidden suites. + */ + function unhide() { + var els = document.getElementsByClassName('suite hidden'); + while (els.length > 0) { + els[0].className = els[0].className.replace('suite hidden', 'suite'); + } + } + + /** + * Set an element's text contents. + * + * @param {HTMLElement} el + * @param {string} contents + */ + function text(el, contents) { + if (el.textContent) { + el.textContent = contents; + } else { + el.innerText = contents; + } + } + + /** + * Listen on `event` with callback `fn`. + */ + function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } + } + + HTML.browserOnly = true; + }(html)); + + var list = {exports: {}}; + + (function (module, exports) { + /** + * @module List + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_BEGIN = constants.EVENT_TEST_BEGIN; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var color = Base.color; + var cursor = Base.cursor; + + /** + * Expose `List`. + */ + + module.exports = List; + + /** + * Constructs a new `List` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function List(runner, options) { + Base.call(this, runner, options); + + var self = this; + var n = 0; + + runner.on(EVENT_RUN_BEGIN, function () { + Base.consoleLog(); + }); + + runner.on(EVENT_TEST_BEGIN, function (test) { + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + var fmt = color('checkmark', ' -') + color('pending', ' %s'); + Base.consoleLog(fmt, test.fullTitle()); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var fmt = + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + Base.consoleLog(fmt, test.fullTitle(), test.duration); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + cursor.CR(); + Base.consoleLog(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.once(EVENT_RUN_END, self.epilogue.bind(self)); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(List, Base); + + List.description = 'like "spec" reporter but flat'; + }(list)); + + var min = {exports: {}}; + + (function (module, exports) { + /** + * @module Min + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + + /** + * Expose `Min`. + */ + + module.exports = Min; + + /** + * Constructs a new `Min` reporter instance. + * + * @description + * This minimal test reporter is best used with '--watch'. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Min(runner, options) { + Base.call(this, runner, options); + + runner.on(EVENT_RUN_BEGIN, function () { + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.once(EVENT_RUN_END, this.epilogue.bind(this)); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Min, Base); + + Min.description = 'essentially just a summary'; + }(min)); + + var spec = {exports: {}}; + + (function (module, exports) { + /** + * @module Spec + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var inherits = utils$3.inherits; + var color = Base.color; + + /** + * Expose `Spec`. + */ + + module.exports = Spec; + + /** + * Constructs a new `Spec` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Spec(runner, options) { + Base.call(this, runner, options); + + var self = this; + var indents = 0; + var n = 0; + + function indent() { + return Array(indents).join(' '); + } + + runner.on(EVENT_RUN_BEGIN, function () { + Base.consoleLog(); + }); + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + ++indents; + Base.consoleLog(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on(EVENT_SUITE_END, function () { + --indents; + if (indents === 1) { + Base.consoleLog(); + } + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + var fmt = indent() + color('pending', ' - %s'); + Base.consoleLog(fmt, test.title); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var fmt; + if (test.speed === 'fast') { + fmt = + indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s'); + Base.consoleLog(fmt, test.title); + } else { + fmt = + indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s') + + color(test.speed, ' (%dms)'); + Base.consoleLog(fmt, test.title, test.duration); + } + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + Base.consoleLog(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.once(EVENT_RUN_END, self.epilogue.bind(self)); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Spec, Base); + + Spec.description = 'hierarchical & verbose [default]'; + }(spec)); + + var nyan = {exports: {}}; + + (function (module, exports) { + /** + * @module Nyan + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var inherits = utils$3.inherits; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + + /** + * Expose `Dot`. + */ + + module.exports = NyanCat; + + /** + * Constructs a new `Nyan` reporter instance. + * + * @public + * @class Nyan + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function NyanCat(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.75) | 0; + var nyanCatWidth = (this.nyanCatWidth = 11); + + this.colorIndex = 0; + this.numberOfLines = 4; + this.rainbowColors = self.generateColors(); + this.scoreboardWidth = 5; + this.tick = 0; + this.trajectories = [[], [], [], []]; + this.trajectoryWidthMax = width - nyanCatWidth; + + runner.on(EVENT_RUN_BEGIN, function () { + Base.cursor.hide(); + self.draw(); + }); + + runner.on(EVENT_TEST_PENDING, function () { + self.draw(); + }); + + runner.on(EVENT_TEST_PASS, function () { + self.draw(); + }); + + runner.on(EVENT_TEST_FAIL, function () { + self.draw(); + }); + + runner.once(EVENT_RUN_END, function () { + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) { + write('\n'); + } + self.epilogue(); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(NyanCat, Base); + + /** + * Draw the nyan cat + * + * @private + */ + + NyanCat.prototype.draw = function () { + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(); + this.tick = !this.tick; + }; + + /** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @private + */ + + NyanCat.prototype.drawScoreboard = function () { + var stats = this.stats; + + function draw(type, n) { + write(' '); + write(Base.color(type, n)); + write('\n'); + } + + draw('green', stats.passes); + draw('fail', stats.failures); + draw('pending', stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); + }; + + /** + * Append the rainbow. + * + * @private + */ + + NyanCat.prototype.appendRainbow = function () { + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) { + trajectory.shift(); + } + trajectory.push(rainbowified); + } + }; + + /** + * Draw the rainbow. + * + * @private + */ + + NyanCat.prototype.drawRainbow = function () { + var self = this; + + this.trajectories.forEach(function (line) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); + }; + + /** + * Draw the nyan cat + * + * @private + */ + NyanCat.prototype.drawNyanCat = function () { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var dist = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(dist); + write('_,------,'); + write('\n'); + + write(dist); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(dist); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + write(tail + '|' + padding + this.face() + ' '); + write('\n'); + + write(dist); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); + }; + + /** + * Draw nyan cat face. + * + * @private + * @return {string} + */ + + NyanCat.prototype.face = function () { + var stats = this.stats; + if (stats.failures) { + return '( x .x)'; + } else if (stats.pending) { + return '( o .o)'; + } else if (stats.passes) { + return '( ^ .^)'; + } + return '( - .-)'; + }; + + /** + * Move cursor up `n`. + * + * @private + * @param {number} n + */ + + NyanCat.prototype.cursorUp = function (n) { + write('\u001b[' + n + 'A'); + }; + + /** + * Move cursor down `n`. + * + * @private + * @param {number} n + */ + + NyanCat.prototype.cursorDown = function (n) { + write('\u001b[' + n + 'B'); + }; + + /** + * Generate rainbow colors. + * + * @private + * @return {Array} + */ + NyanCat.prototype.generateColors = function () { + var colors = []; + + for (var i = 0; i < 6 * 7; i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = i * (1.0 / 6); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; + }; + + /** + * Apply rainbow to the given `str`. + * + * @private + * @param {string} str + * @return {string} + */ + NyanCat.prototype.rainbowify = function (str) { + if (!Base.useColors) { return str; } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; + }; + + /** + * Stdout helper. + * + * @param {string} string A message to write to stdout. + */ + function write(string) { + process.stdout.write(string); + } + + NyanCat.description = '"nyan cat"'; + }(nyan)); + + var xunit = {exports: {}}; + + (function (module, exports) { + /** + * @module XUnit + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var fs = require$$2; + var path = require$$1; + var errors = errors$2; + var createUnsupportedError = errors.createUnsupportedError; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var STATE_FAILED = runnable.constants.STATE_FAILED; + var inherits = utils.inherits; + var escape = utils.escape; + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + var Date = commonjsGlobal.Date; + + /** + * Expose `XUnit`. + */ + + module.exports = XUnit; + + /** + * Constructs a new `XUnit` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function XUnit(runner, options) { + Base.call(this, runner, options); + + var stats = this.stats; + var tests = []; + var self = this; + + // the name of the test suite, as it will appear in the resulting XML file + var suiteName; + + // the default name of the test suite if none is provided + var DEFAULT_SUITE_NAME = 'Mocha Tests'; + + if (options && options.reporterOptions) { + if (options.reporterOptions.output) { + if (!fs.createWriteStream) { + throw createUnsupportedError('file output not supported in browser'); + } + + fs.mkdirSync(path.dirname(options.reporterOptions.output), { + recursive: true + }); + self.fileStream = fs.createWriteStream(options.reporterOptions.output); + } + + // get the suite name from the reporter options (if provided) + suiteName = options.reporterOptions.suiteName; + } + + // fall back to the default suite name + suiteName = suiteName || DEFAULT_SUITE_NAME; + + runner.on(EVENT_TEST_PENDING, function (test) { + tests.push(test); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + tests.push(test); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + tests.push(test); + }); + + runner.once(EVENT_RUN_END, function () { + self.write( + tag( + 'testsuite', + { + name: suiteName, + tests: stats.tests, + failures: 0, + errors: stats.failures, + skipped: stats.tests - stats.failures - stats.passes, + timestamp: new Date().toUTCString(), + time: stats.duration / 1000 || 0 + }, + false + ) + ); + + tests.forEach(function (t) { + self.test(t); + }); + + self.write('</testsuite>'); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(XUnit, Base); + + /** + * Override done to close the stream (if it's a file). + * + * @param failures + * @param {Function} fn + */ + XUnit.prototype.done = function (failures, fn) { + if (this.fileStream) { + this.fileStream.end(function () { + fn(failures); + }); } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); + fn(failures); + } + }; + + /** + * Write out the given line. + * + * @param {string} line + */ + XUnit.prototype.write = function (line) { + if (this.fileStream) { + this.fileStream.write(line + '\n'); + } else if (typeof process === 'object' && process.stdout) { + process.stdout.write(line + '\n'); + } else { + Base.consoleLog(line); + } + }; + + /** + * Output tag for the given `test.` + * + * @param {Test} test + */ + XUnit.prototype.test = function (test) { + Base.useColors = false; + + var attrs = { + classname: test.parent.fullTitle(), + name: test.title, + time: test.duration / 1000 || 0 + }; + + if (test.state === STATE_FAILED) { + var err = test.err; + var diff = + !Base.hideDiff && Base.showDiff(err) + ? '\n' + Base.generateDiff(err.actual, err.expected) + : ''; + this.write( + tag( + 'testcase', + attrs, + false, + tag( + 'failure', + {}, + false, + escape(err.message) + escape(diff) + '\n' + escape(err.stack) + ) + ) + ); + } else if (test.isPending()) { + this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + this.write(tag('testcase', attrs, true)); + } + }; + + /** + * HTML tag helper. + * + * @param name + * @param attrs + * @param close + * @param content + * @return {string} + */ + function tag(name, attrs, close, content) { + var end = close ? '/>' : '>'; + var pairs = []; + var tag; + + for (var key in attrs) { + if (Object.prototype.hasOwnProperty.call(attrs, key)) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) { + tag += content + '</' + name + end; + } + return tag; + } + + XUnit.description = 'XUnit-compatible XML output'; + }(xunit)); + + var markdown = {exports: {}}; + + (function (module, exports) { + /** + * @module Markdown + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var constants = runner.constants; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + + /** + * Constants + */ + + var SUITE_PREFIX = '$'; + + /** + * Expose `Markdown`. + */ + + module.exports = Markdown; + + /** + * Constructs a new `Markdown` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Markdown(runner, options) { + Base.call(this, runner, options); + + var level = 0; + var buf = ''; + + function title(str) { + return Array(level).join('#') + ' ' + str; + } + + function mapTOC(suite, obj) { + var ret = obj; + var key = SUITE_PREFIX + suite.title; + + obj = obj[key] = obj[key] || {suite: suite}; + suite.suites.forEach(function (suite) { + mapTOC(suite, obj); + }); + + return ret; + } + + function stringifyTOC(obj, level) { + ++level; + var buf = ''; + var link; + for (var key in obj) { + if (key === 'suite') { + continue; + } + if (key !== SUITE_PREFIX) { + link = ' - [' + key.substring(1) + ']'; + link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; + buf += Array(level).join(' ') + link; + } + buf += stringifyTOC(obj[key], level); + } + return buf; + } + + function generateTOC(suite) { + var obj = mapTOC(suite, {}); + return stringifyTOC(obj, 0); + } + + generateTOC(runner.suite); + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + ++level; + var slug = utils.slug(suite.fullTitle()); + buf += '<a name="' + slug + '"></a>' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on(EVENT_SUITE_END, function () { + --level; + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var code = utils.clean(test.body); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.once(EVENT_RUN_END, function () { + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); + } + + Markdown.description = 'GitHub Flavored Markdown'; + }(markdown)); + + var progress = {exports: {}}; + + (function (module, exports) { + /** + * @module Progress + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var inherits = utils$3.inherits; + var color = Base.color; + var cursor = Base.cursor; + + /** + * Expose `Progress`. + */ + + module.exports = Progress; + + /** + * General progress bar color. + */ + + Base.colors.progress = 90; + + /** + * Constructs a new `Progress` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Progress(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.5) | 0; + var total = runner.total; + var complete = 0; + var lastN = -1; + + // default chars + options = options || {}; + var reporterOptions = options.reporterOptions || {}; + + options.open = reporterOptions.open || '['; + options.complete = reporterOptions.complete || '▬'; + options.incomplete = reporterOptions.incomplete || Base.symbols.dot; + options.close = reporterOptions.close || ']'; + options.verbose = reporterOptions.verbose || false; + + // tests started + runner.on(EVENT_RUN_BEGIN, function () { + process.stdout.write('\n'); + cursor.hide(); + }); + + // tests complete + runner.on(EVENT_TEST_END, function () { + complete++; + + var percent = complete / total; + var n = (width * percent) | 0; + var i = width - n; + + if (n === lastN && !options.verbose) { + // Don't re-render the line if it hasn't changed + return; + } + lastN = n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.once(EVENT_RUN_END, function () { + cursor.show(); + process.stdout.write('\n'); + self.epilogue(); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Progress, Base); + + Progress.description = 'a progress bar'; + }(progress)); + + var landing = {exports: {}}; + + (function (module, exports) { + /** + * @module Landing + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var STATE_FAILED = runnable.constants.STATE_FAILED; + + var cursor = Base.cursor; + var color = Base.color; + + /** + * Expose `Landing`. + */ + + module.exports = Landing; + + /** + * Airplane color. + */ + + Base.colors.plane = 0; + + /** + * Airplane crash color. + */ + + Base.colors['plane crash'] = 31; + + /** + * Runway color. + */ + + Base.colors.runway = 90; + + /** + * Constructs a new `Landing` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Landing(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.75) | 0; + var stream = process.stdout; + + var plane = color('plane', '✈'); + var crashed = -1; + var n = 0; + var total = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on(EVENT_RUN_BEGIN, function () { + stream.write('\n\n\n '); + cursor.hide(); + }); + + runner.on(EVENT_TEST_END, function (test) { + // check if the plane crashed + var col = crashed === -1 ? ((width * ++n) / ++total) | 0 : crashed; + // show the crash + if (test.state === STATE_FAILED) { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane); + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.once(EVENT_RUN_END, function () { + cursor.show(); + process.stdout.write('\n'); + self.epilogue(); + }); + + // if cursor is hidden when we ctrl-C, then it will remain hidden unless... + process.once('SIGINT', function () { + cursor.show(); + nextTick$1(function () { + process.kill(process.pid, 'SIGINT'); + }); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Landing, Base); + + Landing.description = 'Unicode landing strip'; + }(landing)); + + var jsonStream = {exports: {}}; + + (function (module, exports) { + /** + * @module JSONStream + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + + /** + * Expose `JSONStream`. + */ + + module.exports = JSONStream; + + /** + * Constructs a new `JSONStream` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function JSONStream(runner, options) { + Base.call(this, runner, options); + + var self = this; + var total = runner.total; + + runner.once(EVENT_RUN_BEGIN, function () { + writeEvent(['start', {total: total}]); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + writeEvent(['pass', clean(test)]); + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + test = clean(test); + test.err = err.message; + test.stack = err.stack || null; + writeEvent(['fail', test]); + }); + + runner.once(EVENT_RUN_END, function () { + writeEvent(['end', self.stats]); + }); + } + + /** + * Mocha event to be written to the output stream. + * @typedef {Array} JSONStream~MochaEvent + */ + + /** + * Writes Mocha event to reporter output stream. + * + * @private + * @param {JSONStream~MochaEvent} event - Mocha event to be output. + */ + function writeEvent(event) { + process.stdout.write(JSON.stringify(event) + '\n'); + } + + /** + * Returns an object literal representation of `test` + * free of cyclic properties, etc. + * + * @private + * @param {Test} test - Instance used as data source. + * @return {Object} object containing pared-down test instance data + */ + function clean(test) { + return { + title: test.title, + fullTitle: test.fullTitle(), + file: test.file, + duration: test.duration, + currentRetry: test.currentRetry(), + speed: test.speed + }; + } + + JSONStream.description = 'newline delimited JSON events'; + }(jsonStream)); + + (function (exports) { + + // Alias exports to a their normalized format Mocha#reporter to prevent a need + // for dynamic (try/catch) requires, which Browserify doesn't handle. + exports.Base = exports.base = base$1.exports; + exports.Dot = exports.dot = dot.exports; + exports.Doc = exports.doc = doc.exports; + exports.TAP = exports.tap = tap.exports; + exports.JSON = exports.json = json.exports; + exports.HTML = exports.html = html.exports; + exports.List = exports.list = list.exports; + exports.Min = exports.min = min.exports; + exports.Spec = exports.spec = spec.exports; + exports.Nyan = exports.nyan = nyan.exports; + exports.XUnit = exports.xunit = xunit.exports; + exports.Markdown = exports.markdown = markdown.exports; + exports.Progress = exports.progress = progress.exports; + exports.Landing = exports.landing = landing.exports; + exports.JSONStream = exports['json-stream'] = jsonStream.exports; + }(reporters)); + + var diff = true; + var extension = [ + "js", + "cjs", + "mjs" + ]; + var reporter = "spec"; + var slow = 75; + var timeout = 2000; + var ui = "bdd"; + var require$$4 = { + diff: diff, + extension: extension, + "package": "./package.json", + reporter: reporter, + slow: slow, + timeout: timeout, + ui: ui, + "watch-ignore": [ + "node_modules", + ".git" + ] + }; + + /** + * Provides a factory function for a {@link StatsCollector} object. + * @module + */ + + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_END = constants.EVENT_TEST_END; + + /** + * Test statistics collector. + * + * @public + * @typedef {Object} StatsCollector + * @property {number} suites - integer count of suites run. + * @property {number} tests - integer count of tests run. + * @property {number} passes - integer count of passing tests. + * @property {number} pending - integer count of pending tests. + * @property {number} failures - integer count of failed tests. + * @property {Date} start - time when testing began. + * @property {Date} end - time when testing concluded. + * @property {number} duration - number of msecs that testing took. + */ + + var Date$2 = commonjsGlobal.Date; + + /** + * Provides stats such as test duration, number of tests passed / failed etc., by listening for events emitted by `runner`. + * + * @private + * @param {Runner} runner - Runner instance + * @throws {TypeError} If falsy `runner` + */ + function createStatsCollector(runner) { + /** + * @type StatsCollector + */ + var stats = { + suites: 0, + tests: 0, + passes: 0, + pending: 0, + failures: 0 + }; + + if (!runner) { + throw new TypeError('Missing runner argument'); + } + + runner.stats = stats; + + runner.once(EVENT_RUN_BEGIN, function () { + stats.start = new Date$2(); + }); + runner.on(EVENT_SUITE_BEGIN, function (suite) { + suite.root || stats.suites++; + }); + runner.on(EVENT_TEST_PASS, function () { + stats.passes++; + }); + runner.on(EVENT_TEST_FAIL, function () { + stats.failures++; + }); + runner.on(EVENT_TEST_PENDING, function () { + stats.pending++; + }); + runner.on(EVENT_TEST_END, function () { + stats.tests++; + }); + runner.once(EVENT_RUN_END, function () { + stats.end = new Date$2(); + stats.duration = stats.end - stats.start; + }); + } + + var statsCollector = createStatsCollector; + + var interfaces = {}; + + var bdd = {exports: {}}; + + var Runnable = runnable; + var utils = utils$3; + var errors$1 = errors$2; + var createInvalidArgumentTypeError = errors$1.createInvalidArgumentTypeError; + var isString = utils.isString; + + const {MOCHA_ID_PROP_NAME} = utils.constants; + + var test = Test$4; + + /** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @public + * @class + * @extends Runnable + * @param {String} title - Test title (required) + * @param {Function} [fn] - Test callback. If omitted, the Test is considered "pending" + */ + function Test$4(title, fn) { + if (!isString(title)) { + throw createInvalidArgumentTypeError( + 'Test argument "title" should be a string. Received type "' + + typeof title + + '"', + 'title', + 'string' + ); + } + this.type = 'test'; + Runnable.call(this, title, fn); + this.reset(); + } + + /** + * Inherit from `Runnable.prototype`. + */ + utils.inherits(Test$4, Runnable); + + /** + * Resets the state initially or for a next run. + */ + Test$4.prototype.reset = function () { + Runnable.prototype.reset.call(this); + this.pending = !this.fn; + delete this.state; + }; + + /** + * Set or get retried test + * + * @private + */ + Test$4.prototype.retriedTest = function (n) { + if (!arguments.length) { + return this._retriedTest; + } + this._retriedTest = n; + }; + + /** + * Add test to the list of tests marked `only`. + * + * @private + */ + Test$4.prototype.markOnly = function () { + this.parent.appendOnlyTest(this); + }; + + Test$4.prototype.clone = function () { + var test = new Test$4(this.title, this.fn); + test.timeout(this.timeout()); + test.slow(this.slow()); + test.retries(this.retries()); + test.currentRetry(this.currentRetry()); + test.retriedTest(this.retriedTest() || this); + test.globals(this.globals()); + test.parent = this.parent; + test.file = this.file; + test.ctx = this.ctx; + return test; + }; + + /** + * Returns an minimal object suitable for transmission over IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ + Test$4.prototype.serialize = function serialize() { + return { + $$currentRetry: this._currentRetry, + $$fullTitle: this.fullTitle(), + $$isPending: Boolean(this.pending), + $$retriedTest: this._retriedTest || null, + $$slow: this._slow, + $$titlePath: this.titlePath(), + body: this.body, + duration: this.duration, + err: this.err, + parent: { + $$fullTitle: this.parent.fullTitle(), + [MOCHA_ID_PROP_NAME]: this.parent.id + }, + speed: this.speed, + state: this.state, + title: this.title, + type: this.type, + file: this.file, + [MOCHA_ID_PROP_NAME]: this.id + }; + }; + + /** + @module interfaces/common + */ + + var Suite$1 = suite.exports; + var errors = errors$2; + var createMissingArgumentError = errors.createMissingArgumentError; + var createUnsupportedError = errors.createUnsupportedError; + var createForbiddenExclusivityError = errors.createForbiddenExclusivityError; + + /** + * Functions common to more than one interface. + * + * @private + * @param {Suite[]} suites + * @param {Context} context + * @param {Mocha} mocha + * @return {Object} An object containing common functions. + */ + var common = function (suites, context, mocha) { + /** + * Check if the suite should be tested. + * + * @private + * @param {Suite} suite - suite to check + * @returns {boolean} + */ + function shouldBeTested(suite) { + return ( + !mocha.options.grep || + (mocha.options.grep && + mocha.options.grep.test(suite.fullTitle()) && + !mocha.options.invert) + ); + } + + return { + /** + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. + * + * @param {Suite} suite The root suite. + * @return {Function} A function which runs the root suite + */ + runWithSuite: function runWithSuite(suite) { + return function run() { + suite.run(); + }; + }, + + /** + * Execute before running tests. + * + * @param {string} name + * @param {Function} fn + */ + before: function (name, fn) { + suites[0].beforeAll(name, fn); + }, + + /** + * Execute after running tests. + * + * @param {string} name + * @param {Function} fn + */ + after: function (name, fn) { + suites[0].afterAll(name, fn); + }, + + /** + * Execute before each test case. + * + * @param {string} name + * @param {Function} fn + */ + beforeEach: function (name, fn) { + suites[0].beforeEach(name, fn); + }, + + /** + * Execute after each test case. + * + * @param {string} name + * @param {Function} fn + */ + afterEach: function (name, fn) { + suites[0].afterEach(name, fn); + }, + + suite: { + /** + * Create an exclusive Suite; convenience function + * See docstring for create() below. + * + * @param {Object} opts + * @returns {Suite} + */ + only: function only(opts) { + if (mocha.options.forbidOnly) { + throw createForbiddenExclusivityError(mocha); + } + opts.isOnly = true; + return this.create(opts); + }, + + /** + * Create a Suite, but skip it; convenience function + * See docstring for create() below. + * + * @param {Object} opts + * @returns {Suite} + */ + skip: function skip(opts) { + opts.pending = true; + return this.create(opts); + }, + + /** + * Creates a suite. + * + * @param {Object} opts Options + * @param {string} opts.title Title of Suite + * @param {Function} [opts.fn] Suite Function (not always applicable) + * @param {boolean} [opts.pending] Is Suite pending? + * @param {string} [opts.file] Filepath where this Suite resides + * @param {boolean} [opts.isOnly] Is Suite exclusive? + * @returns {Suite} + */ + create: function create(opts) { + var suite = Suite$1.create(suites[0], opts.title); + suite.pending = Boolean(opts.pending); + suite.file = opts.file; + suites.unshift(suite); + if (opts.isOnly) { + suite.markOnly(); + } + if ( + suite.pending && + mocha.options.forbidPending && + shouldBeTested(suite) + ) { + throw createUnsupportedError('Pending test forbidden'); + } + if (typeof opts.fn === 'function') { + opts.fn.call(suite); + suites.shift(); + } else if (typeof opts.fn === 'undefined' && !suite.pending) { + throw createMissingArgumentError( + 'Suite "' + + suite.fullTitle() + + '" was defined but no callback was supplied. ' + + 'Supply a callback or explicitly skip the suite.', + 'callback', + 'function' + ); + } else if (!opts.fn && suite.pending) { + suites.shift(); + } + + return suite; + } + }, + + test: { + /** + * Exclusive test-case. + * + * @param {Object} mocha + * @param {Function} test + * @returns {*} + */ + only: function (mocha, test) { + if (mocha.options.forbidOnly) { + throw createForbiddenExclusivityError(mocha); + } + test.markOnly(); + return test; + }, + + /** + * Pending test case. + * + * @param {string} title + */ + skip: function (title) { + context.test(title); + } + } + }; + }; + + var Test$3 = test; + var EVENT_FILE_PRE_REQUIRE$2 = + suite.exports.constants.EVENT_FILE_PRE_REQUIRE; + + /** + * BDD-style interface: + * + * describe('Array', function() { + * describe('#indexOf()', function() { + * it('should return -1 when not present', function() { + * // ... + * }); + * + * it('should return the index when present', function() { + * // ... + * }); + * }); + * }); + * + * @param {Suite} suite Root suite. + */ + bdd.exports = function bddInterface(suite) { + var suites = [suite]; + + suite.on(EVENT_FILE_PRE_REQUIRE$2, function (context, file, mocha) { + var common$1 = common(suites, context, mocha); + + context.before = common$1.before; + context.after = common$1.after; + context.beforeEach = common$1.beforeEach; + context.afterEach = common$1.afterEach; + context.run = mocha.options.delay && common$1.runWithSuite(suite); + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.describe = context.context = function (title, fn) { + return common$1.suite.create({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Pending describe. + */ + + context.xdescribe = + context.xcontext = + context.describe.skip = + function (title, fn) { + return common$1.suite.skip({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Exclusive suite. + */ + + context.describe.only = function (title, fn) { + return common$1.suite.only({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.it = context.specify = function (title, fn) { + var suite = suites[0]; + if (suite.isPending()) { + fn = null; + } + var test = new Test$3(title, fn); + test.file = file; + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.it.only = function (title, fn) { + return common$1.test.only(mocha, context.it(title, fn)); + }; + + /** + * Pending test case. + */ + + context.xit = + context.xspecify = + context.it.skip = + function (title) { + return context.it(title); + }; + }); + }; + + bdd.exports.description = 'BDD or RSpec style [default]'; + + var tdd = {exports: {}}; + + var Test$2 = test; + var EVENT_FILE_PRE_REQUIRE$1 = + suite.exports.constants.EVENT_FILE_PRE_REQUIRE; + + /** + * TDD-style interface: + * + * suite('Array', function() { + * suite('#indexOf()', function() { + * suiteSetup(function() { + * + * }); + * + * test('should return -1 when not present', function() { + * + * }); + * + * test('should return the index when present', function() { + * + * }); + * + * suiteTeardown(function() { + * + * }); + * }); + * }); + * + * @param {Suite} suite Root suite. + */ + tdd.exports = function (suite) { + var suites = [suite]; + + suite.on(EVENT_FILE_PRE_REQUIRE$1, function (context, file, mocha) { + var common$1 = common(suites, context, mocha); + + context.setup = common$1.beforeEach; + context.teardown = common$1.afterEach; + context.suiteSetup = common$1.before; + context.suiteTeardown = common$1.after; + context.run = mocha.options.delay && common$1.runWithSuite(suite); + + /** + * Describe a "suite" with the given `title` and callback `fn` containing + * nested suites and/or tests. + */ + context.suite = function (title, fn) { + return common$1.suite.create({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Pending suite. + */ + context.suite.skip = function (title, fn) { + return common$1.suite.skip({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Exclusive test-case. + */ + context.suite.only = function (title, fn) { + return common$1.suite.only({ + title: title, + file: file, + fn: fn + }); + }; + + /** + * Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. + */ + context.test = function (title, fn) { + var suite = suites[0]; + if (suite.isPending()) { + fn = null; + } + var test = new Test$2(title, fn); + test.file = file; + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function (title, fn) { + return common$1.test.only(mocha, context.test(title, fn)); + }; + + context.test.skip = common$1.test.skip; + }); + }; + + tdd.exports.description = + 'traditional "suite"/"test" instead of BDD\'s "describe"/"it"'; + + var qunit = {exports: {}}; + + var Test$1 = test; + var EVENT_FILE_PRE_REQUIRE = + suite.exports.constants.EVENT_FILE_PRE_REQUIRE; + + /** + * QUnit-style interface: + * + * suite('Array'); + * + * test('#length', function() { + * var arr = [1,2,3]; + * ok(arr.length == 3); + * }); + * + * test('#indexOf()', function() { + * var arr = [1,2,3]; + * ok(arr.indexOf(1) == 0); + * ok(arr.indexOf(2) == 1); + * ok(arr.indexOf(3) == 2); + * }); + * + * suite('String'); + * + * test('#length', function() { + * ok('foo'.length == 3); + * }); + * + * @param {Suite} suite Root suite. + */ + qunit.exports = function qUnitInterface(suite) { + var suites = [suite]; + + suite.on(EVENT_FILE_PRE_REQUIRE, function (context, file, mocha) { + var common$1 = common(suites, context, mocha); + + context.before = common$1.before; + context.after = common$1.after; + context.beforeEach = common$1.beforeEach; + context.afterEach = common$1.afterEach; + context.run = mocha.options.delay && common$1.runWithSuite(suite); + /** + * Describe a "suite" with the given `title`. + */ + + context.suite = function (title) { + if (suites.length > 1) { + suites.shift(); + } + return common$1.suite.create({ + title: title, + file: file, + fn: false + }); + }; + + /** + * Exclusive Suite. + */ + + context.suite.only = function (title) { + if (suites.length > 1) { + suites.shift(); + } + return common$1.suite.only({ + title: title, + file: file, + fn: false + }); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function (title, fn) { + var test = new Test$1(title, fn); + test.file = file; + suites[0].addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function (title, fn) { + return common$1.test.only(mocha, context.test(title, fn)); + }; + + context.test.skip = common$1.test.skip; + }); + }; + + qunit.exports.description = 'QUnit style'; + + var exports$1 = {exports: {}}; + + var Suite = suite.exports; + var Test = test; + + /** + * Exports-style (as Node.js module) interface: + * + * exports.Array = { + * '#indexOf()': { + * 'should return -1 when the value is not present': function() { + * + * }, + * + * 'should return the correct index when the value is present': function() { + * + * } + * } + * }; + * + * @param {Suite} suite Root suite. + */ + exports$1.exports = function (suite) { + var suites = [suite]; + + suite.on(Suite.constants.EVENT_FILE_REQUIRE, visit); + + function visit(obj, file) { + var suite; + for (var key in obj) { + if (typeof obj[key] === 'function') { + var fn = obj[key]; + switch (key) { + case 'before': + suites[0].beforeAll(fn); + break; + case 'after': + suites[0].afterAll(fn); + break; + case 'beforeEach': + suites[0].beforeEach(fn); + break; + case 'afterEach': + suites[0].afterEach(fn); + break; + default: + var test = new Test(key, fn); + test.file = file; + suites[0].addTest(test); + } + } else { + suite = Suite.create(suites[0], key); + suites.unshift(suite); + visit(obj[key], file); + suites.shift(); + } + } + } + }; + + exports$1.exports.description = 'Node.js module ("exports") style'; + + interfaces.bdd = bdd.exports; + interfaces.tdd = tdd.exports; + interfaces.qunit = qunit.exports; + interfaces.exports = exports$1.exports; + + /** + * @module Context + */ + /** + * Expose `Context`. + */ + + var context = Context; + + /** + * Initialize a new `Context`. + * + * @private + */ + function Context() {} + + /** + * Set or get the context `Runnable` to `runnable`. + * + * @private + * @param {Runnable} runnable + * @return {Context} context + */ + Context.prototype.runnable = function (runnable) { + if (!arguments.length) { + return this._runnable; + } + this.test = this._runnable = runnable; + return this; + }; + + /** + * Set or get test timeout `ms`. + * + * @private + * @param {number} ms + * @return {Context} self + */ + Context.prototype.timeout = function (ms) { + if (!arguments.length) { + return this.runnable().timeout(); + } + this.runnable().timeout(ms); + return this; + }; + + /** + * Set or get test slowness threshold `ms`. + * + * @private + * @param {number} ms + * @return {Context} self + */ + Context.prototype.slow = function (ms) { + if (!arguments.length) { + return this.runnable().slow(); + } + this.runnable().slow(ms); + return this; + }; + + /** + * Mark a test as skipped. + * + * @private + * @throws Pending + */ + Context.prototype.skip = function () { + this.runnable().skip(); + }; + + /** + * Set or get a number of allowed retries on failed tests + * + * @private + * @param {number} n + * @return {Context} self + */ + Context.prototype.retries = function (n) { + if (!arguments.length) { + return this.runnable().retries(); + } + this.runnable().retries(n); + return this; + }; + + var name = "mocha"; + var version = "10.0.0"; + var homepage = "https://mochajs.org/"; + var notifyLogo = "https://ibin.co/4QuRuGjXvl36.png"; + var require$$17 = { + name: name, + version: version, + homepage: homepage, + notifyLogo: notifyLogo + }; + + (function (module, exports) { + + /*! + * mocha + * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca> + * MIT Licensed + */ + + var escapeRe = escapeStringRegexp; + var path = require$$1; + var builtinReporters = reporters; + var utils = utils$3; + var mocharc = require$$4; + var Suite = suite.exports; + var esmUtils = require$$18; + var createStatsCollector = statsCollector; + const { + createInvalidReporterError, + createInvalidInterfaceError, + createMochaInstanceAlreadyDisposedError, + createMochaInstanceAlreadyRunningError, + createUnsupportedError + } = errors$2; + const {EVENT_FILE_PRE_REQUIRE, EVENT_FILE_POST_REQUIRE, EVENT_FILE_REQUIRE} = + Suite.constants; + var debug = browser.exports('mocha:mocha'); + + exports = module.exports = Mocha; + + /** + * A Mocha instance is a finite state machine. + * These are the states it can be in. + * @private + */ + var mochaStates = utils.defineConstants({ + /** + * Initial state of the mocha instance + * @private + */ + INIT: 'init', + /** + * Mocha instance is running tests + * @private + */ + RUNNING: 'running', + /** + * Mocha instance is done running tests and references to test functions and hooks are cleaned. + * You can reset this state by unloading the test files. + * @private + */ + REFERENCES_CLEANED: 'referencesCleaned', + /** + * Mocha instance is disposed and can no longer be used. + * @private + */ + DISPOSED: 'disposed' + }); + + /** + * To require local UIs and reporters when running in node. + */ + + if (!utils.isBrowser() && typeof module.paths !== 'undefined') { + var cwd = utils.cwd(); + module.paths.push(cwd, path.join(cwd, 'node_modules')); + } + + /** + * Expose internals. + * @private + */ + + exports.utils = utils; + exports.interfaces = interfaces; + /** + * @public + * @memberof Mocha + */ + exports.reporters = builtinReporters; + exports.Runnable = runnable; + exports.Context = context; + /** + * + * @memberof Mocha + */ + exports.Runner = runner; + exports.Suite = Suite; + exports.Hook = hook; + exports.Test = test; + + let currentContext; + exports.afterEach = function (...args) { + return (currentContext.afterEach || currentContext.teardown).apply( + this, + args + ); + }; + exports.after = function (...args) { + return (currentContext.after || currentContext.suiteTeardown).apply( + this, + args + ); + }; + exports.beforeEach = function (...args) { + return (currentContext.beforeEach || currentContext.setup).apply(this, args); + }; + exports.before = function (...args) { + return (currentContext.before || currentContext.suiteSetup).apply(this, args); + }; + exports.describe = function (...args) { + return (currentContext.describe || currentContext.suite).apply(this, args); + }; + exports.describe.only = function (...args) { + return (currentContext.describe || currentContext.suite).only.apply( + this, + args + ); + }; + exports.describe.skip = function (...args) { + return (currentContext.describe || currentContext.suite).skip.apply( + this, + args + ); + }; + exports.it = function (...args) { + return (currentContext.it || currentContext.test).apply(this, args); + }; + exports.it.only = function (...args) { + return (currentContext.it || currentContext.test).only.apply(this, args); + }; + exports.it.skip = function (...args) { + return (currentContext.it || currentContext.test).skip.apply(this, args); + }; + exports.xdescribe = exports.describe.skip; + exports.xit = exports.it.skip; + exports.setup = exports.beforeEach; + exports.suiteSetup = exports.before; + exports.suiteTeardown = exports.after; + exports.suite = exports.describe; + exports.teardown = exports.afterEach; + exports.test = exports.it; + exports.run = function (...args) { + return currentContext.run.apply(this, args); + }; + + /** + * Constructs a new Mocha instance with `options`. + * + * @public + * @class Mocha + * @param {Object} [options] - Settings object. + * @param {boolean} [options.allowUncaught] - Propagate uncaught errors? + * @param {boolean} [options.asyncOnly] - Force `done` callback or promise? + * @param {boolean} [options.bail] - Bail after first test failure? + * @param {boolean} [options.checkLeaks] - Check for global variable leaks? + * @param {boolean} [options.color] - Color TTY output from reporter? + * @param {boolean} [options.delay] - Delay root suite execution? + * @param {boolean} [options.diff] - Show diff on failure? + * @param {boolean} [options.dryRun] - Report tests without running them? + * @param {boolean} [options.failZero] - Fail test run if zero tests? + * @param {string} [options.fgrep] - Test filter given string. + * @param {boolean} [options.forbidOnly] - Tests marked `only` fail the suite? + * @param {boolean} [options.forbidPending] - Pending tests fail the suite? + * @param {boolean} [options.fullTrace] - Full stacktrace upon failure? + * @param {string[]} [options.global] - Variables expected in global scope. + * @param {RegExp|string} [options.grep] - Test filter given regular expression. + * @param {boolean} [options.inlineDiffs] - Display inline diffs? + * @param {boolean} [options.invert] - Invert test filter matches? + * @param {boolean} [options.noHighlighting] - Disable syntax highlighting? + * @param {string|constructor} [options.reporter] - Reporter name or constructor. + * @param {Object} [options.reporterOption] - Reporter settings object. + * @param {number} [options.retries] - Number of times to retry failed tests. + * @param {number} [options.slow] - Slow threshold value. + * @param {number|string} [options.timeout] - Timeout threshold value. + * @param {string} [options.ui] - Interface name. + * @param {boolean} [options.parallel] - Run jobs in parallel. + * @param {number} [options.jobs] - Max number of worker processes for parallel runs. + * @param {MochaRootHookObject} [options.rootHooks] - Hooks to bootstrap the root suite with. + * @param {string[]} [options.require] - Pathname of `rootHooks` plugin for parallel runs. + * @param {boolean} [options.isWorker] - Should be `true` if `Mocha` process is running in a worker process. + */ + function Mocha(options = {}) { + options = {...mocharc, ...options}; + this.files = []; + this.options = options; + // root suite + this.suite = new exports.Suite('', new exports.Context(), true); + this._cleanReferencesAfterRun = true; + this._state = mochaStates.INIT; + + this.grep(options.grep) + .fgrep(options.fgrep) + .ui(options.ui) + .reporter( + options.reporter, + options.reporterOption || options.reporterOptions // for backwards compatibility + ) + .slow(options.slow) + .global(options.global); + + // this guard exists because Suite#timeout does not consider `undefined` to be valid input + if (typeof options.timeout !== 'undefined') { + this.timeout(options.timeout === false ? 0 : options.timeout); + } + + if ('retries' in options) { + this.retries(options.retries); + } + + [ + 'allowUncaught', + 'asyncOnly', + 'bail', + 'checkLeaks', + 'color', + 'delay', + 'diff', + 'dryRun', + 'failZero', + 'forbidOnly', + 'forbidPending', + 'fullTrace', + 'inlineDiffs', + 'invert' + ].forEach(function (opt) { + if (options[opt]) { + this[opt](); + } + }, this); + + if (options.rootHooks) { + this.rootHooks(options.rootHooks); + } + + /** + * The class which we'll instantiate in {@link Mocha#run}. Defaults to + * {@link Runner} in serial mode; changes in parallel mode. + * @memberof Mocha + * @private + */ + this._runnerClass = exports.Runner; + + /** + * Whether or not to call {@link Mocha#loadFiles} implicitly when calling + * {@link Mocha#run}. If this is `true`, then it's up to the consumer to call + * {@link Mocha#loadFiles} _or_ {@link Mocha#loadFilesAsync}. + * @private + * @memberof Mocha + */ + this._lazyLoadFiles = false; + + /** + * It's useful for a Mocha instance to know if it's running in a worker process. + * We could derive this via other means, but it's helpful to have a flag to refer to. + * @memberof Mocha + * @private + */ + this.isWorker = Boolean(options.isWorker); + + this.globalSetup(options.globalSetup) + .globalTeardown(options.globalTeardown) + .enableGlobalSetup(options.enableGlobalSetup) + .enableGlobalTeardown(options.enableGlobalTeardown); + + if ( + options.parallel && + (typeof options.jobs === 'undefined' || options.jobs > 1) + ) { + debug('attempting to enable parallel mode'); + this.parallelMode(true); } } - return name + ': ' + str; -} + /** + * Enables or disables bailing on the first failure. + * + * @public + * @see [CLI option](../#-bail-b) + * @param {boolean} [bail=true] - Whether to bail on first error. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.bail = function (bail) { + this.suite.bail(bail !== false); + return this; + }; + /** + * @summary + * Adds `file` to be loaded for execution. + * + * @description + * Useful for generic setup code that must be included within test suite. + * + * @public + * @see [CLI option](../#-file-filedirectoryglob) + * @param {string} file - Pathname of file to be loaded. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.addFile = function (file) { + this.files.push(file); + return this; + }; -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); + /** + * Sets reporter to `reporter`, defaults to "spec". + * + * @public + * @see [CLI option](../#-reporter-name-r-name) + * @see [Reporters](../#reporters) + * @param {String|Function} reporterName - Reporter name or constructor. + * @param {Object} [reporterOptions] - Options used to configure the reporter. + * @returns {Mocha} this + * @chainable + * @throws {Error} if requested reporter cannot be loaded + * @example + * + * // Use XUnit reporter and direct its output to file + * mocha.reporter('xunit', { output: '/path/to/testspec.xunit.xml' }); + */ + Mocha.prototype.reporter = function (reporterName, reporterOptions) { + if (typeof reporterName === 'function') { + this._reporter = reporterName; + } else { + reporterName = reporterName || 'spec'; + var reporter; + // Try to load a built-in reporter. + if (builtinReporters[reporterName]) { + reporter = builtinReporters[reporterName]; + } + // Try to load reporters from process.cwd() and node_modules + if (!reporter) { + let foundReporter; + try { + foundReporter = require.resolve(reporterName); + reporter = commonjsRequire(foundReporter); + } catch (err) { + if (foundReporter) { + throw createInvalidReporterError(err.message, foundReporter); + } + // Try to load reporters from a cwd-relative path + try { + reporter = commonjsRequire(path.resolve(reporterName)); + } catch (e) { + throw createInvalidReporterError(e.message, reporterName); + } + } + } + this._reporter = reporter; + } + this.options.reporterOption = reporterOptions; + // alias option name is used in built-in reporters xunit/tap/progress + this.options.reporterOptions = reporterOptions; + return this; + }; - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; + /** + * Sets test UI `name`, defaults to "bdd". + * + * @public + * @see [CLI option](../#-ui-name-u-name) + * @see [Interface DSLs](../#interfaces) + * @param {string|Function} [ui=bdd] - Interface name or class. + * @returns {Mocha} this + * @chainable + * @throws {Error} if requested interface cannot be loaded + */ + Mocha.prototype.ui = function (ui) { + var bindInterface; + if (typeof ui === 'function') { + bindInterface = ui; + } else { + ui = ui || 'bdd'; + bindInterface = exports.interfaces[ui]; + if (!bindInterface) { + try { + bindInterface = commonjsRequire(ui); + } catch (err) { + throw createInvalidInterfaceError(`invalid interface '${ui}'`, ui); + } + } + } + bindInterface(this.suite); + + this.suite.on(EVENT_FILE_PRE_REQUIRE, function (context) { + currentContext = context; + }); + + return this; + }; + + /** + * Loads `files` prior to execution. Does not support ES Modules. + * + * @description + * The implementation relies on Node's `require` to execute + * the test interface functions and will be subject to its cache. + * Supports only CommonJS modules. To load ES modules, use Mocha#loadFilesAsync. + * + * @private + * @see {@link Mocha#addFile} + * @see {@link Mocha#run} + * @see {@link Mocha#unloadFiles} + * @see {@link Mocha#loadFilesAsync} + * @param {Function} [fn] - Callback invoked upon completion. + */ + Mocha.prototype.loadFiles = function (fn) { + var self = this; + var suite = this.suite; + this.files.forEach(function (file) { + file = path.resolve(file); + suite.emit(EVENT_FILE_PRE_REQUIRE, commonjsGlobal, file, self); + suite.emit(EVENT_FILE_REQUIRE, commonjsRequire(file), file, self); + suite.emit(EVENT_FILE_POST_REQUIRE, commonjsGlobal, file, self); + }); + fn && fn(); + }; + + /** + * Loads `files` prior to execution. Supports Node ES Modules. + * + * @description + * The implementation relies on Node's `require` and `import` to execute + * the test interface functions and will be subject to its cache. + * Supports both CJS and ESM modules. + * + * @public + * @see {@link Mocha#addFile} + * @see {@link Mocha#run} + * @see {@link Mocha#unloadFiles} + * @returns {Promise} + * @example + * + * // loads ESM (and CJS) test files asynchronously, then runs root suite + * mocha.loadFilesAsync() + * .then(() => mocha.run(failures => process.exitCode = failures ? 1 : 0)) + * .catch(() => process.exitCode = 1); + */ + Mocha.prototype.loadFilesAsync = function () { + var self = this; + var suite = this.suite; + this.lazyLoadFiles(true); + + return esmUtils.loadFilesAsync( + this.files, + function (file) { + suite.emit(EVENT_FILE_PRE_REQUIRE, commonjsGlobal, file, self); + }, + function (file, resultModule) { + suite.emit(EVENT_FILE_REQUIRE, resultModule, file, self); + suite.emit(EVENT_FILE_POST_REQUIRE, commonjsGlobal, file, self); + } + ); + }; + + /** + * Removes a previously loaded file from Node's `require` cache. + * + * @private + * @static + * @see {@link Mocha#unloadFiles} + * @param {string} file - Pathname of file to be unloaded. + */ + Mocha.unloadFile = function (file) { + if (utils.isBrowser()) { + throw createUnsupportedError( + 'unloadFile() is only supported in a Node.js environment' + ); + } + return require$$18.unloadFile(file); + }; + + /** + * Unloads `files` from Node's `require` cache. + * + * @description + * This allows required files to be "freshly" reloaded, providing the ability + * to reuse a Mocha instance programmatically. + * Note: does not clear ESM module files from the cache + * + * <strong>Intended for consumers — not used internally</strong> + * + * @public + * @see {@link Mocha#run} + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.unloadFiles = function () { + if (this._state === mochaStates.DISPOSED) { + throw createMochaInstanceAlreadyDisposedError( + 'Mocha instance is already disposed, it cannot be used again.', + this._cleanReferencesAfterRun, + this + ); + } + + this.files.forEach(function (file) { + Mocha.unloadFile(file); + }); + this._state = mochaStates.INIT; + return this; + }; + + /** + * Sets `grep` filter after escaping RegExp special characters. + * + * @public + * @see {@link Mocha#grep} + * @param {string} str - Value to be converted to a regexp. + * @returns {Mocha} this + * @chainable + * @example + * + * // Select tests whose full title begins with `"foo"` followed by a period + * mocha.fgrep('foo.'); + */ + Mocha.prototype.fgrep = function (str) { + if (!str) { + return this; + } + return this.grep(new RegExp(escapeRe(str))); + }; + + /** + * @summary + * Sets `grep` filter used to select specific tests for execution. + * + * @description + * If `re` is a regexp-like string, it will be converted to regexp. + * The regexp is tested against the full title of each test (i.e., the + * name of the test preceded by titles of each its ancestral suites). + * As such, using an <em>exact-match</em> fixed pattern against the + * test name itself will not yield any matches. + * <br> + * <strong>Previous filter value will be overwritten on each call!</strong> + * + * @public + * @see [CLI option](../#-grep-regexp-g-regexp) + * @see {@link Mocha#fgrep} + * @see {@link Mocha#invert} + * @param {RegExp|String} re - Regular expression used to select tests. + * @return {Mocha} this + * @chainable + * @example + * + * // Select tests whose full title contains `"match"`, ignoring case + * mocha.grep(/match/i); + * @example + * + * // Same as above but with regexp-like string argument + * mocha.grep('/match/i'); + * @example + * + * // ## Anti-example + * // Given embedded test `it('only-this-test')`... + * mocha.grep('/^only-this-test$/'); // NO! Use `.only()` to do this! + */ + Mocha.prototype.grep = function (re) { + if (utils.isString(re)) { + // extract args if it's regex-like, i.e: [string, pattern, flag] + var arg = re.match(/^\/(.*)\/([gimy]{0,4})$|.*/); + this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); + } else { + this.options.grep = re; + } + return this; + }; + + /** + * Inverts `grep` matches. + * + * @public + * @see {@link Mocha#grep} + * @return {Mocha} this + * @chainable + * @example + * + * // Select tests whose full title does *not* contain `"match"`, ignoring case + * mocha.grep(/match/i).invert(); + */ + Mocha.prototype.invert = function () { + this.options.invert = true; + return this; + }; + + /** + * Enables or disables checking for global variables leaked while running tests. + * + * @public + * @see [CLI option](../#-check-leaks) + * @param {boolean} [checkLeaks=true] - Whether to check for global variable leaks. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.checkLeaks = function (checkLeaks) { + this.options.checkLeaks = checkLeaks !== false; + return this; + }; + + /** + * Enables or disables whether or not to dispose after each test run. + * Disable this to ensure you can run the test suite multiple times. + * If disabled, be sure to dispose mocha when you're done to prevent memory leaks. + * @public + * @see {@link Mocha#dispose} + * @param {boolean} cleanReferencesAfterRun + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.cleanReferencesAfterRun = function (cleanReferencesAfterRun) { + this._cleanReferencesAfterRun = cleanReferencesAfterRun !== false; + return this; + }; + + /** + * Manually dispose this mocha instance. Mark this instance as `disposed` and unable to run more tests. + * It also removes function references to tests functions and hooks, so variables trapped in closures can be cleaned by the garbage collector. + * @public + */ + Mocha.prototype.dispose = function () { + if (this._state === mochaStates.RUNNING) { + throw createMochaInstanceAlreadyRunningError( + 'Cannot dispose while the mocha instance is still running tests.' + ); + } + this.unloadFiles(); + this._previousRunner && this._previousRunner.dispose(); + this.suite.dispose(); + this._state = mochaStates.DISPOSED; + }; + + /** + * Displays full stack trace upon test failure. + * + * @public + * @see [CLI option](../#-full-trace) + * @param {boolean} [fullTrace=true] - Whether to print full stacktrace upon failure. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.fullTrace = function (fullTrace) { + this.options.fullTrace = fullTrace !== false; + return this; + }; + + /** + * Specifies whitelist of variable names to be expected in global scope. + * + * @public + * @see [CLI option](../#-global-variable-name) + * @see {@link Mocha#checkLeaks} + * @param {String[]|String} global - Accepted global variable name(s). + * @return {Mocha} this + * @chainable + * @example + * + * // Specify variables to be expected in global scope + * mocha.global(['jQuery', 'MyLib']); + */ + Mocha.prototype.global = function (global) { + this.options.global = (this.options.global || []) + .concat(global) + .filter(Boolean) + .filter(function (elt, idx, arr) { + return arr.indexOf(elt) === idx; + }); + return this; + }; + // for backwards compatibility, 'globals' is an alias of 'global' + Mocha.prototype.globals = Mocha.prototype.global; + + /** + * Enables or disables TTY color output by screen-oriented reporters. + * + * @public + * @see [CLI option](../#-color-c-colors) + * @param {boolean} [color=true] - Whether to enable color output. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.color = function (color) { + this.options.color = color !== false; + return this; + }; + + /** + * Enables or disables reporter to use inline diffs (rather than +/-) + * in test failure output. + * + * @public + * @see [CLI option](../#-inline-diffs) + * @param {boolean} [inlineDiffs=true] - Whether to use inline diffs. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.inlineDiffs = function (inlineDiffs) { + this.options.inlineDiffs = inlineDiffs !== false; + return this; + }; + + /** + * Enables or disables reporter to include diff in test failure output. + * + * @public + * @see [CLI option](../#-diff) + * @param {boolean} [diff=true] - Whether to show diff on failure. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.diff = function (diff) { + this.options.diff = diff !== false; + return this; + }; + + /** + * @summary + * Sets timeout threshold value. + * + * @description + * A string argument can use shorthand (such as "2s") and will be converted. + * If the value is `0`, timeouts will be disabled. + * + * @public + * @see [CLI option](../#-timeout-ms-t-ms) + * @see [Timeouts](../#timeouts) + * @param {number|string} msecs - Timeout threshold value. + * @return {Mocha} this + * @chainable + * @example + * + * // Sets timeout to one second + * mocha.timeout(1000); + * @example + * + * // Same as above but using string argument + * mocha.timeout('1s'); + */ + Mocha.prototype.timeout = function (msecs) { + this.suite.timeout(msecs); + return this; + }; + + /** + * Sets the number of times to retry failed tests. + * + * @public + * @see [CLI option](../#-retries-n) + * @see [Retry Tests](../#retry-tests) + * @param {number} retry - Number of times to retry failed tests. + * @return {Mocha} this + * @chainable + * @example + * + * // Allow any failed test to retry one more time + * mocha.retries(1); + */ + Mocha.prototype.retries = function (retry) { + this.suite.retries(retry); + return this; + }; + + /** + * Sets slowness threshold value. + * + * @public + * @see [CLI option](../#-slow-ms-s-ms) + * @param {number} msecs - Slowness threshold value. + * @return {Mocha} this + * @chainable + * @example + * + * // Sets "slow" threshold to half a second + * mocha.slow(500); + * @example + * + * // Same as above but using string argument + * mocha.slow('0.5s'); + */ + Mocha.prototype.slow = function (msecs) { + this.suite.slow(msecs); + return this; + }; + + /** + * Forces all tests to either accept a `done` callback or return a promise. + * + * @public + * @see [CLI option](../#-async-only-a) + * @param {boolean} [asyncOnly=true] - Whether to force `done` callback or promise. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.asyncOnly = function (asyncOnly) { + this.options.asyncOnly = asyncOnly !== false; + return this; + }; + + /** + * Disables syntax highlighting (in browser). + * + * @public + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.noHighlighting = function () { + this.options.noHighlighting = true; + return this; + }; + + /** + * Enables or disables uncaught errors to propagate. + * + * @public + * @see [CLI option](../#-allow-uncaught) + * @param {boolean} [allowUncaught=true] - Whether to propagate uncaught errors. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.allowUncaught = function (allowUncaught) { + this.options.allowUncaught = allowUncaught !== false; + return this; + }; + + /** + * @summary + * Delays root suite execution. + * + * @description + * Used to perform async operations before any suites are run. + * + * @public + * @see [delayed root suite](../#delayed-root-suite) + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.delay = function delay() { + this.options.delay = true; + return this; + }; + + /** + * Enables or disables running tests in dry-run mode. + * + * @public + * @see [CLI option](../#-dry-run) + * @param {boolean} [dryRun=true] - Whether to activate dry-run mode. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.dryRun = function (dryRun) { + this.options.dryRun = dryRun !== false; + return this; + }; + + /** + * Fails test run if no tests encountered with exit-code 1. + * + * @public + * @see [CLI option](../#-fail-zero) + * @param {boolean} [failZero=true] - Whether to fail test run. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.failZero = function (failZero) { + this.options.failZero = failZero !== false; + return this; + }; + + /** + * Causes tests marked `only` to fail the suite. + * + * @public + * @see [CLI option](../#-forbid-only) + * @param {boolean} [forbidOnly=true] - Whether tests marked `only` fail the suite. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.forbidOnly = function (forbidOnly) { + this.options.forbidOnly = forbidOnly !== false; + return this; + }; + + /** + * Causes pending tests and tests marked `skip` to fail the suite. + * + * @public + * @see [CLI option](../#-forbid-pending) + * @param {boolean} [forbidPending=true] - Whether pending tests fail the suite. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.forbidPending = function (forbidPending) { + this.options.forbidPending = forbidPending !== false; + return this; + }; + + /** + * Throws an error if mocha is in the wrong state to be able to transition to a "running" state. + * @private + */ + Mocha.prototype._guardRunningStateTransition = function () { + if (this._state === mochaStates.RUNNING) { + throw createMochaInstanceAlreadyRunningError( + 'Mocha instance is currently running tests, cannot start a next test run until this one is done', + this + ); + } + if ( + this._state === mochaStates.DISPOSED || + this._state === mochaStates.REFERENCES_CLEANED + ) { + throw createMochaInstanceAlreadyDisposedError( + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + this._cleanReferencesAfterRun, + this + ); + } + }; + + /** + * Mocha version as specified by "package.json". + * + * @name Mocha#version + * @type string + * @readonly + */ + Object.defineProperty(Mocha.prototype, 'version', { + value: require$$17.version, + configurable: false, + enumerable: true, + writable: false + }); + + /** + * Callback to be invoked when test execution is complete. + * + * @private + * @callback DoneCB + * @param {number} failures - Number of failures that occurred. + */ + + /** + * Runs root suite and invokes `fn()` when complete. + * + * @description + * To run tests multiple times (or to run tests in files that are + * already in the `require` cache), make sure to clear them from + * the cache first! + * + * @public + * @see {@link Mocha#unloadFiles} + * @see {@link Runner#run} + * @param {DoneCB} [fn] - Callback invoked when test execution completed. + * @returns {Runner} runner instance + * @example + * + * // exit with non-zero status if there were test failures + * mocha.run(failures => process.exitCode = failures ? 1 : 0); + */ + Mocha.prototype.run = function (fn) { + this._guardRunningStateTransition(); + this._state = mochaStates.RUNNING; + if (this._previousRunner) { + this._previousRunner.dispose(); + this.suite.reset(); + } + if (this.files.length && !this._lazyLoadFiles) { + this.loadFiles(); + } + var suite = this.suite; + var options = this.options; + options.files = this.files; + const runner = new this._runnerClass(suite, { + cleanReferencesAfterRun: this._cleanReferencesAfterRun, + delay: options.delay, + dryRun: options.dryRun, + failZero: options.failZero + }); + createStatsCollector(runner); + var reporter = new this._reporter(runner, options); + runner.checkLeaks = options.checkLeaks === true; + runner.fullStackTrace = options.fullTrace; + runner.asyncOnly = options.asyncOnly; + runner.allowUncaught = options.allowUncaught; + runner.forbidOnly = options.forbidOnly; + runner.forbidPending = options.forbidPending; + if (options.grep) { + runner.grep(options.grep, options.invert); + } + if (options.global) { + runner.globals(options.global); + } + if (options.color !== undefined) { + exports.reporters.Base.useColors = options.color; + } + exports.reporters.Base.inlineDiffs = options.inlineDiffs; + exports.reporters.Base.hideDiff = !options.diff; + + const done = failures => { + this._previousRunner = runner; + this._state = this._cleanReferencesAfterRun + ? mochaStates.REFERENCES_CLEANED + : mochaStates.INIT; + fn = fn || utils.noop; + if (typeof reporter.done === 'function') { + reporter.done(failures, fn); + } else { + fn(failures); + } + }; + + const runAsync = async runner => { + const context = + this.options.enableGlobalSetup && this.hasGlobalSetupFixtures() + ? await this.runGlobalSetup(runner) + : {}; + const failureCount = await runner.runAsync({ + files: this.files, + options + }); + if (this.options.enableGlobalTeardown && this.hasGlobalTeardownFixtures()) { + await this.runGlobalTeardown(runner, {context}); + } + return failureCount; + }; + + // no "catch" here is intentional. errors coming out of + // Runner#run are considered uncaught/unhandled and caught + // by the `process` event listeners. + // also: returning anything other than `runner` would be a breaking + // change + runAsync(runner).then(done); + + return runner; + }; + + /** + * Assigns hooks to the root suite + * @param {MochaRootHookObject} [hooks] - Hooks to assign to root suite + * @chainable + */ + Mocha.prototype.rootHooks = function rootHooks({ + beforeAll = [], + beforeEach = [], + afterAll = [], + afterEach = [] + } = {}) { + beforeAll = utils.castArray(beforeAll); + beforeEach = utils.castArray(beforeEach); + afterAll = utils.castArray(afterAll); + afterEach = utils.castArray(afterEach); + beforeAll.forEach(hook => { + this.suite.beforeAll(hook); + }); + beforeEach.forEach(hook => { + this.suite.beforeEach(hook); + }); + afterAll.forEach(hook => { + this.suite.afterAll(hook); + }); + afterEach.forEach(hook => { + this.suite.afterEach(hook); + }); + return this; + }; + + /** + * Toggles parallel mode. + * + * Must be run before calling {@link Mocha#run}. Changes the `Runner` class to + * use; also enables lazy file loading if not already done so. + * + * Warning: when passed `false` and lazy loading has been enabled _via any means_ (including calling `parallelMode(true)`), this method will _not_ disable lazy loading. Lazy loading is a prerequisite for parallel + * mode, but parallel mode is _not_ a prerequisite for lazy loading! + * @param {boolean} [enable] - If `true`, enable; otherwise disable. + * @throws If run in browser + * @throws If Mocha not in `INIT` state + * @returns {Mocha} + * @chainable + * @public + */ + Mocha.prototype.parallelMode = function parallelMode(enable = true) { + if (utils.isBrowser()) { + throw createUnsupportedError('parallel mode is only supported in Node.js'); + } + const parallel = Boolean(enable); + if ( + parallel === this.options.parallel && + this._lazyLoadFiles && + this._runnerClass !== exports.Runner + ) { + return this; + } + if (this._state !== mochaStates.INIT) { + throw createUnsupportedError( + 'cannot change parallel mode after having called run()' + ); + } + this.options.parallel = parallel; + + // swap Runner class + this._runnerClass = parallel + ? require$$18 + : exports.Runner; + + // lazyLoadFiles may have been set `true` otherwise (for ESM loading), + // so keep `true` if so. + return this.lazyLoadFiles(this._lazyLoadFiles || parallel); + }; + + /** + * Disables implicit call to {@link Mocha#loadFiles} in {@link Mocha#run}. This + * setting is used by watch mode, parallel mode, and for loading ESM files. + * @todo This should throw if we've already loaded files; such behavior + * necessitates adding a new state. + * @param {boolean} [enable] - If `true`, disable eager loading of files in + * {@link Mocha#run} + * @chainable + * @public + */ + Mocha.prototype.lazyLoadFiles = function lazyLoadFiles(enable) { + this._lazyLoadFiles = enable === true; + debug('set lazy load to %s', enable); + return this; + }; + + /** + * Configures one or more global setup fixtures. + * + * If given no parameters, _unsets_ any previously-set fixtures. + * @chainable + * @public + * @param {MochaGlobalFixture|MochaGlobalFixture[]} [setupFns] - Global setup fixture(s) + * @returns {Mocha} + */ + Mocha.prototype.globalSetup = function globalSetup(setupFns = []) { + setupFns = utils.castArray(setupFns); + this.options.globalSetup = setupFns; + debug('configured %d global setup functions', setupFns.length); + return this; + }; + + /** + * Configures one or more global teardown fixtures. + * + * If given no parameters, _unsets_ any previously-set fixtures. + * @chainable + * @public + * @param {MochaGlobalFixture|MochaGlobalFixture[]} [teardownFns] - Global teardown fixture(s) + * @returns {Mocha} + */ + Mocha.prototype.globalTeardown = function globalTeardown(teardownFns = []) { + teardownFns = utils.castArray(teardownFns); + this.options.globalTeardown = teardownFns; + debug('configured %d global teardown functions', teardownFns.length); + return this; + }; + + /** + * Run any global setup fixtures sequentially, if any. + * + * This is _automatically called_ by {@link Mocha#run} _unless_ the `runGlobalSetup` option is `false`; see {@link Mocha#enableGlobalSetup}. + * + * The context object this function resolves with should be consumed by {@link Mocha#runGlobalTeardown}. + * @param {object} [context] - Context object if already have one + * @public + * @returns {Promise<object>} Context object + */ + Mocha.prototype.runGlobalSetup = async function runGlobalSetup(context = {}) { + const {globalSetup} = this.options; + if (globalSetup && globalSetup.length) { + debug('run(): global setup starting'); + await this._runGlobalFixtures(globalSetup, context); + debug('run(): global setup complete'); + } + return context; + }; + + /** + * Run any global teardown fixtures sequentially, if any. + * + * This is _automatically called_ by {@link Mocha#run} _unless_ the `runGlobalTeardown` option is `false`; see {@link Mocha#enableGlobalTeardown}. + * + * Should be called with context object returned by {@link Mocha#runGlobalSetup}, if applicable. + * @param {object} [context] - Context object if already have one + * @public + * @returns {Promise<object>} Context object + */ + Mocha.prototype.runGlobalTeardown = async function runGlobalTeardown( + context = {} + ) { + const {globalTeardown} = this.options; + if (globalTeardown && globalTeardown.length) { + debug('run(): global teardown starting'); + await this._runGlobalFixtures(globalTeardown, context); + } + debug('run(): global teardown complete'); + return context; + }; + + /** + * Run global fixtures sequentially with context `context` + * @private + * @param {MochaGlobalFixture[]} [fixtureFns] - Fixtures to run + * @param {object} [context] - context object + * @returns {Promise<object>} context object + */ + Mocha.prototype._runGlobalFixtures = async function _runGlobalFixtures( + fixtureFns = [], + context = {} + ) { + for await (const fixtureFn of fixtureFns) { + await fixtureFn.call(context); + } + return context; + }; + + /** + * Toggle execution of any global setup fixture(s) + * + * @chainable + * @public + * @param {boolean } [enabled=true] - If `false`, do not run global setup fixture + * @returns {Mocha} + */ + Mocha.prototype.enableGlobalSetup = function enableGlobalSetup(enabled = true) { + this.options.enableGlobalSetup = Boolean(enabled); + return this; + }; + + /** + * Toggle execution of any global teardown fixture(s) + * + * @chainable + * @public + * @param {boolean } [enabled=true] - If `false`, do not run global teardown fixture + * @returns {Mocha} + */ + Mocha.prototype.enableGlobalTeardown = function enableGlobalTeardown( + enabled = true + ) { + this.options.enableGlobalTeardown = Boolean(enabled); + return this; + }; + + /** + * Returns `true` if one or more global setup fixtures have been supplied. + * @public + * @returns {boolean} + */ + Mocha.prototype.hasGlobalSetupFixtures = function hasGlobalSetupFixtures() { + return Boolean(this.options.globalSetup.length); + }; + + /** + * Returns `true` if one or more global teardown fixtures have been supplied. + * @public + * @returns {boolean} + */ + Mocha.prototype.hasGlobalTeardownFixtures = + function hasGlobalTeardownFixtures() { + return Boolean(this.options.globalTeardown.length); + }; + + /** + * An alternative way to define root hooks that works with parallel runs. + * @typedef {Object} MochaRootHookObject + * @property {Function|Function[]} [beforeAll] - "Before all" hook(s) + * @property {Function|Function[]} [beforeEach] - "Before each" hook(s) + * @property {Function|Function[]} [afterAll] - "After all" hook(s) + * @property {Function|Function[]} [afterEach] - "After each" hook(s) + */ + + /** + * An function that returns a {@link MochaRootHookObject}, either sync or async. + @callback MochaRootHookFunction + * @returns {MochaRootHookObject|Promise<MochaRootHookObject>} + */ + + /** + * A function that's invoked _once_ which is either sync or async. + * Can be a "teardown" or "setup". These will all share the same context. + * @callback MochaGlobalFixture + * @returns {void|Promise<void>} + */ + + /** + * An object making up all necessary parts of a plugin loader and aggregator + * @typedef {Object} PluginDefinition + * @property {string} exportName - Named export to use + * @property {string} [optionName] - Option name for Mocha constructor (use `exportName` if omitted) + * @property {PluginValidator} [validate] - Validator function + * @property {PluginFinalizer} [finalize] - Finalizer/aggregator function + */ + + /** + * A (sync) function to assert a user-supplied plugin implementation is valid. + * + * Defined in a {@link PluginDefinition}. + + * @callback PluginValidator + * @param {*} value - Value to check + * @this {PluginDefinition} + * @returns {void} + */ + + /** + * A function to finalize plugins impls of a particular ilk + * @callback PluginFinalizer + * @param {Array<*>} impls - User-supplied implementations + * @returns {Promise<*>|*} + */ + }(mocha$1, mocha$1.exports)); + + /* eslint no-unused-vars: off */ + /* eslint-env commonjs */ + + /** + * Shim process.stdout. + */ + + process.stdout = browserStdout({label: false}); + + var parseQuery = parseQuery$1; + var highlightTags = highlightTags$1; + var Mocha = mocha$1.exports; + + /** + * Create a Mocha instance. + * + * @return {undefined} + */ + + var mocha = new Mocha({reporter: 'html'}); + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + + var Date$1 = commonjsGlobal.Date; + var setTimeout$1 = commonjsGlobal.setTimeout; + commonjsGlobal.setInterval; + commonjsGlobal.clearTimeout; + commonjsGlobal.clearInterval; + + var uncaughtExceptionHandlers = []; + + var originalOnerrorHandler = commonjsGlobal.onerror; + + /** + * Remove uncaughtException listener. + * Revert to original onerror handler if previously defined. + */ + + process.removeListener = function (e, fn) { + if (e === 'uncaughtException') { + if (originalOnerrorHandler) { + commonjsGlobal.onerror = originalOnerrorHandler; + } else { + commonjsGlobal.onerror = function () {}; + } + var i = uncaughtExceptionHandlers.indexOf(fn); + if (i !== -1) { + uncaughtExceptionHandlers.splice(i, 1); + } + } + }; + + /** + * Implements listenerCount for 'uncaughtException'. + */ + + process.listenerCount = function (name) { + if (name === 'uncaughtException') { + return uncaughtExceptionHandlers.length; + } + return 0; + }; + + /** + * Implements uncaughtException listener. + */ + + process.on = function (e, fn) { + if (e === 'uncaughtException') { + commonjsGlobal.onerror = function (err, url, line) { + fn(new Error(err + ' (' + url + ':' + line + ')')); + return !mocha.options.allowUncaught; + }; + uncaughtExceptionHandlers.push(fn); + } + }; + + process.listeners = function (e) { + if (e === 'uncaughtException') { + return uncaughtExceptionHandlers; + } + return []; + }; + + // The BDD UI is registered by default, but no UI will be functional in the + // browser without an explicit call to the overridden `mocha.ui` (see below). + // Ensure that this default UI does not expose its methods to the global scope. + mocha.suite.removeAllListeners('pre-require'); + + var immediateQueue = []; + var immediateTimeout; + + function timeslice() { + var immediateStart = new Date$1().getTime(); + while (immediateQueue.length && new Date$1().getTime() - immediateStart < 100) { + immediateQueue.shift()(); + } + if (immediateQueue.length) { + immediateTimeout = setTimeout$1(timeslice, 0); + } else { + immediateTimeout = null; + } } - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} + /** + * High-performance override of Runner.immediately. + */ + Mocha.Runner.immediately = function (callback) { + immediateQueue.push(callback); + if (!immediateTimeout) { + immediateTimeout = setTimeout$1(timeslice, 0); + } + }; -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; + /** + * Function to allow assertion libraries to throw errors directly into mocha. + * This is useful when running tests in a browser because window.onerror will + * only receive the 'message' attribute of the Error. + */ + mocha.throwError = function (err) { + uncaughtExceptionHandlers.forEach(function (fn) { + fn(err); + }); + throw err; + }; -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; + /** + * Override ui to ensure that the ui functions are initialized. + * Normally this would happen in Mocha.prototype.loadFiles. + */ -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; + mocha.ui = function (ui) { + Mocha.prototype.ui.call(this, ui); + this.suite.emit('pre-require', commonjsGlobal, null, this); + return this; + }; -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; + /** + * Setup mocha with the given setting options. + */ -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; + mocha.setup = function (opts) { + if (typeof opts === 'string') { + opts = {ui: opts}; + } + if (opts.delay === true) { + this.delay(); + } + var self = this; + Object.keys(opts) + .filter(function (opt) { + return opt !== 'delay'; + }) + .forEach(function (opt) { + if (Object.prototype.hasOwnProperty.call(opts, opt)) { + self[opt](opts[opt]); + } + }); + return this; + }; -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; + /** + * Run mocha, returning the Runner. + */ -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; + mocha.run = function (fn) { + var options = mocha.options; + mocha.globals('location'); -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; + var query = parseQuery(commonjsGlobal.location.search || ''); + if (query.grep) { + mocha.grep(query.grep); + } + if (query.fgrep) { + mocha.fgrep(query.fgrep); + } + if (query.invert) { + mocha.invert(); + } -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; + return Mocha.prototype.run.call(mocha, function (err) { + // The DOM Document is not available in Web Workers. + var document = commonjsGlobal.document; + if ( + document && + document.getElementById('mocha') && + options.noHighlighting !== true + ) { + highlightTags('code'); + } + if (fn) { + fn(err); + } + }); + }; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; + /** + * Expose the process shim. + * https://github.com/mochajs/mocha/pull/916 + */ -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + Mocha.process = process; -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; + /** + * Expose mocha. + */ + commonjsGlobal.Mocha = Mocha; + commonjsGlobal.mocha = mocha; -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; + // for bundlers: enable `import {describe, it} from 'mocha'` + // `bdd` interface only + // prettier-ignore + [ + 'describe', 'context', 'it', 'specify', + 'xdescribe', 'xcontext', 'xit', 'xspecify', + 'before', 'beforeEach', 'afterEach', 'after' + ].forEach(function(key) { + mocha[key] = commonjsGlobal[key]; + }); -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; + var browserEntry = mocha; -exports.isBuffer = require('./support/isBuffer'); + return browserEntry; -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = require('inherits'); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":88,"_process":69,"inherits":56}],90:[function(require,module,exports){ -module.exports={ - "name": "mocha", - "version": "6.1.4", - "homepage": "https://mochajs.org/", - "notifyLogo": "https://ibin.co/4QuRuGjXvl36.png" -} -},{}]},{},[1]); +})); +//# sourceMappingURL=mocha.js.map
diff --git a/third_party/nyx-packer/BUILD.gn b/third_party/nyx-packer/BUILD.gn new file mode 100644 index 0000000..0de2a3d --- /dev/null +++ b/third_party/nyx-packer/BUILD.gn
@@ -0,0 +1,13 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +config("nyx_include") { + include_dirs = [ "src" ] +} + +source_set("nyx-api") { + public = [ "src/nyx.h" ] + + public_configs = [ ":nyx_include" ] +}
diff --git a/third_party/nyx-packer/LICENSE b/third_party/nyx-packer/LICENSE new file mode 100644 index 0000000..d5f8e611 --- /dev/null +++ b/third_party/nyx-packer/LICENSE
@@ -0,0 +1,22 @@ +(Copied from nyx.h) + +/* +This file is part of NYX. + +Copyright (c) 2021 Sergej Schumilo +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ \ No newline at end of file
diff --git a/third_party/nyx-packer/OWNERS b/third_party/nyx-packer/OWNERS new file mode 100644 index 0000000..695fa39 --- /dev/null +++ b/third_party/nyx-packer/OWNERS
@@ -0,0 +1,2 @@ + bookholt@chromium.org + markbrand@google.com
diff --git a/third_party/nyx-packer/README.chromium b/third_party/nyx-packer/README.chromium new file mode 100644 index 0000000..d20206f --- /dev/null +++ b/third_party/nyx-packer/README.chromium
@@ -0,0 +1,22 @@ +Name: Nyx Packer +Short Name: nyx-packer +URL: https://github.com/nyx-fuzz/packer +Version: 0 +Date: 2022/08/05 +Revision: a2403befd860415725d0b6d64df69fd000aca541 +License: MIT and GPL2 +License File: NOT_SHIPPED +Security Critical: no +CPEPrefix: unknown + +Description: +Nyx Packer is used to create a Nyx sharedir, which contains bundled data +required to run a virtual machine for a given fuzz testing (fuzzing) target. +The only file used from this library is 'nyx.h' for the low-level interface +definitions. + +Local Modifications: +We add 'get.sh', which is an aid for creating a CL to roll our copy of the +'nyx.h' header file. It fetches the latest version of 'nyx.h' from the upstream +repository and then updates this README file with the latest commit hash and +date.
diff --git a/third_party/nyx-packer/get.sh b/third_party/nyx-packer/get.sh new file mode 100755 index 0000000..5c3ff0d --- /dev/null +++ b/third_party/nyx-packer/get.sh
@@ -0,0 +1,45 @@ +#!/bin/bash + +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +cd $(dirname $0) +nyx_absolute_path=$(pwd) +custom_revision="$1" +latest_readme_revision=$(grep -oP '^Revision: \K[^"]+' README.chromium) + +tmpdir=$(mktemp -d) +git clone https://chromium.googlesource.com/external/github.com/nyx-fuzz/packer $tmpdir +cd $tmpdir + +if [ -z "$custom_revision" ] + then + git checkout --quiet $latest_readme_revision +else + git checkout $custom_revision +fi + +latest_remote_revision=$(git rev-parse --verify origin/upstream/main) +git diff --quiet --exit-code $latest_remote_revision -- nyx.h +file_has_changed=$? + +if [[ $file_has_changed -eq "1" ]]; then + read -p "New Nyx-Packer version. Update README (y/n)?" choice + if [ "$choice" = "y" ]; then + latest_revision_date=$(date -d @$(git log -n1 --format="%at" $latest_remote_revision) +%Y/%m/%d) + git checkout --quiet $latest_remote_revision + cd $nyx_absolute_path + + cp $tmpdir/nyx.h ./nyx.h + sed -i -e "s@Date: .*@Date: $latest_revision_date@" README.chromium + sed -i -e "s/Revision: .*/Revision: $latest_remote_revision/" README.chromium + + echo "Nyx-Packer version updated successfully." + fi +elif [[ $file_has_changed -eq "0" ]]; then + echo "Nyx-Packer is up to date." +fi + +# Make sure the temporary directory gets removed on script exit. +trap 'rm -rf "$tmpdir"' EXIT \ No newline at end of file
diff --git a/third_party/nyx-packer/nyx.h b/third_party/nyx-packer/nyx.h new file mode 100644 index 0000000..1d083b9 --- /dev/null +++ b/third_party/nyx-packer/nyx.h
@@ -0,0 +1,372 @@ +/* +This file is part of NYX. + +Copyright (c) 2021 Sergej Schumilo +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ +#ifndef KAFL_USER_H +#define KAFL_USER_H + +#include <stdarg.h> +#include <stddef.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#ifndef __MINGW64__ +#include <sys/mman.h> +#endif + +#ifdef __MINGW64__ +#ifndef uint64_t +#define uint64_t UINT64 +#endif +#ifndef int32_t +#define int32_t INT32 +#endif +#ifndef uint8_t +#define uint8_t UINT8 +#endif +#else +#include <stdint.h> +#endif + +#define HYPERCALL_KAFL_RAX_ID 0x01f +#define HYPERCALL_KAFL_ACQUIRE 0 +#define HYPERCALL_KAFL_GET_PAYLOAD 1 + +/* deprecated */ +#define HYPERCALL_KAFL_GET_PROGRAM 2 +/* deprecated */ +#define HYPERCALL_KAFL_GET_ARGV 3 + +#define HYPERCALL_KAFL_RELEASE 4 +#define HYPERCALL_KAFL_SUBMIT_CR3 5 +#define HYPERCALL_KAFL_SUBMIT_PANIC 6 + +/* deprecated */ +#define HYPERCALL_KAFL_SUBMIT_KASAN 7 + +#define HYPERCALL_KAFL_PANIC 8 + +/* deprecated */ +#define HYPERCALL_KAFL_KASAN 9 +#define HYPERCALL_KAFL_LOCK 10 + +/* deprecated */ +#define HYPERCALL_KAFL_INFO 11 + +#define HYPERCALL_KAFL_NEXT_PAYLOAD 12 +#define HYPERCALL_KAFL_PRINTF 13 + +/* deprecated */ +#define HYPERCALL_KAFL_PRINTK_ADDR 14 +/* deprecated */ +#define HYPERCALL_KAFL_PRINTK 15 + +/* user space only hypercalls */ +#define HYPERCALL_KAFL_USER_RANGE_ADVISE 16 +#define HYPERCALL_KAFL_USER_SUBMIT_MODE 17 +#define HYPERCALL_KAFL_USER_FAST_ACQUIRE 18 +/* 19 is already used for exit reason KVM_EXIT_KAFL_TOPA_MAIN_FULL */ +#define HYPERCALL_KAFL_USER_ABORT 20 +#define HYPERCALL_KAFL_RANGE_SUBMIT 29 +#define HYPERCALL_KAFL_REQ_STREAM_DATA 30 +#define HYPERCALL_KAFL_PANIC_EXTENDED 32 + +#define HYPERCALL_KAFL_CREATE_TMP_SNAPSHOT 33 +#define HYPERCALL_KAFL_DEBUG_TMP_SNAPSHOT 34 /* hypercall for debugging / development purposes */ + +#define HYPERCALL_KAFL_GET_HOST_CONFIG 35 +#define HYPERCALL_KAFL_SET_AGENT_CONFIG 36 + +#define HYPERCALL_KAFL_DUMP_FILE 37 + +#define HYPERCALL_KAFL_REQ_STREAM_DATA_BULK 38 +#define HYPERCALL_KAFL_PERSIST_PAGE_PAST_SNAPSHOT 39 + +/* hypertrash only hypercalls */ +#define HYPERTRASH_HYPERCALL_MASK 0xAA000000 + +#define HYPERCALL_KAFL_NESTED_PREPARE (0 | HYPERTRASH_HYPERCALL_MASK) +#define HYPERCALL_KAFL_NESTED_CONFIG (1 | HYPERTRASH_HYPERCALL_MASK) +#define HYPERCALL_KAFL_NESTED_ACQUIRE (2 | HYPERTRASH_HYPERCALL_MASK) +#define HYPERCALL_KAFL_NESTED_RELEASE (3 | HYPERTRASH_HYPERCALL_MASK) +#define HYPERCALL_KAFL_NESTED_HPRINTF (4 | HYPERTRASH_HYPERCALL_MASK)gre + +#define HPRINTF_MAX_SIZE 0x1000 /* up to 4KB hprintf strings */ + +/* specific defines to enable support for NYX hypercalls on unmodified KVM builds */ +/* PIO port number used by VMWare backdoor */ +#define VMWARE_PORT 0x5658 +/* slightly changed RAX_ID to avoid vmware backdoor collisions */ +#define HYPERCALL_KAFL_RAX_ID_VMWARE 0x8080801f + +typedef struct{ + int32_t size; + uint8_t data[]; +} kAFL_payload; + +typedef struct{ + uint64_t ip[4]; + uint64_t size[4]; + uint8_t enabled[4]; +} kAFL_ranges; + +#define KAFL_MODE_64 0 +#define KAFL_MODE_32 1 +#define KAFL_MODE_16 2 + +#if defined(__i386__) +#define KAFL_HYPERCALL_NO_PT(_ebx, _ecx) ({ \ + uint32_t _eax = HYPERCALL_KAFL_RAX_ID_VMWARE; \ + do{ \ + asm volatile( \ + "outl %%eax, %%dx;" \ + : "+a" (_eax) \ + : "b" (_ebx), "c" (_ecx), "d" (VMWARE_PORT) \ + : "cc", "memory" \ + ); \ + } while(0); \ + _eax; \ +}) + +#define KAFL_HYPERCALL_PT(_ebx, _ecx) ({ \ + uint32_t _eax = HYPERCALL_KAFL_RAX_ID; \ + do{ \ + asm volatile( \ + "vmcall;" \ + : "+a" (_eax) \ + : "b" (_ebx), "c" (_ecx) \ + : "cc", "memory" \ + ); \ + } while(0); \ + _eax; \ +}) + +#else + +#define KAFL_HYPERCALL_NO_PT(_rbx, _rcx) ({ \ + uint64_t _rax = HYPERCALL_KAFL_RAX_ID_VMWARE; \ + do{ \ + asm volatile( \ + "outl %%eax, %%dx;" \ + : "+a" (_rax) \ + : "b" (_rbx), "c" (_rcx), "d" (VMWARE_PORT) \ + : "cc", "memory" \ + ); \ + } while(0); \ + _rax; \ +}) + +#define KAFL_HYPERCALL_PT(_rbx, _rcx) ({ \ + uint64_t _rax = HYPERCALL_KAFL_RAX_ID; \ + do{ \ + asm volatile( \ + "vmcall;" \ + : "+a" (_rax) \ + : "b" (_rbx), "c" (_rcx) \ + : "cc", "memory" \ + ); \ + } while(0); \ + _rax; \ +}) +#endif + + +#if defined(__i386__) +#ifdef NO_PT_NYX + +#define KAFL_HYPERCALL(__rbx, __rcx) \ + KAFL_HYPERCALL_NO_PT(_rbx, _rcx); \ +}while(0) + +static inline uint32_t kAFL_hypercall(uint32_t rbx, uint32_t rcx){ + return KAFL_HYPERCALL_NO_PT(rbx, rcx); +} +#else +#define KAFL_HYPERCALL(__rbx, __rcx) \ + KAFL_HYPERCALL_PT(_rbx, _rcx); \ +}while(0) + +static inline uint32_t kAFL_hypercall(uint32_t rbx, uint32_t rcx){ +# ifndef __NOKAFL + return KAFL_HYPERCALL_PT(rbx, rcx); +# endif + return 0; +} +#endif +#elif defined(__x86_64__) +#ifdef NO_PT_NYX + +#define KAFL_HYPERCALL(__rbx, __rcx) \ + KAFL_HYPERCALL_NO_PT(_rbx, _rcx); \ +}while(0) + +static inline uint64_t kAFL_hypercall(uint64_t rbx, uint64_t rcx){ + return KAFL_HYPERCALL_NO_PT(rbx, rcx); +} +#else +#define KAFL_HYPERCALL(__rbx, __rcx) \ + KAFL_HYPERCALL_PT(_rbx, _rcx); \ +}while(0) + +static inline uint64_t kAFL_hypercall(uint64_t rbx, uint64_t rcx){ +# ifndef __NOKAFL + return KAFL_HYPERCALL_PT(rbx, rcx); +# endif + return 0; +} +#endif +#endif + +//extern uint8_t* hprintf_buffer; + +static inline uint8_t alloc_hprintf_buffer(uint8_t** hprintf_buffer){ + if(!*hprintf_buffer){ +#ifdef __MINGW64__ + *hprintf_buffer = (uint8_t*)VirtualAlloc(0, HPRINTF_MAX_SIZE, MEM_COMMIT, PAGE_READWRITE); +#else + *hprintf_buffer = (uint8_t*)mmap((void*)NULL, HPRINTF_MAX_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +#endif + if(!*hprintf_buffer){ + return 0; + } + } + return 1; +} + +#ifdef __NOKAFL +int (*hprintf)(const char * format, ...) = printf; +#else +static void hprintf(const char * format, ...) __attribute__ ((unused)); + +static void hprintf(const char * format, ...){ + static uint8_t* hprintf_buffer = NULL; + + va_list args; + va_start(args, format); + if(alloc_hprintf_buffer(&hprintf_buffer)){ + vsnprintf((char*)hprintf_buffer, HPRINTF_MAX_SIZE, format, args); + kAFL_hypercall(HYPERCALL_KAFL_PRINTF, (uintptr_t)hprintf_buffer); + } + //vprintf(format, args); + va_end(args); +} +#endif + +static void habort(char* msg){ + kAFL_hypercall(HYPERCALL_KAFL_USER_ABORT, (uintptr_t)msg); +} + +#define NYX_HOST_MAGIC 0x4878794e +#define NYX_AGENT_MAGIC 0x4178794e + +#define NYX_HOST_VERSION 2 +#define NYX_AGENT_VERSION 1 + +typedef struct host_config_s{ + uint32_t host_magic; + uint32_t host_version; + uint32_t bitmap_size; + uint32_t ijon_bitmap_size; + uint32_t payload_buffer_size; + uint32_t worker_id; + /* more to come */ +} __attribute__((packed)) host_config_t; + +typedef struct agent_config_s{ + uint32_t agent_magic; + uint32_t agent_version; + uint8_t agent_timeout_detection; + uint8_t agent_tracing; + uint8_t agent_ijon_tracing; + uint8_t agent_non_reload_mode; + uint64_t trace_buffer_vaddr; + uint64_t ijon_trace_buffer_vaddr; + uint32_t coverage_bitmap_size; + uint32_t input_buffer_size; // TODO: remove this later + + uint8_t dump_payloads; /* set by hypervisor */ + /* more to come */ +} __attribute__((packed)) agent_config_t; + +typedef struct kafl_dump_file_s{ + uint64_t file_name_str_ptr; + uint64_t data_ptr; + uint64_t bytes; + uint8_t append; +} __attribute__((packed)) kafl_dump_file_t; + + +enum nyx_cpu_type{ + unkown = 0, + nyx_cpu_v1, /* Nyx CPU used by KVM-PT */ + nyx_cpu_v2 /* Nyx CPU used by vanilla KVM + VMWare backdoor */ +}; + +#define cpuid(in,a,b,c,d)\ + asm("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in)); + +static int is_nyx_vcpu(void){ + unsigned long eax,ebx,ecx,edx; + char str[8]; + cpuid(0x80000004,eax,ebx,ecx,edx); + + for(int j=0;j<4;j++){ + str[j] = eax >> (8*j); + str[j+4] = ebx >> (8*j); + } + + return !memcmp(&str, "NYX vCPU", 8); +} + +static int get_nyx_cpu_type(void){ + unsigned long eax,ebx,ecx,edx; + char str[9]; + cpuid(0x80000004,eax,ebx,ecx,edx); + + for(int j=0;j<4;j++){ + str[j] = eax >> (8*j); + str[j+4] = ebx >> (8*j); + } + + if(memcmp(&str, "NYX vCPU", 8) != 0){ + return unkown; + } + + for(int j=0;j<4;j++){ + str[j] = ecx >> (8*j); + str[j+4] = edx >> (8*j); + } + + if(memcmp(&str, " (NO-PT)", 8) != 0){ + return nyx_cpu_v1; + } + + return nyx_cpu_v2; + + str[8] = 0; + printf("ECX: %s\n", str); +} + +typedef struct req_data_bulk_s{ + char file_name[256]; + uint64_t num_addresses; + uint64_t addresses[479]; +} req_data_bulk_t; + +#endif
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index aeeeb141..673c359 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -640,7 +640,7 @@ 'ios-simulator-full-configs': 'ios_simulator_debug_static_bot_xctest_reclient', 'ios-simulator-noncq': 'ios_simulator_debug_static_bot_xctest_reclient', 'mac-arm64-on-arm64-rel': 'mac_arm64_release_bot', - 'mac-arm64-rel': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl', + 'mac-arm64-rel': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient', 'mac-arm64-rel (reclient shadow)': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient', }, @@ -652,7 +652,7 @@ 'Linux ChromiumOS MSan Builder': 'chromeos_msan_release_bot_reclient', 'Linux MSan Builder': 'msan_release_bot_reclient', 'Linux TSan Builder': 'tsan_disable_nacl_release_bot_reclient', - 'Mac ASan 64 Builder': 'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on', + 'Mac ASan 64 Builder': 'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on_reclient', 'WebKit Linux ASAN': 'asan_lsan_release_bot_blink_reclient', 'WebKit Linux Leak': 'release_bot_blink_reclient', 'WebKit Linux MSAN': 'msan_release_bot_blink_reclient', @@ -1979,8 +1979,8 @@ 'asan', 'lsan', 'release_trybot_reclient', ], - 'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on': [ - 'asan', 'minimal_symbols', 'disable_nacl', 'release_bot', 'dcheck_always_on', + 'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on_reclient': [ + 'asan', 'minimal_symbols', 'disable_nacl', 'release_bot_reclient', 'dcheck_always_on', ], 'asan_v8_heap_debug_bot_hybrid_reclient': [
diff --git a/tools/mb/mb_config_expectations/chromium.mac.json b/tools/mb/mb_config_expectations/chromium.mac.json index 7e8ea1c..d116700 100644 --- a/tools/mb/mb_config_expectations/chromium.mac.json +++ b/tools/mb/mb_config_expectations/chromium.mac.json
@@ -125,7 +125,7 @@ "proprietary_codecs": true, "symbol_level": 1, "target_cpu": "arm64", - "use_goma": true + "use_remoteexec": true } }, "mac-arm64-rel (reclient shadow)": {
diff --git a/tools/mb/mb_config_expectations/chromium.memory.json b/tools/mb/mb_config_expectations/chromium.memory.json index 290c06db..175fd42c 100644 --- a/tools/mb/mb_config_expectations/chromium.memory.json +++ b/tools/mb/mb_config_expectations/chromium.memory.json
@@ -85,7 +85,7 @@ "is_component_build": false, "is_debug": false, "symbol_level": 1, - "use_goma": true + "use_remoteexec": true } }, "WebKit Linux ASAN": {
diff --git a/tools/metrics/actions/PRESUBMIT.py b/tools/metrics/actions/PRESUBMIT.py index 14abfad..656566e 100644 --- a/tools/metrics/actions/PRESUBMIT.py +++ b/tools/metrics/actions/PRESUBMIT.py
@@ -22,9 +22,12 @@ [input_api.python3_executable, 'extract_actions.py', '--presubmit'], cwd=cwd) if exit_code != 0: - return [output_api.PresubmitError( - 'actions.xml is not up to date or is not formatted correctly; ' - 'run tools/metrics/actions/extract_actions.py to fix')] + return [ + output_api.PresubmitError( + 'tools/metrics/actions/actions.xml is not up to date or is not ' + 'formatted correctly; run tools/metrics/actions/' + 'extract_actions.py to fix') + ] return []
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index a5b4032..8a4825636 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -20307,6 +20307,23 @@ </description> </action> +<action name="MobileTrackingPriceSettingsBack"> + <owner>danieltwhite@chromium.org</owner> + <owner>ajuma@chromium.org</owner> + <description> + Reported when user goes back from Tracking Price Settings UI to root + Settings screen. iOS only. + </description> +</action> + +<action name="MobileTrackingPriceSettingsClose"> + <owner>danieltwhite@chromium.org</owner> + <owner>ajuma@chromium.org</owner> + <description> + Reported when Tracking Price Settings UI was dismissed. iOS only. + </description> +</action> + <action name="MobileUsingMenuByHwButtonDragging"> <obsolete> Deprecated as of 06/2014. We removed this feature http://crbug.com/366154 .
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 03b9614..909d93cf 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -157,6 +157,7 @@ <int value="0" label="Presentation"/> <int value="1" label="Tab mirroring"/> <int value="2" label="Desktop mirroring"/> + <int value="3" label="Remote playback"/> </enum> <enum name="AccessCodeCastDialogCloseReason"> @@ -10809,7 +10810,7 @@ <int value="3" label="EH_BAD_EVENT_ID"/> <int value="4" label="AVG_BAD_INST_ID"/> <int value="5" label="AVG_BAD_EXT_ID"/> - <int value="6" label="AVG_NULL_AVG"/> + <int value="6" label="OBSOLETE_AVG_NULL_AVG"/> <int value="7" label="ESWMF_INVALID_DECREMENT_ACTIVITY"/> <int value="8" label="EFD_BAD_MESSAGE"/> <int value="9" label="EFD_BAD_MESSAGE_WORKER"/>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml index 177882cd..c799c8c0 100644 --- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml +++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -82,6 +82,18 @@ </summary> </histogram> +<histogram name="Bookmarks.AverageNodeSize" units="Bytes" + expires_after="2023-06-08"> + <owner>wylieb@chromium.org</owner> + <owner>chrome-collections@google.com</owner> + <component>UI>Browser>Bookmarks</component> + <summary> + Records the average size of bookmark nodes on disk. Approximated by dividing + the total size on disk by the number of non-folder nodes. Recorded at + startup when the bookmark model is loaded from disk. + </summary> +</histogram> + <histogram name="Bookmarks.BookmarkAllTabsWithTabsCount.Incognito" units="tabs" expires_after="2023-01-01"> <owner>roagarwal@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml index 3828a252..03fdbe97 100644 --- a/tools/metrics/histograms/metadata/event/histograms.xml +++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -238,6 +238,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.KeyPressed.TotalLatency metric (see crbug.com/1054021). + Time between the OS receiving a keyboard event and the resulting GPU frame swap. If no swap was induced by the event, no recording is made. Only recorded for key presses. @@ -252,6 +255,9 @@ <histogram name="Event.Latency.EndToEnd.Mouse" units="microseconds" expires_after="2020-11-08"> + <obsolete> + Removed in 2022-09. Replaced by EventLatency.Mouse*.TotalLatency metrics. + </obsolete> <owner>nzolghadr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -271,6 +277,9 @@ <owner>nzolghadr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.GesturePinch*.TotalLatency metrics (see crbug.com/1054021). + Time between the OS receiving a touchpad pinch event and the resulting GPU frame swap. If no swap was induced by the event, no recording is made. </summary> @@ -341,6 +350,10 @@ <histogram name="Event.Latency.Scroll.Wheel.TimeToHandled2" units="microseconds" expires_after="2021-12-19"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -367,6 +380,9 @@ <owner>gerchiko@microsoft.com</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between the display compositor receives the notification of the first ScrollUpdate gesture event in a given scroll gesture event sequence with scrollbar source induced renderer swap and GPU starts to swap. The name @@ -386,6 +402,10 @@ <histogram name="Event.Latency.ScrollBegin.Scrollbar.GpuSwap2" units="microseconds" expires_after="2022-08-29"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>gerchiko@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -406,6 +426,10 @@ <histogram name="Event.Latency.ScrollBegin.Scrollbar.HandledToRendererSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>gerchiko@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -427,6 +451,10 @@ <histogram name="Event.Latency.ScrollBegin.Scrollbar.RendererSwapToBrowserNotified2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>gerchiko@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -454,6 +482,9 @@ <owner>gerchiko@microsoft.com</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between initial creation of a scrollbar event and the first generated ScrollUpdate gesture event in a given scroll gesture event sequence is handled on main/impl thread (specified by suffix). If no swap was induced by @@ -477,6 +508,10 @@ <owner>input-dev@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.FirstGestureScrollUpdate.Scrollbar.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of an input event that resulted in a scrollbar scroll and the start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event if that ScrollUpdate is the first such @@ -498,6 +533,10 @@ units="microseconds" expires_after="2023-02-12"> <owner>nzolghadr@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.FirstGestureScrollUpdate.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a wheel/touch event and start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event if that ScrollUpdate is the first such event in a given scroll gesture event @@ -551,6 +590,10 @@ <histogram name="Event.Latency.ScrollBegin.Touch.BrowserNotifiedToBeforeGpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -573,6 +616,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between gpu starts to swap the first ScrollUpdate gesture event in a given scroll gesture event sequence with touch source induced frame and the swap finishes. @@ -589,6 +635,10 @@ <histogram name="Event.Latency.ScrollBegin.Touch.HandledToRendererSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -609,6 +659,10 @@ <histogram name="Event.Latency.ScrollBegin.Touch.RendererSwapToBrowserNotified2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -631,6 +685,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between initial creation of a touch event and the first generated ScrollBegin gesture event in a given scroll gesture event sequence is handled on main/impl thread (specified by suffix). If no swap was induced by @@ -653,6 +710,10 @@ <owner>input-dev@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.FirstGestureScrollUpdate.Touchscreen.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a touch event and the start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event if that ScrollUpdate is the first such event in a given scroll gesture event @@ -675,6 +736,10 @@ <histogram name="Event.Latency.ScrollBegin.Wheel.BrowserNotifiedToBeforeGpuSwap2" units="microseconds" expires_after="2022-07-03"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -688,6 +753,10 @@ <histogram name="Event.Latency.ScrollBegin.Wheel.GpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -707,6 +776,10 @@ <histogram name="Event.Latency.ScrollBegin.Wheel.HandledToRendererSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -727,6 +800,10 @@ <histogram name="Event.Latency.ScrollBegin.Wheel.RendererSwapToBrowserNotified2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -746,6 +823,10 @@ <histogram name="Event.Latency.ScrollBegin.Wheel.TimeToHandled2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -768,6 +849,10 @@ units="microseconds" expires_after="2023-01-15"> <owner>flackr@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.FirstGestureScrollUpdate.Wheel.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a wheel event and the start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event if that ScrollUpdate is the first such event in a given scroll gesture event @@ -786,6 +871,10 @@ <histogram name="Event.Latency.ScrollInertial.Touch.BrowserNotifiedToBeforeGpuSwap2" units="microseconds" expires_after="2022-06-19"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -799,6 +888,10 @@ <histogram name="Event.Latency.ScrollInertial.Touch.GpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -817,6 +910,10 @@ <histogram name="Event.Latency.ScrollInertial.Touch.HandledToRendererSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -837,6 +934,10 @@ <histogram name="Event.Latency.ScrollInertial.Touch.RendererSwapToBrowserNotified2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -856,6 +957,10 @@ <histogram name="Event.Latency.ScrollInertial.Touch.TimeToHandled2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -876,6 +981,10 @@ <histogram name="Event.Latency.ScrollInertial.Touch.TimeToScrollUpdateSwapBegin4" units="microseconds" expires_after="2022-07-31"> + <obsolete> + Removed in 2022-09. Replaced by + EventLatency.InertialGestureScrollUpdate.Touchscreen.TotalLatency. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -939,6 +1048,10 @@ <histogram name="Event.Latency.ScrollUpdate.Scrollbar.BrowserNotifiedToBeforeGpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>arakeri@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -962,6 +1075,10 @@ <histogram name="Event.Latency.ScrollUpdate.Scrollbar.GpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>arakeri@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -981,6 +1098,10 @@ <histogram name="Event.Latency.ScrollUpdate.Scrollbar.HandledToRendererSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>arakeri@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -1002,6 +1123,10 @@ <histogram name="Event.Latency.ScrollUpdate.Scrollbar.RendererSwapToBrowserNotified2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>arakeri@microsoft.com</owner> <owner>input-dev@chromium.org</owner> @@ -1029,6 +1154,9 @@ <owner>arakeri@microsoft.com</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between initial creation of an input event that results in a scrollbar scroll and the generated ScrollUpdate gesture event is handled on main/impl thread (specified by suffix). If no swap was induced by the ScrollUpdate @@ -1052,6 +1180,10 @@ <owner>input-dev@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.GestureScrollUpdate.Scrollbar.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a scrollbar event and start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event. If no swap was induced by the event, no recording is made. The first GSU of @@ -1072,6 +1204,10 @@ units="microseconds" expires_after="2023-03-05"> <owner>nzolghadr@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.GestureScrollUpdate.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a wheel/touch event and start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event. If no swap was induced by the event, no recording is made. The first GSU of @@ -1205,6 +1341,10 @@ <histogram name="Event.Latency.ScrollUpdate.Touch.BrowserNotifiedToBeforeGpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -1226,6 +1366,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between gpu starts to swap a ScrollUpdate gesture event with touch source induced frame and the swap finishes. @@ -1244,6 +1387,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between the ScrollUpdate gesture event with touch source, is handled on main/impl thread (specified by suffix) and before renderer starts to swap. This is recorded each time a user touch scroll is swapped to the display. @@ -1264,6 +1410,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between the renderer starts to swap a frame induced by ScrollUpdate gesture event with touch source, and browser receives the swap notification. @@ -1282,6 +1431,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between initial creation of a touch event and the generated ScrollUpdate gesture event is handled on main/impl thread (specified by suffix). If no swap was induced by the ScrollUpdate gesture event, no @@ -1299,15 +1451,17 @@ <histogram name="Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin4{TopControlsState}" - units="microseconds" expires_after="never"> -<!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) --> - + units="microseconds" expires_after="2023-06-30"> <owner>flackr@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>input-dev@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <owner>chrome-analysis-team@google.com</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.GestureScrollUpdate.Touchscreen.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a touch event and start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event. If no swap was induced by the event, no recording is made. The first GSU of every @@ -1330,6 +1484,10 @@ <histogram name="Event.Latency.ScrollUpdate.Wheel.BrowserNotifiedToBeforeGpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -1348,6 +1506,10 @@ <histogram name="Event.Latency.ScrollUpdate.Wheel.GpuSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -1366,6 +1528,10 @@ <histogram name="Event.Latency.ScrollUpdate.Wheel.HandledToRendererSwap2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -1387,6 +1553,10 @@ <histogram name="Event.Latency.ScrollUpdate.Wheel.RendererSwapToBrowserNotified2" units="microseconds" expires_after="2022-06-01"> + <obsolete> + Removed in 2022-09. Replaced by Graphics.Smoothness.EventLatency UKM + metrics. + </obsolete> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -1408,6 +1578,9 @@ <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of Graphics.Smoothness.EventLatency + UKM metrics (see crbug.com/1054021). + Time between initial creation of a wheel event and the generated ScrollUpdate gesture event is handled on main/impl thread (specified by suffix). If no swap was induced by the ScrollUpdate gesture event, no @@ -1429,6 +1602,10 @@ units="microseconds" expires_after="2023-01-15"> <owner>flackr@chromium.org</owner> <summary> + NOTE: This metric is deprecated in favor of + EventLatency.GestureScrollUpdate.Wheel.TotalLatency metric (see + crbug.com/1054021). + Time between initial creation of a wheel event and start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event. If no swap was induced by the event, no recording is made. The first GSU of every
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml index e82ff14..478e123a 100644 --- a/tools/metrics/histograms/metadata/memory/histograms.xml +++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -2558,7 +2558,7 @@ </histogram> <histogram - name="Memory.Total.PrivateMemoryFootprintVisiblePriorityOrHigherRenderers" + name="Memory.Total.PrivateMemoryFootprintVisibleOrHigherPriorityRenderers" units="MB" expires_after="2022-12-11"> <owner>ckitagawa@chromium.org</owner> <owner>yfriedman@chromium.org</owner> @@ -2616,7 +2616,7 @@ </histogram> <histogram - name="Memory.Total.RendererPrivateMemoryFootprintVisiblePriorityOrHigher" + name="Memory.Total.RendererPrivateMemoryFootprintVisibleOrHigherPriority" units="MB" expires_after="2022-12-11"> <owner>ckitagawa@chromium.org</owner> <owner>yfriedman@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml index 61fb6fde..8558263 100644 --- a/tools/metrics/histograms/metadata/permissions/histograms.xml +++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -433,7 +433,7 @@ </histogram> <histogram name="Permissions.Engagement.Dismissed" units="%" - expires_after="2022-08-25"> + expires_after="2023-03-05"> <owner>engedy@chromium.org</owner> <owner>src/components/permissions/PERMISSIONS_OWNERS</owner> <summary>
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn index 82c2a22..976f082 100644 --- a/ui/accessibility/BUILD.gn +++ b/ui/accessibility/BUILD.gn
@@ -232,12 +232,12 @@ static_library("test_support") { testonly = true sources = [ - "platform/test_ax_tree_update.cc", - "platform/test_ax_tree_update.h", "test_ax_node_helper.cc", "test_ax_node_helper.h", "test_ax_tree_manager.cc", "test_ax_tree_manager.h", + "test_ax_tree_update.cc", + "test_ax_tree_update.h", "test_ax_tree_update_json_reader.cc", "test_ax_tree_update_json_reader.h", "tree_generator.cc",
diff --git a/ui/accessibility/platform/ax_android_constants.cc b/ui/accessibility/platform/ax_android_constants.cc index 7129177..8510515 100644 --- a/ui/accessibility/platform/ax_android_constants.cc +++ b/ui/accessibility/platform/ax_android_constants.cc
@@ -41,4 +41,7 @@ const char kAXWebViewClassname[] = "android.webkit.WebView"; const char16_t kSecurePasswordBullet = 0x2022; +// Value should match static constant View.NO_ID in android.view.View. +const int kAXAndroidInvalidViewId = -1; + } // namespace ui
diff --git a/ui/accessibility/platform/ax_android_constants.h b/ui/accessibility/platform/ax_android_constants.h index b786d56..7097da0 100644 --- a/ui/accessibility/platform/ax_android_constants.h +++ b/ui/accessibility/platform/ax_android_constants.h
@@ -44,6 +44,10 @@ AX_EXPORT extern const char kAXWebViewClassname[]; AX_EXPORT extern const char16_t kSecurePasswordBullet; +// View constants. + +AX_EXPORT extern const int kAXAndroidInvalidViewId; + } // namespace ui #endif // UI_ACCESSIBILITY_PLATFORM_AX_ANDROID_CONSTANTS_H_
diff --git a/ui/accessibility/platform/ax_platform_node_base_unittest.cc b/ui/accessibility/platform/ax_platform_node_base_unittest.cc index 1cae0a45..4378375 100644 --- a/ui/accessibility/platform/ax_platform_node_base_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_base_unittest.cc
@@ -7,7 +7,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/platform/ax_platform_node_unittest.h" #include "ui/accessibility/platform/test_ax_node_wrapper.h" -#include "ui/accessibility/platform/test_ax_tree_update.h" +#include "ui/accessibility/test_ax_tree_update.h" using ax::mojom::Role; using ax::mojom::State;
diff --git a/ui/accessibility/platform/ax_platform_node_unittest.cc b/ui/accessibility/platform/ax_platform_node_unittest.cc index 95943f2f2..5b0be24 100644 --- a/ui/accessibility/platform/ax_platform_node_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_unittest.cc
@@ -7,7 +7,7 @@ #include "ui/accessibility/ax_constants.mojom.h" #include "ui/accessibility/platform/ax_platform_node_base.h" #include "ui/accessibility/platform/test_ax_node_wrapper.h" -#include "ui/accessibility/platform/test_ax_tree_update.h" +#include "ui/accessibility/test_ax_tree_update.h" namespace ui {
diff --git a/ui/accessibility/platform/inspect/ax_transform_mac.h b/ui/accessibility/platform/inspect/ax_transform_mac.h index ec00dda..eef51eb 100644 --- a/ui/accessibility/platform/inspect/ax_transform_mac.h +++ b/ui/accessibility/platform/inspect/ax_transform_mac.h
@@ -33,24 +33,25 @@ // Returns the base::Value representation of nil. AX_EXPORT base::Value AXNilToBaseValue(); -// Returns the base::Value representation of the given NSArray. -AX_EXPORT base::Value AXNSArrayToBaseValue(NSArray*, const AXTreeIndexerMac*); +// Returns the base::Value::List representation of the given NSArray. +AX_EXPORT base::Value::List AXNSArrayToBaseValue(NSArray*, + const AXTreeIndexerMac*); -// Returns the base::Value representation of the given NSDictionary. -AX_EXPORT base::Value AXNSDictionaryToBaseValue(NSDictionary*, - const AXTreeIndexerMac*); +// Returns the base::Value::Dict representation of the given NSDictionary. +AX_EXPORT base::Value::Dict AXNSDictionaryToBaseValue(NSDictionary*, + const AXTreeIndexerMac*); -// Returns the base::Value representation of the given NSPoint. -AX_EXPORT base::Value AXNSPointToBaseValue(NSPoint); +// Returns the base::Value::Dict representation of the given NSPoint. +AX_EXPORT base::Value::Dict AXNSPointToBaseValue(NSPoint); -// Returns the base::Value representation of the given NSSize. -AX_EXPORT base::Value AXNSSizeToBaseValue(NSSize); +// Returns the base::Value::Dict representation of the given NSSize. +AX_EXPORT base::Value::Dict AXNSSizeToBaseValue(NSSize); -// Returns the base::Value representation of the given NSRect. -AX_EXPORT base::Value AXNSRectToBaseValue(NSRect); +// Returns the base::Value::Dict representation of the given NSRect. +AX_EXPORT base::Value::Dict AXNSRectToBaseValue(NSRect); -// Returns the base::Value representation of the given NSRange. -AX_EXPORT base::Value AXNSRangeToBaseValue(NSRange); +// Returns the base::Value::Dict representation of the given NSRange. +AX_EXPORT base::Value::Dict AXNSRangeToBaseValue(NSRange); } // namespace ui
diff --git a/ui/accessibility/platform/inspect/ax_transform_mac.mm b/ui/accessibility/platform/inspect/ax_transform_mac.mm index 7c5118e..fe043e6 100644 --- a/ui/accessibility/platform/inspect/ax_transform_mac.mm +++ b/ui/accessibility/platform/inspect/ax_transform_mac.mm
@@ -31,12 +31,13 @@ // NSArray if ([value isKindOfClass:[NSArray class]]) { - return AXNSArrayToBaseValue((NSArray*)value, indexer); + return base::Value(AXNSArrayToBaseValue((NSArray*)value, indexer)); } // NSDictionary if ([value isKindOfClass:[NSDictionary class]]) { - return AXNSDictionaryToBaseValue((NSDictionary*)value, indexer); + return base::Value( + AXNSDictionaryToBaseValue((NSDictionary*)value, indexer)); } // NSNumber @@ -47,10 +48,10 @@ // NSRange, NSSize if ([value isKindOfClass:[NSValue class]]) { if (0 == strcmp([value objCType], @encode(NSRange))) { - return AXNSRangeToBaseValue([value rangeValue]); + return base::Value(AXNSRangeToBaseValue([value rangeValue])); } if (0 == strcmp([value objCType], @encode(NSSize))) { - return AXNSSizeToBaseValue([value sizeValue]); + return base::Value(AXNSSizeToBaseValue([value sizeValue])); } } @@ -61,25 +62,25 @@ case kAXValueCGPointType: { NSPoint point; if (AXValueGetValue(static_cast<AXValueRef>(value), type, &point)) { - return AXNSPointToBaseValue(point); + return base::Value(AXNSPointToBaseValue(point)); } } break; case kAXValueCGSizeType: { NSSize size; if (AXValueGetValue(static_cast<AXValueRef>(value), type, &size)) { - return AXNSSizeToBaseValue(size); + return base::Value(AXNSSizeToBaseValue(size)); } } break; case kAXValueCGRectType: { NSRect rect; if (AXValueGetValue(static_cast<AXValueRef>(value), type, &rect)) { - return AXNSRectToBaseValue(rect); + return base::Value(AXNSRectToBaseValue(rect)); } } break; case kAXValueCFRangeType: { NSRange range; if (AXValueGetValue(static_cast<AXValueRef>(value), type, &range)) { - return AXNSRangeToBaseValue(range); + return base::Value(AXNSRangeToBaseValue(range)); } } break; default: @@ -144,14 +145,14 @@ break; } - base::Value value(base::Value::Type::DICTIONARY); - value.SetPath(AXMakeSetKey(AXMakeOrderedKey("anchor", 0)), - AXElementToBaseValue(static_cast<id>(cocoa_anchor), indexer)); - value.SetIntPath(AXMakeSetKey(AXMakeOrderedKey("offset", 1)), - position->text_offset()); - value.SetStringPath(AXMakeSetKey(AXMakeOrderedKey("affinity", 2)), - AXMakeConst(affinity)); - return value; + base::Value::Dict value; + value.Set(AXMakeSetKey(AXMakeOrderedKey("anchor", 0)), + AXElementToBaseValue(static_cast<id>(cocoa_anchor), indexer)); + value.Set(AXMakeSetKey(AXMakeOrderedKey("offset", 1)), + position->text_offset()); + value.Set(AXMakeSetKey(AXMakeOrderedKey("affinity", 2)), + AXMakeConst(affinity)); + return base::Value(std::move(value)); } base::Value AXTextMarkerToBaseValue(id text_marker, @@ -166,71 +167,71 @@ if (ax_range.IsNull()) return AXNilToBaseValue(); - base::Value value(base::Value::Type::DICTIONARY); - value.SetPath("anchor", - AXPositionToBaseValue(ax_range.anchor()->Clone(), indexer)); - value.SetPath("focus", - AXPositionToBaseValue(ax_range.focus()->Clone(), indexer)); - return value; + base::Value::Dict value; + value.Set("anchor", + AXPositionToBaseValue(ax_range.anchor()->Clone(), indexer)); + value.Set("focus", AXPositionToBaseValue(ax_range.focus()->Clone(), indexer)); + return base::Value(std::move(value)); } base::Value AXNilToBaseValue() { return base::Value(kNilValue); } -base::Value AXNSArrayToBaseValue(NSArray* node_array, - const AXTreeIndexerMac* indexer) { - base::Value list(base::Value::Type::LIST); +base::Value::List AXNSArrayToBaseValue(NSArray* node_array, + const AXTreeIndexerMac* indexer) { + base::Value::List list; for (NSUInteger i = 0; i < [node_array count]; i++) list.Append(AXNSObjectToBaseValue([node_array objectAtIndex:i], indexer)); return list; } -base::Value AXNSDictionaryToBaseValue(NSDictionary* dictionary_value, - const AXTreeIndexerMac* indexer) { - base::Value dictionary(base::Value::Type::DICTIONARY); +base::Value::Dict AXNSDictionaryToBaseValue(NSDictionary* dictionary_value, + const AXTreeIndexerMac* indexer) { + base::Value::Dict dictionary; for (NSString* key in dictionary_value) { - dictionary.SetPath(base::SysNSStringToUTF8(key), - AXNSObjectToBaseValue(dictionary_value[key], indexer)); + dictionary.SetByDottedPath( + base::SysNSStringToUTF8(key), + AXNSObjectToBaseValue(dictionary_value[key], indexer)); } return dictionary; } -base::Value AXNSPointToBaseValue(NSPoint point_value) { - base::Value point(base::Value::Type::DICTIONARY); - point.SetIntPath(kXCoordDictKey, static_cast<int>(point_value.x)); - point.SetIntPath(kYCoordDictKey, static_cast<int>(point_value.y)); +base::Value::Dict AXNSPointToBaseValue(NSPoint point_value) { + base::Value::Dict point; + point.Set(kXCoordDictKey, static_cast<int>(point_value.x)); + point.Set(kYCoordDictKey, static_cast<int>(point_value.y)); return point; } -base::Value AXNSSizeToBaseValue(NSSize size_value) { - base::Value size(base::Value::Type::DICTIONARY); - size.SetIntPath(AXMakeOrderedKey(kWidthDictKey, 0), - static_cast<int>(size_value.width)); - size.SetIntPath(AXMakeOrderedKey(kHeightDictKey, 1), - static_cast<int>(size_value.height)); +base::Value::Dict AXNSSizeToBaseValue(NSSize size_value) { + base::Value::Dict size; + size.Set(AXMakeOrderedKey(kWidthDictKey, 0), + static_cast<int>(size_value.width)); + size.Set(AXMakeOrderedKey(kHeightDictKey, 1), + static_cast<int>(size_value.height)); return size; } -base::Value AXNSRectToBaseValue(NSRect rect_value) { - base::Value rect(base::Value::Type::DICTIONARY); - rect.SetIntPath(AXMakeOrderedKey(kXCoordDictKey, 0), - static_cast<int>(rect_value.origin.x)); - rect.SetIntPath(AXMakeOrderedKey(kYCoordDictKey, 1), - static_cast<int>(rect_value.origin.y)); - rect.SetIntPath(AXMakeOrderedKey(kWidthDictKey, 2), - static_cast<int>(rect_value.size.width)); - rect.SetIntPath(AXMakeOrderedKey(kHeightDictKey, 3), - static_cast<int>(rect_value.size.height)); +base::Value::Dict AXNSRectToBaseValue(NSRect rect_value) { + base::Value::Dict rect; + rect.Set(AXMakeOrderedKey(kXCoordDictKey, 0), + static_cast<int>(rect_value.origin.x)); + rect.Set(AXMakeOrderedKey(kYCoordDictKey, 1), + static_cast<int>(rect_value.origin.y)); + rect.Set(AXMakeOrderedKey(kWidthDictKey, 2), + static_cast<int>(rect_value.size.width)); + rect.Set(AXMakeOrderedKey(kHeightDictKey, 3), + static_cast<int>(rect_value.size.height)); return rect; } -base::Value AXNSRangeToBaseValue(NSRange node_range) { - base::Value range(base::Value::Type::DICTIONARY); - range.SetIntPath(AXMakeOrderedKey(kRangeLocDictKey, 0), - static_cast<int>(node_range.location)); - range.SetIntPath(AXMakeOrderedKey(kRangeLenDictKey, 1), - static_cast<int>(node_range.length)); +base::Value::Dict AXNSRangeToBaseValue(NSRange node_range) { + base::Value::Dict range; + range.Set(AXMakeOrderedKey(kRangeLocDictKey, 0), + static_cast<int>(node_range.location)); + range.Set(AXMakeOrderedKey(kRangeLenDictKey, 1), + static_cast<int>(node_range.length)); return range; }
diff --git a/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h index f25dcbf5..260b61cf 100644 --- a/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h +++ b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h
@@ -62,8 +62,8 @@ const AXPropertyNode& property_node, const AXTreeIndexerMac* indexer) const; - base::Value PopulateLocalPosition(const AXElementWrapper& ax_element, - const NSRect& root_rect) const; + base::Value::Dict PopulateLocalPosition(const AXElementWrapper& ax_element, + const NSRect& root_rect) const; std::string ProcessTreeForOutput( const base::DictionaryValue& node) const override;
diff --git a/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm index 1db5b10..b5e036b 100644 --- a/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm +++ b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm
@@ -250,7 +250,7 @@ } } -base::Value AXTreeFormatterMac::PopulateLocalPosition( +base::Value::Dict AXTreeFormatterMac::PopulateLocalPosition( const AXElementWrapper& ax_element, const NSRect& root_rect) const { // The NSAccessibility position of an object is in global coordinates and
diff --git a/ui/accessibility/platform/test_ax_tree_update.cc b/ui/accessibility/test_ax_tree_update.cc similarity index 96% rename from ui/accessibility/platform/test_ax_tree_update.cc rename to ui/accessibility/test_ax_tree_update.cc index 7a646a2f..db833fd 100644 --- a/ui/accessibility/platform/test_ax_tree_update.cc +++ b/ui/accessibility/test_ax_tree_update.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/accessibility/platform/test_ax_tree_update.h" +#include "ui/accessibility/test_ax_tree_update.h" namespace ui {
diff --git a/ui/accessibility/platform/test_ax_tree_update.h b/ui/accessibility/test_ax_tree_update.h similarity index 88% rename from ui/accessibility/platform/test_ax_tree_update.h rename to ui/accessibility/test_ax_tree_update.h index 1eb1cc9a..d9b21082 100644 --- a/ui/accessibility/platform/test_ax_tree_update.h +++ b/ui/accessibility/test_ax_tree_update.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_ACCESSIBILITY_PLATFORM_TEST_AX_TREE_UPDATE_H_ -#define UI_ACCESSIBILITY_PLATFORM_TEST_AX_TREE_UPDATE_H_ +#ifndef UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_H_ +#define UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_H_ #include "ui/accessibility/ax_tree_update.h" @@ -14,7 +14,7 @@ // updating simple accessibility trees. // Used to construct AXTreeUpdate node. -struct TestAXTreeUpdateNode { +struct TestAXTreeUpdateNode final { TestAXTreeUpdateNode() = delete; ~TestAXTreeUpdateNode(); @@ -51,4 +51,4 @@ } // namespace ui -#endif // UI_ACCESSIBILITY_PLATFORM_TEST_AX_TREE_UPDATE_H_ +#endif // UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_H_
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index 0a7b269..36967690 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">عرض تقديمي من PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> كيلوبايت</translation> <translation id="4789067489790477934">يمكنك منح نظام Parallels Desktop الإذن للوصول إلى الملفات في Google Drive. وستتمّ مزامنة التغييرات مع الأجهزة الأخرى.</translation> +<translation id="4790766916287588578">الهندية باستخدام لوحة مفاتيح InScript</translation> <translation id="4801956050125744859">الاحتفاظ بالاثنتين</translation> <translation id="4804827417948292437">أفوكادو</translation> <translation id="4823651846660089135">الجهاز للقراءة فقط</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_as.xtb b/ui/chromeos/translations/ui_chromeos_strings_as.xtb index 64d38dc2..d5e53f09 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_as.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint উপস্থাপন</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> কেবি</translation> <translation id="4789067489790477934">Parallels Desktopক আপোনাৰ Google Driveত থকা ফাইল এক্সেছ কৰিবলৈ অনুমতি দিয়ক। সালসলনিসমূহ আপোনাৰ অন্য ডিভাইচৰ সৈতে ছিংক হ’ব।</translation> +<translation id="4790766916287588578">InScript কীব’ৰ্ডৰ সৈতে হিন্দী</translation> <translation id="4801956050125744859">দুয়োটাই ৰাখক</translation> <translation id="4804827417948292437">এভ‘কাড‘</translation> <translation id="4823651846660089135">ডিভাইচটো কেৱল পঢ়িব পৰা</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index ecb8b84..4b72f17 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Презентация в PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> КБ</translation> <translation id="4789067489790477934">Даване на Parallels Desktop на достъп до файловете в профила ви в Google Диск. Промените ще се синхронизират с другите ви устройства.</translation> +<translation id="4790766916287588578">Хинди с клавиатура InScript</translation> <translation id="4801956050125744859">Запазванe на двете версии</translation> <translation id="4804827417948292437">Авокадо</translation> <translation id="4823651846660089135">Устройството е само за четене</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index d2b6be43..489217c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Presentació de PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> kB</translation> <translation id="4789067489790477934">Dona permís a Parallels Desktop per accedir als teus fitxers de Google Drive. Els canvis se sincronitzaran amb els altres dispositius.</translation> +<translation id="4790766916287588578">Hindi amb teclat InScript</translation> <translation id="4801956050125744859">Mantén-les totes dues</translation> <translation id="4804827417948292437">Alvocat</translation> <translation id="4823651846660089135">El dispositiu és només de lectura</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb index 2f5ebb3..8bd82ca 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Cyflwyniad PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Rhoi caniatâd i Parallels Desktop gael mynediad at eich ffeiliau yn eich Google Drive. Bydd newidiadau yn cysoni â'ch dyfeisiau eraill.</translation> +<translation id="4790766916287588578">Hindi gyda bysellfwrdd InScript</translation> <translation id="4801956050125744859">Cadw'r ddau</translation> <translation id="4804827417948292437">Afocado</translation> <translation id="4823651846660089135">Darllen yn unig yw'r ddyfais</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index 9076a64d..c881a61 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint-præsentation</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> kB</translation> <translation id="4789067489790477934">Giv Parallels Desktop adgang til filer i Google Drev. Ændringer synkroniseres med dine andre enheder.</translation> +<translation id="4790766916287588578">Hindi med InScript-tastatur</translation> <translation id="4801956050125744859">Behold begge</translation> <translation id="4804827417948292437">Avocado</translation> <translation id="4823651846660089135">Enheden er skrivebeskyttet</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb index db61e7c..e3f4e938 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint-Präsentation</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Parallels Desktop erlauben, auf Dateien in Google Drive zuzugreifen. Änderungen werden mit deinen anderen Geräten synchronisiert.</translation> +<translation id="4790766916287588578">Hindi mit InScript-Tastatur</translation> <translation id="4801956050125744859">Beide behalten</translation> <translation id="4804827417948292437">Avocado</translation> <translation id="4823651846660089135">Gerät ist schreibgeschützt</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb index 4ca61c4e..5f2fe66 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint aurkezpena</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> kB</translation> <translation id="4789067489790477934">Eman Google Drive-ko fitxategiak atzitzeko baimena Parallels Desktop-i. Aldaketak beste gailuekin sinkronizatuko dira.</translation> +<translation id="4790766916287588578">Hindia, InScript teklatuarekin</translation> <translation id="4801956050125744859">Mantendu biak</translation> <translation id="4804827417948292437">Ahuakatea</translation> <translation id="4823651846660089135">Gailua irakurtzeko soilik da</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb index ab51e20..5fbf3e8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">ارائه PowerPoint </translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> کیلوبایت</translation> <translation id="4789067489790477934">به Parallels Desktop اجازه دهید به فایلهای Google Drive شما دسترسی داشته باشد. تغییرات در دیگر دستگاههایتان همگامسازی خواهد شد.</translation> +<translation id="4790766916287588578">هندی با صفحهکلید هندی</translation> <translation id="4801956050125744859">حفظ هر دو</translation> <translation id="4804827417948292437">آووکادو</translation> <translation id="4823651846660089135">دستگاه فقط خواندنی است</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index 68a9eda..9a6b250 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint-esitys</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> kt</translation> <translation id="4789067489790477934">Myönnä Parallels Desktopille pääsy Google Driveesi tallennetuille tiedostoille. Muutokset synkronoidaan muille laitteillesi.</translation> +<translation id="4790766916287588578">hindi, InScript-näppäimistö</translation> <translation id="4801956050125744859">Pidä molemmat</translation> <translation id="4804827417948292437">Avokado</translation> <translation id="4823651846660089135">Laite on vain luku ‑tilassa.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index 4af267d7..d751afde 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Presentation ng PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Bigyan ng pahintulot ang Parallels Desktop na ma-access ang mga file sa iyong Google Drive. Masi-sync sa iba mo pang device ang mga pagbabago.</translation> +<translation id="4790766916287588578">Hindi na may InScript keyboard</translation> <translation id="4801956050125744859">Panatilihin pareho</translation> <translation id="4804827417948292437">Abukado</translation> <translation id="4823651846660089135">Read-only ang device</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb index 2dba9e1..b40d2657 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint પ્રસ્તુતિ</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Parallels ડેસ્કટૉપને તમારી Google Driveમાંની ફાઇલોને ઍક્સેસ કરવાની પરવાનગી આપો. ફેરફારો તમારા બીજા ડિવાઇસ સાથે સિંક થશે.</translation> +<translation id="4790766916287588578">હિન્દી, ઇનસ્ક્રિપ્ટ કીબોર્ડ સાથે</translation> <translation id="4801956050125744859">બંનેને રાખો</translation> <translation id="4804827417948292437">એવોકેડો</translation> <translation id="4823651846660089135">ઉપકરણ ફક્ત વાંચવા માટે છે</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb index 13c3915..f2ef2ab 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint प्रस्तुतिकरण</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> केबी</translation> <translation id="4789067489790477934">Parallels Desktop को Google Drive में सेव की गई फ़ाइलें ऐक्सेस करने की अनुमति दें. बदलावों को आपके दूसरे डिवाइस में सिंक किया जाएगा.</translation> +<translation id="4790766916287588578">हिन्दी वाला इनस्क्रिप्ट कीबोर्ड</translation> <translation id="4801956050125744859">दोनों रखें</translation> <translation id="4804827417948292437">एवोकैडो</translation> <translation id="4823651846660089135">डिवाइस केवल-पढ़ने के लिए है</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index 3dcaa99e..f22e4e7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -421,6 +421,7 @@ <translation id="4784330909746505604">מצגת PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">מתן הרשאת גישה ל-Parallels Desktop לקבצים ב-Google Drive. השינויים יסתנכרנו עם המכשירים האחרים שלך.</translation> +<translation id="4790766916287588578">הינדי עם מקלדת InScript</translation> <translation id="4801956050125744859">שמירת שתיהן</translation> <translation id="4804827417948292437">אבוקדו</translation> <translation id="4823651846660089135">המכשיר מוגדר לקריאה בלבד</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb index 96e03628..afca5144 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint 프레젠테이션</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" />KB</translation> <translation id="4789067489790477934">Parallels Desktop이 Google Drive의 파일에 액세스하도록 허용합니다. 변경사항은 다른 기기에 동기화됩니다.</translation> +<translation id="4790766916287588578">힌디어(인스크립트 키보드)</translation> <translation id="4801956050125744859">모두 보관</translation> <translation id="4804827417948292437">아보카도</translation> <translation id="4823651846660089135">읽기 전용 기기</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index ac03cfa..39c9a3c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">„PowerPoint“ pristatymas</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Suteikite „Parallels Desktop“ leidimą pasiekti failus „Google“ diske. Pakeitimai bus sinchronizuoti su kitais jūsų įrenginiais.</translation> +<translation id="4790766916287588578">Hindi k. su „InScript“ klaviatūra</translation> <translation id="4801956050125744859">Palikti abu</translation> <translation id="4804827417948292437">Avokadas</translation> <translation id="4823651846660089135">Įrenginys yra tik skaitomas</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_my.xtb b/ui/chromeos/translations/ui_chromeos_strings_my.xtb index 053f09d5..534796d01 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_my.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_my.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint တင်ဆက်ပြသခြင်း</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">သင်၏ Google Drive ရှိ ဖိုင်များကို Parallels Desktop အား အသုံးပြုခွင့်ပေးမည်။ ပြောင်းလဲမှုများကို သင်၏အခြားစက်များနှင့် စင့်ခ်လုပ်သွားပါမည်။</translation> +<translation id="4790766916287588578">InScript ကီးဘုတ်ဖြင့် ဟင်ဒီ</translation> <translation id="4801956050125744859">နှစ်ခုစလုံးကို ထားရှိရန်</translation> <translation id="4804827417948292437">ထောပတ်သီး</translation> <translation id="4823651846660089135">စက်ပစ္စည်းကို ဖတ်ခွင့်သာရှိသည်</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb index 0f21105..263106f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint-presentatie</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Parallels Desktop toegang geven tot bestanden in je Google Drive. Wijzigingen worden gesynchroniseerd met je andere apparaten.</translation> +<translation id="4790766916287588578">Hindi met InScript-toetsenbord</translation> <translation id="4801956050125744859">Beide behouden</translation> <translation id="4804827417948292437">Avocado</translation> <translation id="4823651846660089135">Apparaat is alleen-lezen</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 63dce68..8c891559 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Prezentacja PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Przyznaj aplikacji Parallels Desktop uprawnienia dostępu do plików na Dysku Google. Zmiany będą synchronizowane z innymi urządzeniami.</translation> +<translation id="4790766916287588578">Hindi z klawiaturą InScript</translation> <translation id="4801956050125744859">Zachowaj obie pozycje</translation> <translation id="4804827417948292437">Awokado</translation> <translation id="4823651846660089135">Urządzenie tylko do odczytu</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index bb66b8a..03918e8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Prezentare PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Acordă Parallels Desktop permisiunea de a accesa fișiere din Google Drive. Modificările se vor sincroniza cu celelalte dispozitive care îți aparțin.</translation> +<translation id="4790766916287588578">Tastatură hindi InScript</translation> <translation id="4801956050125744859">Păstrați-le pe amândouă</translation> <translation id="4804827417948292437">Avocado</translation> <translation id="4823651846660089135">Dispozitivul este numai în citire</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb index 206dfad..c2a5ca54 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Презентация PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> КБ</translation> <translation id="4789067489790477934">Parallels Desktop сможет получать доступ к файлам на Google Диске. Изменения вступят в силу на всех ваших устройствах.</translation> +<translation id="4790766916287588578">Хинди, раскладка InScript</translation> <translation id="4801956050125744859">Оставить обе версии</translation> <translation id="4804827417948292437">Авокадо</translation> <translation id="4823651846660089135">Устройство доступно только для чтения</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index 9fc7fae..c779287 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Prezentácia aplikácie PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> kB</translation> <translation id="4789067489790477934">Povoľte aplikácii Parallels Desktop prístup k súborom na vašom Disku Google. Zmeny sa budú synchronizovať do vašich ďalších zariadení.</translation> +<translation id="4790766916287588578">Hindská klávesnica s rozložením InScript</translation> <translation id="4801956050125744859">Ponechať obidve</translation> <translation id="4804827417948292437">Avokádo</translation> <translation id="4823651846660089135">Zariadenie je len na čítanie</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index b16fe64..87f3c64 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPointova predstavitev</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Programu Parallels Desktop dovolite dostop do datotek v Googlu Drive. Spremembe bodo sinhronizirane z drugimi napravami.</translation> +<translation id="4790766916287588578">hindijščina s tipkovnico InScript</translation> <translation id="4801956050125744859">Obdrži obe</translation> <translation id="4804827417948292437">Avokado</translation> <translation id="4823651846660089135">Naprava je samo za branje</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 8f1c374f..07c7c1d3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint sunusu</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Parallels Desktop'a Google Drive'ınızdaki dosyalara erişim izni verin. Değişiklikler, diğer cihazlarınızla senkronize edilecektir.</translation> +<translation id="4790766916287588578">Hintçe, Alfabetik klavye</translation> <translation id="4801956050125744859">Her ikisini de sakla</translation> <translation id="4804827417948292437">Avokado</translation> <translation id="4823651846660089135">Cihaz salt okunur</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb index 7e1c3cb..9c123af 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">Презентація PowerPoint</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> КБ</translation> <translation id="4789067489790477934">Надати додатку Parallels Desktop доступ до файлів на Google Диску. Зміни буде синхронізовано на інших ваших пристроях.</translation> +<translation id="4790766916287588578">Гінді, розкладка InScript</translation> <translation id="4801956050125744859">Залишити обидві версії</translation> <translation id="4804827417948292437">Авокадо</translation> <translation id="4823651846660089135">Пристрій лише для перегляду</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index 51d3575..3c38048 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint پیشکش</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Parallels ڈیسک ٹاپ کو اپنے Google Drive میں فائلز تک رسائی کی اجازت دیں۔ آپ کے دیگر آلات پر تبدیلیوں کی مطابقت پذیری کی جائے گی۔</translation> +<translation id="4790766916287588578">InScript کی بورڈ کے ساتھ ہندی</translation> <translation id="4801956050125744859">دونوں کو برقرار رکھیں</translation> <translation id="4804827417948292437">مَگَر ناشپاتی</translation> <translation id="4823651846660089135">آلہ صرف پڑھنے کیلئے ہے</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index f8f0485..47e2b88 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -424,6 +424,7 @@ <translation id="4784330909746505604">PowerPoint 簡報</translation> <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">授權 Parallels Desktop 存取您「Google 雲端硬碟」中的檔案。變更將會同步至您的其他裝置。</translation> +<translation id="4790766916287588578">印度文 (InScript 鍵盤)</translation> <translation id="4801956050125744859">兩個版本都保留</translation> <translation id="4804827417948292437">牛油果</translation> <translation id="4823651846660089135">裝置處於唯讀模式</translation>
diff --git a/ui/display/display_change_notifier.cc b/ui/display/display_change_notifier.cc index b22aac1e..f9fbe67 100644 --- a/ui/display/display_change_notifier.cc +++ b/ui/display/display_change_notifier.cc
@@ -6,29 +6,14 @@ #include <stdint.h> +#include "base/containers/contains.h" #include "base/observer_list.h" +#include "base/ranges/algorithm.h" #include "ui/display/display.h" #include "ui/display/display_observer.h" namespace display { -namespace { - -class DisplayComparator { - public: - explicit DisplayComparator(const Display& display) - : display_id_(display.id()) {} - - bool operator()(const Display& display) const { - return display.id() == display_id_; - } - - private: - int64_t display_id_; -}; - -} // anonymous namespace - DisplayChangeNotifier::DisplayChangeNotifier() {} DisplayChangeNotifier::~DisplayChangeNotifier() {} @@ -48,8 +33,7 @@ // Display present in old_displays but not in new_displays has been removed. for (auto old_it = old_displays.begin(); old_it != old_displays.end(); ++old_it) { - if (std::find_if(new_displays.begin(), new_displays.end(), - DisplayComparator(*old_it)) == new_displays.end()) { + if (!base::Contains(new_displays, old_it->id(), &Display::id)) { did_remove_displays = true; for (DisplayObserver& observer : observer_list_) observer.OnDisplayRemoved(*old_it); @@ -65,8 +49,7 @@ // Display present in both might have been modified. for (auto new_it = new_displays.begin(); new_it != new_displays.end(); ++new_it) { - auto old_it = std::find_if(old_displays.begin(), old_displays.end(), - DisplayComparator(*new_it)); + auto old_it = base::ranges::find(old_displays, new_it->id(), &Display::id); if (old_it == old_displays.end()) { for (DisplayObserver& observer : observer_list_)
diff --git a/ui/display/display_finder.cc b/ui/display/display_finder.cc index f710dae..75aeed23 100644 --- a/ui/display/display_finder.cc +++ b/ui/display/display_finder.cc
@@ -4,10 +4,10 @@ #include "ui/display/display_finder.h" -#include <algorithm> #include <limits> #include "base/check.h" +#include "base/ranges/algorithm.h" #include "ui/display/display.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" @@ -56,10 +56,10 @@ Displays::const_iterator FindDisplayContainingPoint( const Displays& displays, const gfx::Point& point_in_screen) { - return std::find_if(displays.begin(), displays.end(), - [point_in_screen](const Display& display) { - return display.bounds().Contains(point_in_screen); - }); + return base::ranges::find_if( + displays, [point_in_screen](const Display& display) { + return display.bounds().Contains(point_in_screen); + }); } } // namespace display
diff --git a/ui/display/display_layout.cc b/ui/display/display_layout.cc index 487b7a7..493a6f7 100644 --- a/ui/display/display_layout.cc +++ b/ui/display/display_layout.cc
@@ -4,7 +4,6 @@ #include "ui/display/display_layout.h" -#include <algorithm> #include <map> #include <set> #include <sstream> @@ -14,6 +13,7 @@ #include "base/check_op.h" #include "base/containers/contains.h" #include "base/logging.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "ui/display/display.h" @@ -36,13 +36,6 @@ // to change this value in case to support even larger displays. const int kMaxValidOffset = 10000; -bool IsIdInList(int64_t id, const DisplayIdList& list) { - const auto iter = - std::find_if(list.begin(), list.end(), - [id](int64_t display_id) { return display_id == id; }); - return iter != list.end(); -} - bool ComparePlacements(const DisplayPlacement& d1, const DisplayPlacement& d2) { return CompareDisplayIds(d1.display_id, d2.display_id); } @@ -58,9 +51,7 @@ // Ruturns nullptr if display with |id| is not found. Display* FindDisplayById(Displays* display_list, int64_t id) { - auto iter = - std::find_if(display_list->begin(), display_list->end(), - [id](const Display& display) { return display.id() == id; }); + auto iter = base::ranges::find(*display_list, id, &Display::id); return iter == display_list->end() ? nullptr : &(*iter); } @@ -163,11 +154,8 @@ Display* parent_display = FindDisplayById(display_list, parent_display_id); DCHECK(parent_display); - auto target_display_placement_itr = - std::find_if(placement_list->begin(), placement_list->end(), - [&target_display](const DisplayPlacement& p) { - return p.display_id == target_display->id(); - }); + auto target_display_placement_itr = base::ranges::find( + *placement_list, target_display->id(), &DisplayPlacement::display_id); DCHECK(target_display_placement_itr != placement_list->end()); target_display_placement = &(*target_display_placement_itr); if (AreDisplaysTouching(*target_display, *parent_display, @@ -543,7 +531,7 @@ bool DisplayLayout::Validate(const DisplayIdList& list, const DisplayLayout& layout) { // The primary display should be in the list. - if (!IsIdInList(layout.primary_id, list)) { + if (!base::Contains(list, layout.primary_id)) { LOG(ERROR) << "The primary id: " << layout.primary_id << " is not in the id list."; return false; @@ -577,12 +565,12 @@ LOG(ERROR) << "display_id must not be same as parent_display_id"; return false; } - if (!IsIdInList(placement.display_id, list)) { + if (!base::Contains(list, placement.display_id)) { LOG(ERROR) << "display_id is not in the id list:" << placement.ToString(); return false; } - if (!IsIdInList(placement.parent_display_id, list)) { + if (!base::Contains(list, placement.parent_display_id)) { LOG(ERROR) << "parent_display_id is not in the id list:" << placement.ToString(); return false; @@ -658,11 +646,8 @@ } DisplayPlacement DisplayLayout::FindPlacementById(int64_t display_id) const { - const auto iter = - std::find_if(placement_list.begin(), placement_list.end(), - [display_id](const DisplayPlacement& placement) { - return placement.display_id == display_id; - }); + const auto iter = base::ranges::find(placement_list, display_id, + &DisplayPlacement::display_id); return (iter == placement_list.end()) ? DisplayPlacement() : DisplayPlacement(*iter); }
diff --git a/ui/display/manager/apply_content_protection_task.cc b/ui/display/manager/apply_content_protection_task.cc index dfbd8cf6..91cf02d 100644 --- a/ui/display/manager/apply_content_protection_task.cc +++ b/ui/display/manager/apply_content_protection_task.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/bind.h" +#include "base/ranges/algorithm.h" #include "ui/display/manager/display_layout_manager.h" #include "ui/display/manager/display_manager_util.h" #include "ui/display/types/display_snapshot.h" @@ -113,10 +114,8 @@ hdcped_displays; // Lookup the displays again since display configuration may have changed. for (const auto& request : hdcp_requests_) { - auto it = std::find_if(displays.begin(), displays.end(), - [id = request.display_id](DisplaySnapshot* display) { - return id == display->display_id(); - }); + auto it = base::ranges::find(displays, request.display_id, + &DisplaySnapshot::display_id); if (it == displays.end()) { std::move(callback_).Run(Status::FAILURE); return;
diff --git a/ui/display/manager/display_configurator.cc b/ui/display/manager/display_configurator.cc index caeb715f0..7f8b1a36 100644 --- a/ui/display/manager/display_configurator.cc +++ b/ui/display/manager/display_configurator.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/logging.h" #include "base/syslog_logging.h" #include "base/time/time.h" @@ -48,10 +49,7 @@ bool IsDisplayIdInDisplayStateList( int64_t display_id, const DisplayConfigurator::DisplayStateList& display_list) { - return std::find_if(display_list.begin(), display_list.end(), - [display_id](DisplaySnapshot* display) { - return display->display_id() == display_id; - }) != display_list.end(); + return base::Contains(display_list, display_id, &DisplaySnapshot::display_id); } // Returns true if a platform native |mode| is equal to a |managed_mode|.
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc index da9fe96a..c51d3b53 100644 --- a/ui/display/manager/display_manager.cc +++ b/ui/display/manager/display_manager.cc
@@ -4,7 +4,6 @@ #include "ui/display/manager/display_manager.h" -#include <algorithm> #include <cmath> #include <limits> #include <map> @@ -20,6 +19,7 @@ #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/no_destructor.h" +#include "base/ranges/algorithm.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" @@ -111,10 +111,10 @@ const ManagedDisplayMode& target_mode) { const ManagedDisplayInfo::ManagedDisplayModeList& modes = info.display_modes(); - return std::find_if(modes.begin(), modes.end(), - [target_mode](const ManagedDisplayMode& mode) { - return target_mode.IsEquivalent(mode); - }); + return base::ranges::find_if(modes, + [target_mode](const ManagedDisplayMode& mode) { + return target_mode.IsEquivalent(mode); + }); } void SetInternalManagedDisplayModeList(ManagedDisplayInfo* info) { @@ -182,10 +182,8 @@ info.device_scale_factor()); const gfx::Size resolution = tmp.GetSizeInDIP(); - auto iter = std::find_if(modes.begin(), modes.end(), - [resolution](const ManagedDisplayMode& mode) { - return mode.GetSizeInDIP() == resolution; - }); + auto iter = + base::ranges::find(modes, resolution, &ManagedDisplayMode::GetSizeInDIP); if (iter == modes.end()) return false; *mode = *FindNextMode(modes, iter - modes.begin(), up); @@ -197,9 +195,8 @@ // if the corresponding info was not found. const ManagedDisplayInfo* FindInfoById(const DisplayInfoList& display_info_list, int64_t id) { - const auto iter = std::find_if( - display_info_list.begin(), display_info_list.end(), - [id](const ManagedDisplayInfo& info) { return info.id() == id; }); + const auto iter = + base::ranges::find(display_info_list, id, &ManagedDisplayInfo::id); if (iter == display_info_list.end()) return nullptr; @@ -1315,11 +1312,8 @@ const Display DisplayManager::GetMirroringDisplayById( int64_t display_id) const { - auto iter = std::find_if(software_mirroring_display_list_.begin(), - software_mirroring_display_list_.end(), - [display_id](const Display& display) { - return display.id() == display_id; - }); + auto iter = base::ranges::find(software_mirroring_display_list_, display_id, + &Display::id); return iter == software_mirroring_display_list_.end() ? Display() : *iter; } @@ -1638,11 +1632,8 @@ display_info_[display_id].SetBounds(new_bounds); // Don't notify observers if the mirrored window has changed. if (IsInSoftwareMirrorMode() && - std::find_if(software_mirroring_display_list_.begin(), - software_mirroring_display_list_.end(), - [display_id](const Display& display) { - return display.id() == display_id; - }) != software_mirroring_display_list_.end()) { + base::Contains(software_mirroring_display_list_, display_id, + &Display::id)) { return false; } @@ -1739,9 +1730,7 @@ const ManagedDisplayInfo& display_info = GetDisplayInfo(kUnifiedDisplayId); const ManagedDisplayInfo::ManagedDisplayModeList& modes = display_info.display_modes(); - auto iter = std::find_if( - modes.begin(), modes.end(), - [](const ManagedDisplayMode& mode) { return mode.native(); }); + auto iter = base::ranges::find_if(modes, &ManagedDisplayMode::native); SetDisplayMode(kUnifiedDisplayId, *iter); return; } @@ -1780,12 +1769,8 @@ if (HasInternalDisplay()) { // Use the internal display as mirroring source. source_id = Display::InternalDisplayId(); - auto iter = - std::find_if(display_info_list->begin(), display_info_list->end(), - [source_id](const ManagedDisplayInfo& info) { - return info.id() == source_id; - }); - if (iter == display_info_list->end()) { + if (!base::Contains(*display_info_list, source_id, + &ManagedDisplayInfo::id)) { // It is possible that internal display is removed (e.g. Use // Chromebook in Dock mode with two or more external displays). In // this case, we use the first connected display as mirroring @@ -1978,8 +1963,7 @@ // Find the default mode. auto default_mode_iter = - std::find_if(modes.begin(), modes.end(), - [](const ManagedDisplayMode mode) { return mode.native(); }); + base::ranges::find_if(modes, &ManagedDisplayMode::native); DCHECK(default_mode_iter != modes.end()); if (default_mode_iter != modes.end()) { @@ -2055,9 +2039,7 @@ } Display* DisplayManager::FindDisplayForId(int64_t id) { - auto iter = - std::find_if(active_display_list_.begin(), active_display_list_.end(), - [id](const Display& display) { return display.id() == id; }); + auto iter = base::ranges::find(active_display_list_, id, &Display::id); if (iter != active_display_list_.end()) return &(*iter); return nullptr;
diff --git a/ui/display/manager/touch_device_manager.cc b/ui/display/manager/touch_device_manager.cc index 9776101..c9a4188 100644 --- a/ui/display/manager/touch_device_manager.cc +++ b/ui/display/manager/touch_device_manager.cc
@@ -4,7 +4,6 @@ #include "ui/display/manager/touch_device_manager.h" -#include <algorithm> #include <set> #include <string> #include <tuple> @@ -13,6 +12,7 @@ #include "base/files/file_util.h" #include "base/hash/hash.h" #include "base/logging.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "ui/display/manager/managed_display_info.h" @@ -105,8 +105,7 @@ // Returns a pointer to the internal display from the list of |displays|. Will // return null if there is no internal display in the list. ManagedDisplayInfo* GetInternalDisplay(ManagedDisplayInfoList* displays) { - auto it = - std::find_if(displays->begin(), displays->end(), &IsInternalDisplay); + auto it = base::ranges::find_if(*displays, &IsInternalDisplay); return it == displays->end() ? nullptr : *it; } @@ -415,10 +414,7 @@ // Find the display associated with |display_id| from |displays|. ManagedDisplayInfoList::iterator display_it = - std::find_if(displays->begin(), displays->end(), - [&display_id](ManagedDisplayInfo* info) { - return info->id() == display_id; - }); + base::ranges::find(*displays, display_id, &ManagedDisplayInfo::id); if (display_it != displays->end()) { VLOG(2) << "=> Matched device " << (*device_it).name << " to display " @@ -494,9 +490,8 @@ const gfx::Size native_size = display->GetNativeModeSize(); // Try to find an input device with roughly the same size as the display. - DeviceList::iterator device_it = std::find_if( - devices->begin(), devices->end(), - [&native_size](const ui::TouchscreenDevice& device) { + DeviceList::iterator device_it = base::ranges::find_if( + *devices, [&native_size](const ui::TouchscreenDevice& device) { // Allow 1 pixel difference between screen and touchscreen // resolutions. Because in some cases for monitor resolution // 1024x768 touchscreen's resolution would be 1024x768, but for
diff --git a/ui/display/test/display_manager_test_api.cc b/ui/display/test/display_manager_test_api.cc index 7494302..49af77a 100644 --- a/ui/display/test/display_manager_test_api.cc +++ b/ui/display/test/display_manager_test_api.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/logging.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_split.h" #include "build/chromeos_buildflags.h" #include "ui/display/display_layout_builder.h" @@ -56,10 +57,7 @@ const ManagedDisplayInfo::ManagedDisplayModeList& modes = info.display_modes(); DCHECK_NE(0u, modes.size()); - auto iter = std::find_if(modes.begin(), modes.end(), - [resolution](const ManagedDisplayMode& mode) { - return mode.size() == resolution; - }); + auto iter = base::ranges::find(modes, resolution, &ManagedDisplayMode::size); if (iter == modes.end()) { DLOG(WARNING) << "Unsupported resolution was requested:" << resolution.ToString(); @@ -169,12 +167,8 @@ const int64_t primary_display_id = Screen::GetScreen()->GetPrimaryDisplay().id(); - auto primary_display_iter = - std::find_if(display_manager_->active_display_list_.begin(), - display_manager_->active_display_list_.end(), - [id = primary_display_id](const Display& display) { - return display.id() == id; - }); + auto primary_display_iter = base::ranges::find( + display_manager_->active_display_list_, primary_display_id, &Display::id); DCHECK(primary_display_iter != display_manager_->active_display_list_.end());
diff --git a/ui/display/unified_desktop_utils.cc b/ui/display/unified_desktop_utils.cc index 7c99648..6668682 100644 --- a/ui/display/unified_desktop_utils.cc +++ b/ui/display/unified_desktop_utils.cc
@@ -10,6 +10,7 @@ #include "base/containers/contains.h" #include "base/containers/stack.h" #include "base/logging.h" +#include "base/ranges/algorithm.h" #include "ui/display/types/display_constants.h" namespace display { @@ -83,11 +84,9 @@ int64_t current_display_id = placement.display_id; base::stack<DisplayPlacement> unhandled_displays; while (displays_cells.count(current_display_id) == 0) { - auto placement_iter = std::find_if( - layout.placement_list.begin(), layout.placement_list.end(), - [current_display_id](const DisplayPlacement& p) { - return p.display_id == current_display_id; - }); + auto placement_iter = + base::ranges::find(layout.placement_list, current_display_id, + &DisplayPlacement::display_id); DCHECK(placement_iter != layout.placement_list.end()); unhandled_displays.emplace(*placement_iter); current_display_id = placement_iter->parent_display_id; @@ -215,12 +214,8 @@ for (const auto& id : ids_list) { if (id == layout.primary_id) continue; - const auto iter = - std::find_if(layout.placement_list.begin(), layout.placement_list.end(), - [id](const DisplayPlacement& placement) { - return placement.display_id == id; - }); - if (iter == layout.placement_list.end()) { + if (!base::Contains(layout.placement_list, id, + &DisplayPlacement::display_id)) { LOG(ERROR) << "Display with ID: " << id << " has no placement."; return false; }
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc index 83ad9fb..77e2847d 100644 --- a/ui/display/win/screen_win.cc +++ b/ui/display/win/screen_win.cc
@@ -371,9 +371,8 @@ } // Find and extract the primary display. std::vector<DisplayInfo> display_infos_remaining = display_infos; - auto primary_display_iter = std::find_if( - display_infos_remaining.begin(), display_infos_remaining.end(), - [](const DisplayInfo& display_info) { + auto primary_display_iter = base::ranges::find_if( + display_infos_remaining, [](const DisplayInfo& display_info) { return display_info.screen_rect().origin().IsOrigin(); }); DCHECK(primary_display_iter != display_infos_remaining.end()); @@ -713,10 +712,9 @@ ScreenWinDisplay ScreenWin::GetScreenWinDisplayWithDisplayId(int64_t id) { if (!g_instance) return ScreenWinDisplay(); - const auto it = std::find_if( - g_instance->screen_win_displays_.cbegin(), - g_instance->screen_win_displays_.cend(), - [id](const auto& display) { return display.display().id() == id; }); + const auto it = base::ranges::find( + g_instance->screen_win_displays_, id, + [](const auto& display) { return display.display().id(); }); // There is 1:1 correspondence between MONITORINFOEX and ScreenWinDisplay. // If we found no screens, either there are no screens, or we're in the midst // of updating our screens (see crbug.com/768845); either way, hand out the @@ -981,9 +979,9 @@ ScreenWinDisplay ScreenWin::GetScreenWinDisplay( const MONITORINFOEX& monitor_info) const { const int64_t id = DisplayInfo::DeviceIdFromDeviceName(monitor_info.szDevice); - const auto it = std::find_if( - screen_win_displays_.cbegin(), screen_win_displays_.cend(), - [id](const auto& display) { return display.display().id() == id; }); + const auto it = base::ranges::find( + screen_win_displays_, id, + [](const auto& display) { return display.display().id(); }); // There is 1:1 correspondence between MONITORINFOEX and ScreenWinDisplay. // If we found no screens, either there are no screens, or we're in the midst // of updating our screens (see crbug.com/768845); either way, hand out the
diff --git a/ui/views/accessibility/ax_virtual_view.cc b/ui/views/accessibility/ax_virtual_view.cc index d5cd2c44..95536ce 100644 --- a/ui/views/accessibility/ax_virtual_view.cc +++ b/ui/views/accessibility/ax_virtual_view.cc
@@ -63,8 +63,9 @@ "not both."; if (ax_platform_node_) { - ax_platform_node_->Destroy(); - ax_platform_node_ = nullptr; + // Clear ax_platform_node_ and return another raw_ptr instance that is + // allowed to dangle. + ax_platform_node_.ExtractAsDangling()->Destroy(); } #if defined(USE_AURA)