Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 31 additions & 5 deletions demos/code/code.js
Original file line number Diff line number Diff line change
Expand Up @@ -234,14 +234,16 @@ Code.LANG = Code.getLang();
* List of tab names.
* @private
*/
Code.TABS_ = ['blocks', 'javascript', 'php', 'python', 'dart', 'lua', 'xml'];
Code.TABS_ = [
'blocks', 'javascript', 'php', 'python', 'dart', 'lua', 'xml', 'json'
];

/**
* List of tab names with casing, for display in the UI.
* @private
*/
Code.TABS_DISPLAY_ = [
'Blocks', 'JavaScript', 'PHP', 'Python', 'Dart', 'Lua', 'XML',
'Blocks', 'JavaScript', 'PHP', 'Python', 'Dart', 'Lua', 'XML', 'JSON'
];

Code.selected = 'blocks';
Expand All @@ -259,8 +261,8 @@ Code.tabClick = function(clickedName) {
try {
xmlDom = Blockly.Xml.textToDom(xmlText);
} catch (e) {
var q =
window.confirm(MSG['badXml'].replace('%1', e));
var q = window.confirm(
MSG['parseError'].replace(/%1/g, 'XML').replace('%2', e));
if (!q) {
// Leave the user on the XML tab.
return;
Expand All @@ -272,6 +274,25 @@ Code.tabClick = function(clickedName) {
}
}

if (document.getElementById('tab_json').classList.contains('tabon')) {
var jsonTextarea = document.getElementById('content_json');
var jsonText = jsonTextarea.value;
var json = null;
try {
json = JSON.parse(jsonText);
} catch (e) {
var q = window.confirm(
MSG['parseError'].replace(/%1/g, 'JSON').replace('%2', e));
if (!q) {
// Leave the user on the JSON tab.
return;
}
}
if (json) {
Blockly.serialization.workspaces.load(json, Code.workspace);
}
}

if (document.getElementById('tab_blocks').classList.contains('tabon')) {
Code.workspace.setVisible(false);
}
Expand Down Expand Up @@ -324,6 +345,11 @@ Code.renderContent = function() {
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
xmlTextarea.value = xmlText;
xmlTextarea.focus();
} else if (content.id == 'content_json') {
var jsonTextarea = document.getElementById('content_json');
jsonTextarea.value = JSON.stringify(
Blockly.serialization.workspaces.save(Code.workspace), null, 2);
jsonTextarea.focus();
} else if (content.id == 'content_javascript') {
Code.attemptCodeGeneration(Blockly.JavaScript);
} else if (content.id == 'content_python') {
Expand Down Expand Up @@ -466,7 +492,7 @@ Code.init = function() {
BlocklyStorage['HTTPREQUEST_ERROR'] = MSG['httpRequestError'];
BlocklyStorage['LINK_ALERT'] = MSG['linkAlert'];
BlocklyStorage['HASH_ERROR'] = MSG['hashError'];
BlocklyStorage['XML_ERROR'] = MSG['xmlError'];
BlocklyStorage['XML_ERROR'] = MSG['loadError'];
Code.bindClick(linkButton,
function() {BlocklyStorage.link(Code.workspace);});
} else if (linkButton) {
Expand Down
3 changes: 3 additions & 0 deletions demos/code/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ <h1><a href="https://developers.google.com/blockly/">Blockly</a>&rlm; &gt;
<td id="tab_dart" class="taboff tab_collapse">Dart</td>
<td class="tabmin tab_collapse">&nbsp;</td>
<td id="tab_xml" class="taboff tab_collapse">XML</td>
<td class="tabmin tab_collapse">&nbsp;</td>
<td id="tab_json" class="taboff tab_collapse">JSON</td>
<td class="tabmin">&nbsp;</td>
<td id="tab_code" class="taboff">
<select id="code_menu"></select>
Expand Down Expand Up @@ -78,6 +80,7 @@ <h1><a href="https://developers.google.com/blockly/">Blockly</a>&rlm; &gt;
<pre id="content_lua" class="content prettyprint lang-lua"></pre>
<pre id="content_dart" class="content prettyprint lang-dart"></pre>
<textarea id="content_xml" class="content" wrap="off"></textarea>
<textarea id="content_json" class="content" wrap="off"></textarea>

<xml xmlns="https://developers.google.com/blockly/xml" id="toolbox" style="display: none">
<category name="%{BKY_CATLOGIC}" colour="%{BKY_LOGIC_HUE}">
Expand Down
4 changes: 2 additions & 2 deletions demos/code/msg/ar.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "كانت هناك مشكلة مع هذا الطلب.",
linkAlert: "مشاركة كود بلوكلي الخاص بك مع هذا الرابط:\n %1",
hashError: "عذراً،ال '%1' لا تتوافق مع أي برنامج تم حفظه.",
xmlError: "تعذر تحميل الملف المحفوظة الخاصة بك. ربما تم إنشاؤه باستخدام إصدار مختلف من بلوكلي؟",
badXml: "خطأ في توزيع ال \"XML\":\n %1\n\nحدد 'موافق' للتخلي عن التغييرات أو 'إلغاء الأمر' لمواصلة تحرير ال\"XML\"."
loadError: "تعذر تحميل الملف المحفوظة الخاصة بك. ربما تم إنشاؤه باستخدام إصدار مختلف من بلوكلي؟",
parseError: "خطأ في توزيع ال \"%1\":\n %2\n\nحدد 'موافق' للتخلي عن التغييرات أو 'إلغاء الأمر' لمواصلة تحرير ال\"%1\"."
};
4 changes: 2 additions & 2 deletions demos/code/msg/be-tarask.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Узьнікла праблема з запытам.",
linkAlert: "Падзяліцца Вашым блёкам праз гэтую спасылку:\n\n%1",
hashError: "Прабачце, '%1' не адпавядае ніводнай захаванай праграме.",
xmlError: "Не атрымалася загрузіць захаваны файл. Магчыма, ён быў створаны з іншай вэрсіяй Блёклі?",
badXml: "Памылка сынтаксічнага аналізу XML:\n%1\n\nАбярыце \"ОК\", каб адмовіцца ад зьменаў ці \"Скасаваць\" для далейшага рэдагаваньня XML."
loadError: "Не атрымалася загрузіць захаваны файл. Магчыма, ён быў створаны з іншай вэрсіяй Блёклі?",
parseError: "Памылка сынтаксічнага аналізу %1:\n%2\n\nАбярыце \"ОК\", каб адмовіцца ад зьменаў ці \"Скасаваць\" для далейшага рэдагаваньня %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/br.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Ur gudenn zo gant ar reked.",
linkAlert: "Rannañ ho ploc'hoù gant al liamm-mañ :\n\n%1",
hashError: "Digarezit. \"%1\" ne glot gant programm enrollet ebet.",
xmlError: "Ne c'haller ket kargañ ho restr enrollet. Marteze e oa bet krouet gant ur stumm disheñvel eus Blockly ?",
badXml: "Fazi dielfennañ XML :\n%1\n\nDibabit \"Mat eo\" evit dilezel ar c'hemmoù-se pe \"Nullañ\" evit kemmañ an XML c'hoazh."
loadError: "Ne c'haller ket kargañ ho restr enrollet. Marteze e oa bet krouet gant ur stumm disheñvel eus Blockly ?",
parseError: "Fazi dielfennañ %1 :\n%2\n\nDibabit \"Mat eo\" evit dilezel ar c'hemmoù-se pe \"Nullañ\" evit kemmañ an %1 c'hoazh."
};
4 changes: 2 additions & 2 deletions demos/code/msg/ca.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Hi ha hagut un problema amb la sol·licitud.",
linkAlert: "Comparteix els teus blocs amb aquest enllaç: %1",
hashError: "Ho sentim, '%1' no es correspon amb cap fitxer desat de Blockly.",
xmlError: "No s'ha pogut carregar el teu fitxer desat. Potser va ser creat amb una versió diferent de Blockly?",
badXml: "Error d'anàlisi XML:\n%1\n\nSeleccioneu 'Acceptar' per abandonar els vostres canvis, o 'Cancel·lar' per continuar editant l'XML."
loadError: "No s'ha pogut carregar el teu fitxer desat. Potser va ser creat amb una versió diferent de Blockly?",
parseError: "Error d'anàlisi %1:\n%2\n\nSeleccioneu 'Acceptar' per abandonar els vostres canvis, o 'Cancel·lar' per continuar editant l'%1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/cs.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Došlo k potížím s požadavkem.",
linkAlert: "Sdílej bloky tímto odkazem: \n\n%1",
hashError: "Omlouváme se, '%1' nesouhlasí s žádným z uložených souborů.",
xmlError: "Nepodařilo se uložit vás soubor. Pravděpodobně byl vytvořen jinou verzí Blockly?",
badXml: "Chyba parsování XML:\n%1\n\nVybrat \"OK\" pro zahození vašich změn nebo 'Cancel' k dalšímu upravování XML."
loadError: "Nepodařilo se uložit vás soubor. Pravděpodobně byl vytvořen jinou verzí Blockly?",
parseError: "Chyba parsování %1:\n%2\n\nVybrat \"OK\" pro zahození vašich změn nebo 'Cancel' k dalšímu upravování %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/da.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Der var et problem med forespørgslen.",
linkAlert: "Del dine blokke med dette link:\n\n%1",
hashError: "Beklager, '%1' passer ikke med nogen gemt Blockly fil.",
xmlError: "Kunne ikke hente din gemte fil. Måske er den lavet med en anden udgave af Blockly?",
badXml: "Fejl under fortolkningen af XML:\n%1\n\nVælg 'OK' for at opgive dine ændringer eller 'Afbryd' for at redigere XML-filen yderligere."
loadError: "Kunne ikke hente din gemte fil. Måske er den lavet med en anden udgave af Blockly?",
parseError: "Fejl under fortolkningen af %1:\n%2\n\nVælg 'OK' for at opgive dine ændringer eller 'Afbryd' for at redigere %1-filen yderligere."
};
4 changes: 2 additions & 2 deletions demos/code/msg/de.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Mit der Anfrage gab es ein Problem.",
linkAlert: "Teile deine Bausteine mit diesem Link:\n\n%1",
hashError: "„%1“ stimmt leider mit keinem gespeicherten Programm überein.",
xmlError: "Deine gespeicherte Datei konnte nicht geladen werden. Vielleicht wurde sie mit einer anderen Version von Blockly erstellt.",
badXml: "Fehler beim Parsen von XML:\n%1\n\nWähle 'OK' zum Verwerfen deiner Änderungen oder 'Abbrechen' zum weiteren Bearbeiten des XML."
loadError: "Deine gespeicherte Datei konnte nicht geladen werden. Vielleicht wurde sie mit einer anderen Version von Blockly erstellt.",
parseError: "Fehler beim Parsen von %1:\n%2\n\nWähle 'OK' zum Verwerfen deiner Änderungen oder 'Abbrechen' zum weiteren Bearbeiten des %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/el.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Υπήρξε πρόβλημα με το αίτημα.",
linkAlert: "Κοινοποίησε τα μπλοκ σου με αυτόν τον σύνδεσμο:\n\n%1",
hashError: "Λυπάμαι, το «%1» δεν αντιστοιχεί σε κανένα αποθηκευμένο πρόγραμμα.",
xmlError: "Δεν μπορώ να φορτώσω το αποθηκευμένο αρχείο σου. Μήπως δημιουργήθηκε από μία παλιότερη έκδοση του Blockly;",
badXml: "Σφάλμα ανάλυσης XML:\n%1\n\nΕπίλεξε «Εντάξει» για να εγκαταλείψεις τις αλλαγές σου ή «Ακύρωση» για να επεξεργαστείς το XML κι άλλο."
loadError: "Δεν μπορώ να φορτώσω το αποθηκευμένο αρχείο σου. Μήπως δημιουργήθηκε από μία παλιότερη έκδοση του Blockly;",
parseError: "Σφάλμα ανάλυσης %1:\n%2\n\nΕπίλεξε «Εντάξει» για να εγκαταλείψεις τις αλλαγές σου ή «Ακύρωση» για να επεξεργαστείς το %1 κι άλλο."
};
4 changes: 2 additions & 2 deletions demos/code/msg/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "There was a problem with the request.",
linkAlert: "Share your blocks with this public link. We\'ll delete them if not used for a year. They are not associated with your account and handled as per Google\'s Privacy Policy. Please be sure not to include any private information.\n\n%1",
hashError: "Sorry, '%1' doesn't correspond with any saved program.",
xmlError: "Could not load your saved file. Perhaps it was created with a different version of Blockly?",
badXml: "Error parsing XML:\n%1\n\nSelect 'OK' to abandon your changes or 'Cancel' to further edit the XML."
loadError: "Could not load your saved file. Perhaps it was created with a different version of Blockly?",
parseError: "Error parsing %1:\n%2\n\nSelect 'OK' to abandon your changes or 'Cancel' to further edit the %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/es.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Hubo un problema con la petición.",
linkAlert: "Comparte tus bloques con este enlace:\n\n%1",
hashError: "«%1» no corresponde con ningún programa guardado.",
xmlError: "No se pudo cargar el archivo guardado. ¿Quizá fue creado con otra versión de Blockly?",
badXml: "Error de análisis XML:\n%1\n\nSelecciona OK para abandonar tus cambios o Cancelar para seguir editando el XML."
loadError: "No se pudo cargar el archivo guardado. ¿Quizá fue creado con otra versión de Blockly?",
parseError: "Error de análisis %1:\n%2\n\nSelecciona OK para abandonar tus cambios o Cancelar para seguir editando el %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/et.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Probleem päringuga.",
linkAlert: "Oma plokke saad jagada selle lingiga:\n\n%1",
hashError: "Vabandust, kuid '%1' ei vasta ühelegi salvestatud programmile.",
xmlError: "Su salvestatud faili ei õnnestunud laadida. Võibolla on see loodud mõne teise Blockly versiooniga?",
badXml: "Viga XML-i parsimisel:\n%1\n\nTehtud muudatustest loobumiseks vajuta 'OK', XML-i muudatuste tegemise jätkamiseks 'Katkesta'."
loadError: "Su salvestatud faili ei õnnestunud laadida. Võibolla on see loodud mõne teise Blockly versiooniga?",
parseError: "Viga %1-i parsimisel:\n%2\n\nTehtud muudatustest loobumiseks vajuta 'OK', %1-i muudatuste tegemise jätkamiseks 'Katkesta'."
};
4 changes: 2 additions & 2 deletions demos/code/msg/fa.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "مشکلی با درخواست وجود داشت.",
linkAlert: "اشتراک‌گذاری بلاک‌هایتان با این پیوند:\n\n%1",
hashError: "شرمنده، «%1» با هیچ برنامهٔ ذخیره‌شده‌ای تطبیق پیدا نکرد.",
xmlError: "نتوانست پروندهٔ ذخیرهٔ شما بارگیری شود. احتمالاً با نسخهٔ متفاوتی از بلوکی درست شده‌است؟",
badXml: "خطای تجزیهٔ اکس‌ام‌ال:\n%1\n\n«باشد» را برای ذخیره و «فسخ» را برای ویرایش بیشتر اکس‌ام‌ال انتخاب کنید."
loadError: "نتوانست پروندهٔ ذخیرهٔ شما بارگیری شود. احتمالاً با نسخهٔ متفاوتی از بلوکی درست شده‌است؟",
parseError: "خطای تجزیهٔ اکس‌ام‌ال:\n%2\n\n«باشد» را برای ذخیره و «فسخ» را برای ویرایش بیشتر اکس‌ام‌ال انتخاب کنید."
};
4 changes: 2 additions & 2 deletions demos/code/msg/fr.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Il y a eu un problème avec la demande.",
linkAlert: "Partagez vos blocs grâce à ce lien:\n\n%1",
hashError: "Désolé, '%1' ne correspond à aucun programme sauvegardé.",
xmlError: "Impossible de charger le fichier de sauvegarde. Peut être a t-il été créé avec une autre version de Blockly?",
badXml: "Erreur d’analyse du XML :\n%1\n\nSélectionner 'OK' pour abandonner vos modifications ou 'Annuler' pour continuer à modifier le XML."
loadError: "Impossible de charger le fichier de sauvegarde. Peut être a t-il été créé avec une autre version de Blockly?",
parseError: "Erreur d’analyse du %1 :\n%2\n\nSélectionner 'OK' pour abandonner vos modifications ou 'Annuler' pour continuer à modifier le %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/he.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "הבקשה נכשלה.",
linkAlert: "ניתן לשתף את קטעי הקוד שלך באמצעות קישור זה:\n\n%1",
hashError: "לצערנו, '%1' איננו מתאים לאף אחת מהתוכניות השמורות",
xmlError: "נסיון הטעינה של הקובץ השמור שלך נכשל. האם ייתכן שהוא נוצר בגרסא שונה של בלוקלי?",
badXml: "תקלה בפענוח XML:\n\n%1\n\nנא לבחור 'אישור' כדי לנטוש את השינויים שלך או 'ביטול' כדי להמשיך ולערוך את ה־XML."
loadError: "נסיון הטעינה של הקובץ השמור שלך נכשל. האם ייתכן שהוא נוצר בגרסא שונה של בלוקלי?",
parseError: "תקלה בפענוח %1:\n\n%2\n\nנא לבחור 'אישור' כדי לנטוש את השינויים שלך או 'ביטול' כדי להמשיך ולערוך את ה־%1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/hrx.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Mit der Oonfroch hots en Problem geb.",
linkAlert: "Tel von dein Bausten mit dem Link:\n\n%1",
hashError: "„%1“ stimmt leider mit kenem üweren gespeicherte Programm.",
xmlError: "Dein gespeicherte Datei könnt net gelood sin. Vielleicht woard se mit ener annre Version von Blockly erstellt.",
badXml: "Fehler beim Parse von XML:\n%1\n\nWähle 'OK' zum Verwerfe von deiner Ändrunge orrer 'Abbreche' zum XML weiter beoorbeite."
loadError: "Dein gespeicherte Datei könnt net gelood sin. Vielleicht woard se mit ener annre Version von Blockly erstellt.",
parseError: "Fehler beim Parse von %1:\n%2\n\nWähle 'OK' zum Verwerfe von deiner Ändrunge orrer 'Abbreche' zum %1 weiter beoorbeite."
};
4 changes: 2 additions & 2 deletions demos/code/msg/hu.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "A kéréssel kapcsolatban probléma merült fel.",
linkAlert: "Ezzel a hivatkozással tudod megosztani a programodat:\n\n%1",
hashError: "Sajnos a '%1' hivatkozás nem tartozik egyetlen programhoz sem.",
xmlError: "A programodat nem lehet betölteni. Elképzelhető, hogy a Blockly egy másik verziójában készült?",
badXml: "Hiba az XML feldolgozásakor:\n%1\n\nVáltozások elvetése?"
loadError: "A programodat nem lehet betölteni. Elképzelhető, hogy a Blockly egy másik verziójában készült?",
parseError: "Hiba az %1 feldolgozásakor:\n%2\n\nVáltozások elvetése?"
};
4 changes: 2 additions & 2 deletions demos/code/msg/ia.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Il habeva un problema con le requesta.",
linkAlert: "Divide tu blocos con iste ligamine:\n\n%1",
hashError: "Infelicemente, '%1' non corresponde a alcun programma salveguardate.",
xmlError: "Impossibile cargar le file salveguardate. Pote esser que illo ha essite create con un altere version de Blockly?",
badXml: "Error de analyse del XML:\n%1\n\nSelige 'OK' pro abandonar le modificationes o 'Cancellar' pro continuar a modificar le codice XML."
loadError: "Impossibile cargar le file salveguardate. Pote esser que illo ha essite create con un altere version de Blockly?",
parseError: "Error de analyse del %1:\n%2\n\nSelige 'OK' pro abandonar le modificationes o 'Cancellar' pro continuar a modificar le codice %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/is.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "Það kom upp vandamál með beiðnina.",
linkAlert: "Deildu kubbunum þínum með þessari krækju:",
hashError: "Því miður, '%1' passar ekki við neitt vistað forrit.",
xmlError: "Gat ekki hlaðið vistuðu skrána þína. Var hún kannske búin til í annarri útgáfu af Blockly?",
badXml: "Villa við úrvinnslu XML:\n%1\n\nVeldu 'Í lagi' til að sleppa breytingum eða 'Hætta við' til að halda áfram með XML."
loadError: "Gat ekki hlaðið vistuðu skrána þína. Var hún kannske búin til í annarri útgáfu af Blockly?",
parseError: "Villa við úrvinnslu %1:\n%2\n\nVeldu 'Í lagi' til að sleppa breytingum eða 'Hætta við' til að halda áfram með %1."
};
4 changes: 2 additions & 2 deletions demos/code/msg/it.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ var MSG = {
httpRequestError: "La richiesta non è stata soddisfatta.",
linkAlert: "Condividi i tuoi blocchi con questo collegamento:\n\n%1",
hashError: "Mi spiace, '%1' non corrisponde ad alcun programma salvato.",
xmlError: "Non è stato possibile caricare il documento. Forse è stato creato con una versione diversa di Blockly?",
badXml: "Errore durante l'analisi XML:\n%1\n\nSeleziona 'OK' per abbandonare le modifiche o 'Annulla' per continuare a modificare l'XML."
loadError: "Non è stato possibile caricare il documento. Forse è stato creato con una versione diversa di Blockly?",
parseError: "Errore durante l'analisi %1:\n%2\n\nSeleziona 'OK' per abbandonare le modifiche o 'Annulla' per continuare a modificare l'%1."
};
Loading