Javascript.RU

Google Gears в деталях

О Google Gears можно услышать довольно много чего интересного. Дескать, есть такой мегаплагин, добавляет кучу возможностей. И еще - с ним можно оптимизировать сайты.

Посмотрим подробнее, что это такое, для чего он нужен, что умеет.

Эта статья не ставит своей целью заменить документацию по Google Gears (которой, к сожалению, нет на русском языке). Ее цель - показать основные возможности Google Gears и существующие способы их применения, включая использование Gears в Joomla, Wordpress, Youtube.

UPDATE: в связи с тем, что технология умерла, статья имеет интерес разве что исторический.

Google Gears (или просто Gears) - плагин для браузера. На момент написания статьи работает во всех современных браузерах, кроме Safari 4 и Opera Desktop до 10 версии включительно.

Конечно, этот плагин надо ставить. Обычно браузер предлагает это сделать в виде выпадающего сообщения.

Gears добавляет в javascript:

  • Базу данных (SQLite)
  • Реальную многопоточность (точнее многопроцессность)
  • Возможность кросс-доменного общения для скриптов
  • Локальный сервер для работы оффлайн
  • Доступ из javascript к содержимому(только на чтение) выбранных пользователем файлов. Есть свой селектор для выбора нескольких файлов одновременно.
  • Взаимодействие с OS в плане создания ярлыков и drag'n'drop
  • Geolocation API для определения координат, включая устройства с GPS
  • Простейшие возможности по работе с изображениями в javascript.

Большинство этих возможностей требуют разрешения на использование от посетителя. Редкие, самые безопасные, сработают и без.

Разберем все это поподробнее.

В спецификации HTML 5 предусмотрено хранение и доступ к данным при помощи SQL: Offline Web Applications. Эта возможность поддерживается в Safari.

Google Gears пошел другим путем и предоставляет свой SQL-интерфейс Database API.

Основное отличие - в Gears запросы к базе синхронные, а в HTML 5 - асинхронные (назначается callback на получение результата). Это удобно, т.к. для асинхронности в gears можно использовать многопоточность там, где это нужно.

  • Удалены некоторые возможности SQLite - в основном это касается работы напрямую с файловой системой и системных опций.
  • Жестко задана кодировка: UTF-8.
  • Есть полнотекстовой поиск FTS2 (не для русского языка).
  • Файл с базой хранится внутри домашней директории пользователя. Таким образом, разграничение доступа между пользователями компьютера осуществляется средствами OS.
  • Одновременно в базу может писать только один процесс - иначе генерируется исключение.
  • Много баз данных. Но базы привязаны к текущему протоколу-порту-домену. То есть, базы с одинаковым именем для разных сайтов никак не пересекаются (Same Origin), и залезть с одного сайта в базу другого нельзя.

Доступ к базе требует разрешения от посетителя.

Следующий пример создаст базу и таблицу (если не существует) и добавит туда запись. Многократный запуск добавит много записей, который сохранятся в базе на локальном компьютере.

Пример: Записать в таблицу и сделать выборку
var db = google.gears.factory.create('beta.database');

db.open('js');
db.execute('create table if not exists test(phrase text, created datetime)');

var phrase = prompt("Введите фразу")

db.execute('insert into test values (?, datetime())', [phrase])
var rs = db.execute('select * from test order by created desc')

while (rs.isValidRow()) {
  alert(rs.field(0) + ' создано ' + rs.field(1))
  rs.next()
}
rs.close()
Пример: Удалить базу
var db = google.gears.factory.create('beta.database')
db.open('js')
db.remove()

Здесь, как и в дальнейших примерах, пропущена проверка ошибок выполнения. Например, посетитель может запретить Google Gears. При любых ошибках gears инициирует исключения, которые легко поймать конструкцией try..catch.

В SDK, которое предоставляет google, есть SQL-консоль для работы с базой.

Открыть консоль в ифрейме

API на сайте Google: http://code.google.com/apis/gears/api_database.html.

Многопоточность, а точнее, многопроцессность - пожалуй, самая интересная возможность Google Gears.

Каждый новый поток является отдельным процессом со своими переменными и средой выполнения.

Реализуется она при помощи WorkerPool API, которое представляет собой вольную переработку черновика Web Workers из HTML5.

Новые процессы запускаются вызовом createWorker/createWorkerFromUri класса WorkerPool.

// получить разрешение на доступ к WorkerPool
workerPool = google.gears.factory.create('beta.workerpool')

// создать новый процесс, загрузить для выполнения скрипт worker.js
int childId = workerPool.createWorkerFromUrl('/files/gears/worker.js')

Эти методы возвращают идентификатор, который мы можем использовать для общения с процессом.

Это делается методом workerPool.sendMessage:

workerPool.sendMessage("Ответь мне, процесс!", childId)

Чтобы принять сообщение, в скрипте дочернего процесса (worker.js) должен быть определен метод onmessage на неявно передаваемом в дочерний поток объекте google.gears.workerPool:

Пример: worker.js
google.gears.workerPool.onmessage = function(a,b, message) {
  var reply = "Пришло: "+message.body

  // ответить пославшему 
  google.gears.workerPool.sendMessage(reply, message.sender);
}

У метода onmessage - три аргумента. Первые 2 устарели и не нужны, а третий - собственно, сообщение message со свойствами:

body
Переданное в sendMessage сообщение. В примере - строка, а вообще - может быть любой объект
sender
ID процесса, пославшего сообщение. В примере - ID родителя, основного javascript-процесса
origin
URL, с которого работает пославший сообщение процесс, в форме ПРОТОКОЛ://ДОМЕН(PORT), причем порт отсутствует для стандартных портов 80 и 443

В ответ наш основной процесс может вывести то, что получил:

workerPool.onmessage = function(a,b, message) {
  alert("От потомка: "+message.body)
}

Итак, полный код примера:

workerPool = google.gears.factory.create('beta.workerpool')

// работает синхронно, т.е. к следующей строке кода поток будет готов 
childId = workerPool.createWorkerFromUrl('/files/gears/worker.js')

workerPool.onmessage = function(a,b, message) {
  alert("От потомка: "+message.body)
}

workerPool.sendMessage("Ответь мне, процесс!", childId)

Файл worker.js: /files/gears/worker.js.

Скрипт, загруженный createWorkerFromUrl с другого URL, будет выполняться в контексте безопасности этого URL, и при этом общаться с основным процессом.

Соответственно, можно наладить кросс-доменную коммуникацию без всяких трюков с iframe и проксированием, и даже без postMessage/XDomainRequest.

Об этом написано в секции документации Cross-origin workers WorkerPool API.

  • Дочерние процессы не имеют доступа к объектам document и window. Для рисования используйте основной javascript-процесс. А вместо XmlHttpRequest и setTimeout/setInterval, которые есть в window, Gears предоставляет сходные аналоги: HttpRequest и Timer.
  • Невозможна одновременная запись в базу с разных потоков. Один запишет, другие получат исключения. Соответственно, нужно закладывать в код обработку исключений и повторение SQL-запроса.
  • Метод createWorkerFromUrl не работает из дочерних процессов. В них можно использовать метод createWorker, которому передается не URL, а текст скрипта.

API на сайте Google: http://code.google.com/intl/ru/apis/gears/api_workerpool.html.

Локальный сервер - пожалуй, самая востребованная часть Google Gears API.
По смыслу - это не совсем тот сервер, о котором привык слышать веб-разработчик.

Он умеет две основные вещи.

  1. Загружать одну страницу или их список в локальное хранилище
  2. Неявно перехватывать обращения браузера к загруженным страницам и отдавать их из локального хранилища.

Разумеется, поддерживается и обновление локального хранилища.

Хранилище работает в рамках стандартного контекста безопасности Same Origin, так что сохранить локально можно только страницы с текущего протокола-домена-порта.

Для инициализации хранилища используется фабричный класс LocalServer

var localServer = google.gears.factory.create('beta.localserver')

Этот вызов требует разрешения от посетителя.

Основные методы LocalServer:

  • createStore / openStore / removeStore - для управления хранилищем типа ResourceStore
  • createManagedStore / openManagedStore / removeManagedStore - для управления хранилищем типа ManagedResourceStore

Таким образом, можно создавать именованные хранилища двух видов, которые различаются логикой хранения и обновления.

Если запрошенная посетителем страница есть в хранилище - запрос будет перехвачен LocalServer'ом, и она будет взята из локального хранилища, а не с удаленного сервера.

Функции LocalServer предусматривают также атрибут requiredCookie, который может ограничивать доступ к хранилищу и требовать наличия, либо отсутствия у посетителя заданного cookie.

Таким образом, можно например привязать хранилище к ID посетителя:

var localServer = google.gears.factory.create('beta.localserver')
// создать или открыть, если есть
var store = localServer.createManagedStore('data', 'userid=123')

Данные этого хранилища будут доступны только посетителю с cookie: userid=123.
Конечно, эта мера скорее нацелена на удобство, нежели на безопасность.
Но часто бывает, что у одного человека есть несколько аккаунтов, скажем, почтовых, и здесь ограничение requiredCookie может быть как нельзя более удобно.

У каждого хранилища есть атрибут enabled, который позволяет включать или отключать его, при этом не удаляя данные. Он наиболее полезен при отладке, рабочие приложения его обычно не используют.

Это хранилище целиком настраивается на клиенте. Оно позволяет получать с сервера произвольные страницы (или сразу много страниц).

Основной метод: capture(urlOrUrlArray, callback) - получает и сохраняет страницы с сервера.

Для примера посмотрим на таймер. Это обычный div, для которого javascript при помощи xmlhttprequest раз в секунду запрашивает с сервера страницу time.php с текущим серверным временем и выводит ее в div с id="timer".

Кликните, пожалуйста, на кнопку запуска для активации кода таймера:

// используется jQuery функция load, получающая данные
// при помощи XMLHttpRequest
setInterval(function() { $('#timer').load('/files/gears/time.php') }, 1000)

После того, как вы запустите следующий код, время застынет, т.к. страница time.php, содержимое которой ежесекундно попадает в div, станет отдаваться не с сервера, а с вашей машины.

Пример: Загрузить страницу в хранилище
var localServer = google.gears.factory.create('beta.localserver')
var store = localServer.createStore('time-store')
store.capture(
  "/files/gears/time.php", 
  function() { alert('Страница загружена в хранилище') }
)

А этот код удалит страницу из хранилища, после чего таймер опять заработает.

Пример: Удалить страницу из хранилища
var localServer = google.gears.factory.create('beta.localserver')
var store = localServer.createStore('time-store')
store.remove("/files/gears/time.php")
alert('Страница удалена из хранилища')

Для хранилища нет разницы, как запрашивается страница: напрямую или через xmlhttprequest - оно проверяет точное совпадение URL и возвращает страницу из хранилища, если она там есть.

Это, пожалуй, самый востребованный тип хранилища. У него есть два важных свойства:

  1. Он получает список URL для локального-хранения с сервера, в виде файла-"манифеста" в формате JSON. Кроме того, манифест содержит версию.
  2. Каждый URL в манифесте может содержать дополнительные опции поиска совпадения:
    ignoreQuery
    при поиске в хранилище параметры (все после вопр. знака) будут игнорироваться
    matchQuery
    Набор условий на параметры запроса, при совпадении страница будет возвращена из хранилища

После получения манифеста Gears скачивает все перечисленные там страницы и сохраняет их локально.

При каждом изменении версии манифеста все файлы будут скачаны заново.

Типичный способ использования:

  1. Создать хранилище:
    var localServer = google.gears.factory.create('beta.localserver')
    var store = localServer.createManagedStore('store')
    
  2. Запросить с сервера манифест:
    store.manifestUrl = '/files/gears/manifest.php'
    
  3. Запустить процесс обновления:

    store.checkForUpdate()
    

    Метод checkForUpdate работает асинхронно, ход обновления можно узнать, прикрепив обработчики к хранилищу для событий onprogress/onerror/oncomplete.

Если не запускать обновления явным образом при помощи checkForUpdate - Gears будет проверять обновления (запрашивать сервер) самостоятельно при каждом получении страницы из хранилища, но не чаще чем раз в 10 секунд.

В этом - важное отличие от обычного ResourceStore, которое обновляется только "вручную".

Следующий пример манифеста содержит основные используемые опции с комментариями к ним.

{
  // версия манифеста
  "betaManifestVersion": 2,

  // версия манифеста
  "version": "123456789",

  // список страниц,
  // относительные пути - идут относительно URL манифеста 
  "entries": [
      // загрузить ресурс с сервера и сохранить локально
      { "url": "main.js" }

      // локальный URL: main.html, удаленный - main_offline.html
      // при запросе main.html, LocalServer вернет main_offline.html
      { "url": "main.html", "src": "main_offline.html" },

      // вместо src указана опция redirect
      // LocalServer перенаправит браузер на main.html со статусом 302
      { "url": ".", "redirect": "main.html" },

      // выдавать локально сохраненный formHandler.html
      // при любых запросах вида formHandler.html?param1=..&param2...
      { "url": "formHandler.html", "ignoreQuery": true }
    ]
}

Более подробную информацию вы можете получить в документации к манифесту.

Как правило, набор статических файлов (картинок, стилей, скриптов) - не меняется в пределах версии сайта/релиза/"апа"/"деплоя на продакшн".

Поэтому, указав эту версию в манифесте (например, точную дату или ревизию), и собрав в нем всю статику, можно позволить Gears один раз загрузить весь набор и навсегда (до следующей версии) избавить посетителя от лишних запросов к серверу.

Все картинки, скрипты и т.п. Gears будет возвращать из соответствующего ManagedResourceStore.

Таким образом оптимизируют свои админки контент-системы, такие как Joomla, Wordpress и т.п.

Грамотно настроенный веб-сервер/приложение, использующие технологии Умное Кеширование и Версионность в Javascript/CSS, могут быть так же эффективны, и при этом не нужно плагина на клиенте.

Хотя для такой настройки сервера есть ряд ограничений, в частности, в URL лучше не иметь знак вопроса - некоторые браузеры не будут жестко кешировать такие страницы, она вполне применима и отлично работает. Без Gears. Более подробно - описано в самой статье.

  • Умное кеширование не требует плагина.
  • ManagedResourceStore почти не требует изменения в приложении, просто пишется небольшой дополнительный код для создания и обновления манифеста.
  • Умное кеширование позволяет обновить один ресурс, не затрагивая остальные
  • ManagedResourceStore позволяет:
    • указать опции сравнения: ignoreQuery/matchQuery
    • выбирать хранилище по имени в методе openManagedStore
    • ограничить хранилище указанием requiredCookie

Как видите, есть место для обоих технологий.

Кстати, о плагинах...

В Firefox к Gears имеют доступ расширения. Это можно использовать. Например, Greasemonkey может запускать пользовательские скрипты для сайта.

Такой скрипт может загружать статику в локальное хранилище вне зависимости от поддержки Gears сайтом.
Таким образом оптимизация сайта может быть сделана на стороне посетителя, независимо от поддержки сайтом разных полезных технологий

Все начинается с класса Desktop, метода openFiles.

Он позволяет посетителю выбрать несколько файлов "родным" селектором операционной системы. Например, в Windows можно выделить файлы мышкой.

Первый аргумент - функция, которой будут передан
ы выбранные файлы, вторым можно указать объект опций с параметрами filter/singleFile (см. OpenFileOptions).

var desktop = google.gears.factory.create('beta.desktop');
desktop.openFiles(
  function (files) { alert('Выбрано файлов: ' + files.length) }
)

Вызвать эту функцию можно, например, при клике на кнопку, то есть вообще без элемента типа <input type="file">.

Файлы передаются в виде массива объектов типа File.
Каждый файл имеет имя name и содержимое blob.

Доступ к содержимому файла предоставляет наибольший интерес.
Это объект типа Blob.

Gears предоставляет следующие возможности для манипуляции Blob.

  • Canvas API позволяет делать операции crop/resize над файлами-изображениями.
  • Blob API дает возможность вырезать часть Blob'а, а BlobBuilder - добавить данные к существующему Blob
  • Локальное хранилище ResourceStore предоставляет метод getAsBlob(url), возвращающий полученный ресурс в виде Blob. Таким образом, Blob можно получить из файла с сервера
  • HttpRequest (аналог XmlHttpRequest) умеет отправлять Blob на сервер и возвращать текущее состояние процесса загрузки ProgressEvent.

Сетевые операции, как и все операции gears, выполняются только в контексте текущего протокола-домена-порта (same origin).

Gears, по возможности не хранит весь Blob в памяти. Для файлов Blob - это лишь указатель на файл, который может быть размером в сотни и тысячи мегабайт. При этом если файл меняется в процессе работы, и какие-то операции становятся некорректными (например, файл удален с диска) - Gears инициирует исключение.

Что это дает на практике?

Для картинок - можно обрабатывать их локально (на уровне crop/resize). Объект Canvas умеет делать операции над Blob, но не умеет показывать картинку на экране.

Поэтому показ картинки (и вообще, типичный способ добавления Blob в DOM) состоит из следующих шагов:

  1. Подготовить объект типа Blob
  2. Загрузить его в локальное хранилище типа ResourceStore, используя метод captureBlob(Blob blob, string url, string optContentType)
  3. Вставить на страницу элемент, который прочитает данные с адреса url, например <img src="url">

Продемонстрируем это на примере.

Следующий пример масштабирует выбранную картинку до размера 150x150 без сохранения пропорций и показывает результат. А может отправить получившееся изображение на сервер и т.п.

Конечно, не всем нужно масштабировать картинки, но пример - типовой и демонстрирует один из вариантов использования разных компонент gears вместе.

Контейнер для картинки:

function resize() {
  var desktop = google.gears.factory.create('beta.desktop');
  // опция singleFile для выбора не более одного файла
  desktop.openFiles(resizeAndShow,
    { singleFile : true, filter: ['image/jpeg', 'image/gif', 'image/png'] }
  )
}

function resizeAndShow(files) {
  // (1)
  var canvas = google.gears.factory.create('beta.canvas');
  canvas.decode(files[0].blob)
  canvas.resize(150,150)
  var blob = canvas.encode("image/jpeg")

  // (2)
  var localServer = google.gears.factory.create('beta.localserver')
  var store = localServer.createStore('store')
  // (2.1)
  var url = '/img.jpg?'+Math.random()
  store.captureBlob(blob, url, "image/jpeg")  
  // (3)
  $('#resized').css('background-image', 'url('+url+')')
  $('#resized')[0].scrollIntoView()

  // (4)
  setTimeout(function (){store.remove(url)},0)
}

Функция resize запускает выбор файла, а resizeAndShow выполняет основные операции.
Рассмотрим ее более подробно.

  1. Декодировать картинку из содержимого первого (в нашем случае - единственного) выбранного файла, отмасштабировать ее, а затем обратно закодировать в Blob.
  2. Инициализовать хранилище
    1. Положить картинку в хранилище по временному адресу, чтобы затем браузер отобразил ее, обратившись по нему. Используется временный URL.

      Чтобы избежать возможного кеширования, он выбирается случайным образом.

      Хранилище ResourceStore возвратит картинку только при полном совпадении url, так что конфликта с обычным изображением img.jpg не возникнет.

      При записи картинки в хранилище явно указан тип содержания: image/jpeg

  3. Использовать URL с картинкой в качестве фона для контейнера. Вторая строчка прокручивает страницу, чтобы сделать контейнер видимым.
  4. Мы использовали хранилище с временным URL для показа картинки. После того, как картинка будет показана, стоит почистить хранилище. Оно хранится на компьютере посетителя, и не стоит забивать его излишним мусором.

    Если убрать setTimeout, то remove выполнится тут же, до того как браузер отрендерит background-image. Использование setTimeout откладывает вызов, так что он произойдет после показа картинки.

Как видно из примера, компоненты Gears отлично пригнаны друг к другу и замечательно взаимодействуют между собой.

Youtube давно использует Google Gears для закачивания больших файлов: http://www.youtube.com/my_videos_multiupload.
При помощи Gears это реализуется очень удобно.

Используемые компоненты Gears:

HttpRequest
Для коммуникации с сервером.
Desktop API
Для выбора файла посетителем.
Blob API
Для доступа к части файла, т.е. большой файл отправляется на сервер по частям.
Worker API
Для создания отдельного потока, который загружает файл.

Файлы, реализующие закачку, не обфусцированы и доступны напрямую по ссылкам (на всякий случай сделал зеркало).

Общая схема загрузки файла на Youtube такова.

  1. Пользователь выбирает файлы при помощи desktop.openFiles, что дает нам содержимое файла в виде объекта Blob
  2. Для отправки файла на сервер инициализуется объект up.SingleUploader.
  3. Файл пересылается по частям, максимальный размер части задан константой up.CHUNK_SIZE. Пересылку каждой части выполняет метод upload_.
  4. Внутри upload_ первый, а затем и каждый следующий кусок выдирается из файла в виде строки вызовом Blob API: file.blob.slice. Текущая позиция в файле сохраняется в свойстве offset.
  5. Подготавливаются стандартные заголовки загрузки файла, включая Content-Disposition, а также добавляются заголовки с авторизационными данными и идентификатор пересылки.
  6. Данные файла, заголовки и каллбэки отправляются на выполнение Worker'у, который отсылает запрос на сервер
  7. По мере выполнения запроса HttpRequest вызывает событие onprogress. Это событие Worker через каллбэк транслирует основному процессу, который рисует progress bar.
  8. По завершении закачки Worker вызывает каллбэк основного процесса onUploadComplete_, который, если все в порядке, снова вызывает upload_ (см. 4).
  9. Метод upload_, как только увидит (сравнив offset с размером файла), что пересылка подошла к концу, вызывает finishUpload_
  10. Серверная часть отслеживает пересылку по идентификатору пересылки и собирает большой файл по частям.

Конкретные детали, если они вам понадобятся, вы без труда поймете из кода. Все реализуется корректно и без каких-либо хаков.

Надо сказать, идея Youtube не нова. Такой способ отсылки запросов на сервер можно использовать и со стандартным XMLHTTPRequest. Другое дело, что передать содержимое файла XMLHTTPRequest средствами стандартного javascript нельзя.

Да и остальные компоненты Gears здесь как нельзя кстати.

На этом описание возможностей Google Gears подошло к концу. Все основные возможности мы разобрали.

Остались всего несколько небольших.

  • Создание shortcut на рабочем столе с указанием иконки через URL. Делается desktop.createShortcut (Google demo)
  • Получение текущего местоположения позиции вызовом Geolocation API - работает, в том числе, и для мобильных устройств.
  • Принятие Drag'n'drop объектов на уровне OS (перенос объектов в окошко браузера) при помощи Desktop API.
    Эта часть HTML5 частично реализована в Firefox 3.5, но Gears позволяет читать содержимое перенесенных файлов.

Разобраться с этими возможностями вы легко сможете из примеров. Пока я не встречал их удачного применения в известных приложениях, но кто знает - может быть, вы будете первым.

Теперь и правда все. Gear it up, dude!

Следующие ссылки содержат основную информацию о разработке и Gears API.


Автор: ferozshaikh (не зарегистрирован), дата: 26 сентября, 2021 - 13:58
#permalink

Thanks for a wonderful share. Your article has proved your hard work and experience you have got in this field. Brilliant .i love it reading.
fmcg distribution company in Nigeria


Автор: pioneerseo (не зарегистрирован), дата: 3 октября, 2021 - 08:21
#permalink

Astounding read, Positive webpage, where did u think of the data on this posting?I have perused a couple of the articles on your site now, and I extremely like your style. You rock and please keep up the compelling work. 먹튀사이트


Автор: Гость (не зарегистрирован), дата: 7 октября, 2021 - 15:55
#permalink

Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
레플리카사이트


Автор: Гостьsd (не зарегистрирован), дата: 7 октября, 2021 - 15:56
#permalink

Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
레플리카사이트


Автор: Гость (не зарегистрирован), дата: 7 октября, 2021 - 15:58
#permalink

Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks

레플리카사이트


Автор: gratis sex chat (не зарегистрирован), дата: 11 октября, 2021 - 13:26
#permalink

gratis sex chat – for more interesting informations!


Автор: Гость (не зарегистрирован), дата: 11 октября, 2021 - 16:12
#permalink

I have been checking out a few of your stories and i can state pretty good stuff. I will definitely bookmark your blog
my lowes life


Автор: john bond (не зарегистрирован), дата: 11 октября, 2021 - 17:10
#permalink

Love to read it,Waiting For More new Update and I Already Read your Recent Post its Great Thanks.
출장마사지


Автор: Гость (не зарегистрирован), дата: 18 октября, 2021 - 17:03
#permalink

Love what you're doing here guys, keep it up!..
Cherada


Автор: Гость (не зарегистрирован), дата: 23 октября, 2021 - 16:50
#permalink

nice post, keep up with this interesting work. It really is good to know that this topic is being covered also on this web site so cheers for taking time to discuss this!
강남오피


Автор: Гость (не зарегистрирован), дата: 26 октября, 2021 - 08:21
#permalink

I have read your article, it is very informative and helpful for me.I admire the valuable information you offer in your articles. Thanks for posting it..
custom laptop brands


Автор: Гость (не зарегистрирован), дата: 27 октября, 2021 - 16:45
#permalink

This is my first time i visit here. I found so many interesting stuff in your blog especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here! keep up the good work
Real estate Playa Del Carmen


Автор: Гость (не зарегистрирован), дата: 30 октября, 2021 - 21:01
#permalink

Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post.
Online Books Portal


Автор: Гость (не зарегистрирован), дата: 1 ноября, 2021 - 10:14
#permalink

Thanks for your information, it was really very helpfull..
Tony robbins Books


Автор: Гость (не зарегистрирован), дата: 1 ноября, 2021 - 10:17
#permalink

Nice Informative Blog having nice sharing..
Tony robbins Books


Автор: ferozshaikh (не зарегистрирован), дата: 1 ноября, 2021 - 10:33
#permalink

Thanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative. I can't wait to read lots of your posts.
Information Technology


Автор: ferozshaikh (не зарегистрирован), дата: 1 ноября, 2021 - 10:34
#permalink

The information you have posted is very useful. The sites you have referred was good. Thanks for sharing this…..
Information Technology


Автор: pioneerseo (не зарегистрирован), дата: 9 ноября, 2021 - 07:17
#permalink

Truly, this article is really one of the very best in the history of articles. I am a antique ’Article’ collector and I sometimes read some new articles if I find them interesting. And I found this one pretty fascinating and it should go into my collection. Very good work! agen bandarq online


Автор: Гость (не зарегистрирован), дата: 13 ноября, 2021 - 11:58
#permalink

I’ve been searching for some decent stuff on the subject and haven't had any luck up until this point, You just got a new biggest fan!..
email marketing companies


Автор: Гость (не зарегистрирован), дата: 13 ноября, 2021 - 12:46
#permalink

Positive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include.
email marketing companies


Автор: john bond (не зарегистрирован), дата: 13 ноября, 2021 - 23:29
#permalink

i am always looking for some free stuffs over the internet. there are also some companies which gives free samples.
출장마사지


Автор: Гость (не зарегистрирован), дата: 14 ноября, 2021 - 09:08
#permalink

it was a wonderful chance to visit this kind of site and I am happy to know. thank you so much for giving us a chance to have this opportunity..

butik masaj


Автор: Гость (не зарегистрирован), дата: 27 ноября, 2021 - 15:11
#permalink

Nice to read your article! I am looking forward to sharing your adventures and experiences.
คำคม


Автор: Гость (не зарегистрирован), дата: 27 ноября, 2021 - 15:12
#permalink

Nice to read your article! I am looking forward to sharing your adventures and experiences.
คำคม


Автор: Гость (не зарегистрирован), дата: 8 декабря, 2021 - 18:33
#permalink

I really thank you for the valuable info on this great subject and look forward to more great posts. Thanks a lot for enjoying this beauty article with me. I am appreciating it very much! Looking forward to another great article. Good luck to the author! All the best!
Valves in uae


Автор: ferozshaikh (не зарегистрирован), дата: 9 декабря, 2021 - 15:07
#permalink

The website is looking bit flashy and it catches the visitors eyes. Design is pretty simple and a good user friendly interface.
pre owned rolex


Автор: Гость (не зарегистрирован), дата: 10 декабря, 2021 - 22:21
#permalink

I read a article under the same title some time ago, but this articles quality is much, much better. How you do this..
check valve


Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:33
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:34
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:35
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:36
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:36
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:36
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:37
#permalink

Автор: Isabel (не зарегистрирован), дата: 14 декабря, 2021 - 15:37
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 15 декабря, 2021 - 16:31
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 15 декабря, 2021 - 16:32
#permalink

Автор: keo nhacai (не зарегистрирован), дата: 16 декабря, 2021 - 12:00
#permalink

I've been using WordPress on a number of websites for about a year and am worried about switching to another platform. I have heard good things about keo nhacai. Is there a way I can transfer all my wordpress content into it? Any help would be really appreciated!


Автор: Гость (не зарегистрирован), дата: 19 декабря, 2021 - 14:42
#permalink

Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
Arborist


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2021 - 09:23
#permalink

I'm glad I found this web site, I couldn't find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, i am always look for people to check out my web site.
zinc citrate


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2021 - 14:43
#permalink

I would like to say that this blog really convinced me to do it! Thanks, very good post.read more


Автор: Гость (не зарегистрирован), дата: 23 декабря, 2021 - 08:24
#permalink

Wonderful article, thanks for putting this together! This is obviously one great post. Thanks for the valuable information and insights you have so provided here.
carte yugioh


Автор: Гость (не зарегистрирован), дата: 23 декабря, 2021 - 13:56
#permalink

This is a great inspiring article.I am pretty much pleased with your good work.You put really very helpful information...
banklast


Автор: ferozshaikh (не зарегистрирован), дата: 23 декабря, 2021 - 17:07
#permalink

Superbly written article. if only all bloggers offered the same content as you. the internet would be a far better place..
business for sale south africa


Автор: 안전놀이터 (не зарегистрирован), дата: 29 декабря, 2021 - 06:21
#permalink

The adults always told us how to play safely. I think what adults say is always right. Let's find out how to play safely. 안전놀이터


Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:12
#permalink

Автор: Isabel (не зарегистрирован), дата: 3 января, 2022 - 16:13
#permalink

Автор: Isabel (не зарегистрирован), дата: 3 января, 2022 - 16:13
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:15
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:16
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:17
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:17
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:18
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:18
#permalink

Автор: Federico (не зарегистрирован), дата: 3 января, 2022 - 16:18
#permalink

Автор: 토토사이트추천 (не зарегистрирован), дата: 12 января, 2022 - 12:28
#permalink

Yes i am completely concurred with this article and i simply need say this article is extremely decent and exceptionally useful article.I will make a point to be perusing your blog more. You made a decent point yet I can"t resist the urge to ponder, shouldn"t something be said about the other side? 토토사이트추천


Автор: adada (не зарегистрирован), дата: 20 января, 2022 - 16:22
#permalink

I would like to say that this blog really convinced me to do it! Thanks. very good post.
Grocery Delivery Zimbabwe


Автор: Гость (не зарегистрирован), дата: 21 января, 2022 - 00:01
#permalink

This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post!
governance risk compliance gdpr software


Автор: Гость (не зарегистрирован), дата: 22 января, 2022 - 08:43
#permalink

Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
things to do in the cayman islands


Автор: Гость (не зарегистрирован), дата: 22 января, 2022 - 22:51
#permalink

I think this is an informative post and it is very useful and knowledgeable. therefore. I would like to thank you for the efforts you have made in writing this article.
xerium


Автор: Гость (не зарегистрирован), дата: 23 января, 2022 - 13:57
#permalink

I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
서울안마


Автор: Гость (не зарегистрирован), дата: 29 января, 2022 - 19:01
#permalink

I was looking at some of your posts on this website and I conceive this web site is really instructive! Keep putting up..
whitelabel seo reports


Автор: Юрий Василенко, дата: 30 января, 2022 - 09:34
#permalink

Автор: Roofing Contractor (не зарегистрирован), дата: 1 февраля, 2022 - 07:06
#permalink

I've been looking also for some tutorials but found this great site and your article also. Thanks anyway for sharing! Roofing Contractor Olympia


Автор: i5 Exteriors (не зарегистрирован), дата: 1 февраля, 2022 - 07:09
#permalink

I've been looking also for some tutorials but found this great site and your article also. Thanks anyway for sharing! Roofing Contractor Olympia


Автор: Гость (не зарегистрирован), дата: 2 февраля, 2022 - 12:19
#permalink

I read that Post and got it fine and informative. Please share more like that...
xerium


Автор: jowasiw286 (не зарегистрирован), дата: 5 февраля, 2022 - 16:22
#permalink

I found that site very usefull and this survey is very cirious. I ' ve never seen a blog that demand a survey for this actions. very curious...
redraiderrvpark


Автор: 안전놀이터 (не зарегистрирован), дата: 28 февраля, 2022 - 20:28
#permalink

안전놀이터 With the victory, Ginseng Corporation scored 14 wins and 15 losses and 43 points in the season. On the other hand, Hyundai Engineering & Construction suffered its first consecutive loss of the season


Автор: 토토사이트 (не зарегистрирован), дата: 3 марта, 2022 - 06:49
#permalink

How are you all living in the era of untact? I'm trying in a variety of ways 토토사이트


Автор: 토토사이트 (не зарегистрирован), дата: 3 марта, 2022 - 06:51
#permalink

How are you all living in the era of untact? I'm trying in a variety of ways. 토토사이트


Автор: Гость (не зарегистрирован), дата: 3 марта, 2022 - 15:59
#permalink

Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that "The content of your post is awesome" Great work.
a course in miracles


Автор: 토토사이트 (не зарегистрирован), дата: 4 марта, 2022 - 15:11
#permalink

https://mukoff.com/
Last week, deputies were called to a San Marin daycare owned by Goularte's mother regarding an alleged sexual assault involving a child, the Santa Clara County Sheriff's Office said in a statement Wednesday.


Автор: 메이저토토사이트 (не зарегистрирован), дата: 11 марта, 2022 - 07:41
#permalink

An intriguing discussion may be worth comment. I’m sure you should write much more about this topic, may well be described as a taboo subject but generally folks are too little to chat on such topics. An additional. Cheers 메이저토토사이트


Автор: keonhacai (не зарегистрирован), дата: 11 марта, 2022 - 09:58
#permalink

Thanks for your post. The article is neatly organized with the information I want, so there are many things to refer to. Bookmark this site and visit often in the future. Thanks again.^^ keonhacai


Автор: site789 (не зарегистрирован), дата: 20 марта, 2022 - 13:02
#permalink

Автор: Гость (не зарегистрирован), дата: 22 марта, 2022 - 13:12
#permalink

It is a great website.. The Design looks very good.. Keep working like that!.
red sox news


Автор: drift hunters (не зарегистрирован), дата: 25 марта, 2022 - 04:35
#permalink

Drift Hunters is Car Driving and Racing Simulator. Best Car Tuning on Android!


Автор: Bregtje Looijmans (не зарегистрирован), дата: 5 апреля, 2022 - 20:38
#permalink

Speeddaten is famous for: communication on topics you are interested in;


Автор: Гость (не зарегистрирован), дата: 11 апреля, 2022 - 12:32
#permalink

I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
cameronjamesusa


Автор: adadad (не зарегистрирован), дата: 11 апреля, 2022 - 12:33
#permalink

I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
cameronjamesusa


Автор: Monika Lanig (не зарегистрирован), дата: 13 апреля, 2022 - 20:39
#permalink

Sex in Berlin Ogłoszenia kontaktowe to, że tak powiem, standardowe serwisy randkowe, w których single rejestrują się, tworzą profil i za jego pomocą ujawniają publicznie informacje o sobie. Istnieją oczywiście liczne odmiany tego typu stron, np. strony poświęcone związkom dla określonych grup ludzi (gotów, rozwodników, społeczności LGBT itp.). Serwisy randkowe umożliwiają także wyszukiwanie osób na podstawie różnych czynników (wiek, wzrost, lokalizacja, odległość, zainteresowania itp.)


Автор: vince (не зарегистрирован), дата: 15 апреля, 2022 - 02:33
#permalink

Автор: EdnaFidelma (не зарегистрирован), дата: 15 апреля, 2022 - 06:28
#permalink

Download Cuphead Mobile game on Android phones at https://modpree.com/cuphead/


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 02:50
#permalink

Автор: Sensory (не зарегистрирован), дата: 20 мая, 2022 - 09:53
#permalink

There are also articles on these topics on my blog and I hope you visit once and have a deep discussion! 메이저놀이터


Автор: Mino (не зарегистрирован), дата: 23 мая, 2022 - 06:13
#permalink

Hello ! I am the one who writes posts on these topics 카지노사이트 I would like to write an article based on your article. When can I ask for a review?


Автор: Bhfd (не зарегистрирован), дата: 23 мая, 2022 - 19:14
#permalink

Thanks for the information, this is a great work. Download your latest MP3, video, Album music at
Liteboxmusic
DOWNLOAD MP3
DOWNLOAD MP3 MUSIC
DOWNLOAD LATEST MP3 MUSIC
MP3 MUSIC
DOWNLOAD LATEST SONGS


Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 14:58
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 15:02
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 15:03
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 15:04
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 15:04
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 15:05
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 15:05
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:11
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:12
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:12
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:13
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:13
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:14
#permalink

Автор: Isabel (не зарегистрирован), дата: 9 июня, 2022 - 16:14
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:18
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:20
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:22
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:23
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:24
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:24
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 10 июня, 2022 - 14:25
#permalink

Автор: 비아그라구매 (не зарегистрирован), дата: 14 июня, 2022 - 05:41
#permalink

We are looking for a lot of data on this item. In the meantime, this is the perfect article I was looking for . Please post a lot about items related to 비아그라구매 !!! I am waiting for your article. And when you are having difficulty writing articles, I think you can get a lot of help by visiting my .


Автор: sex winterthur (не зарегистрирован), дата: 15 июня, 2022 - 20:33
#permalink

Enjoy sexy contacts with fine ladies in EU only at sex winterthur


Автор: hyjfgj (не зарегистрирован), дата: 16 июня, 2022 - 11:12
#permalink

I visited last Monday, and in the meantime, I came back in 우리카지노계열 anticipation that there might be other articles related to I know there is no regret and leave a comment. Your related articles are very good, keep going!!


Автор: 열공캔디 (не зарегистрирован), дата: 17 июня, 2022 - 07:32
#permalink

It seems like I've never seen an article of a kind like . It literally means the best thorn. It seems to be a fantastic article. It is the best among articles related to 열공캔디 . seems very easy, but it's a difficult kind of article, and it's perfect.


Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 15:58
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 15:58
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 15:59
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 15:59
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 16:00
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 16:00
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 17 июня, 2022 - 16:01
#permalink

Автор: 열공캔디 (не зарегистрирован), дата: 21 июня, 2022 - 06:45
#permalink

I am contemplating this topic. I think you can solve my problems. My site is at " 열공캔디 ". I hope you can help me.


Автор: 비아그라 (не зарегистрирован), дата: 24 июня, 2022 - 10:27
#permalink

It's very interesting. And it's fun. This is a timeless article. I also write articles related to , and I run a community related to 비아그라 . For more information, please feel free to visit !!


Автор: Гость (не зарегистрирован), дата: 3 июля, 2022 - 09:22
#permalink

This is a smart blog. I mean it. You have so much knowledge about this issue, and so much passion. You also know how to make people rally behind it, obviously from the responses.


Автор: 비아그라구매 (не зарегистрирован), дата: 3 июля, 2022 - 10:06
#permalink

When did it start? The day I started surfing the Internet to read articles related to . I've been fond of seeing various sites related to 비아그라구매 around the world for over 10 years. Among them, I saw your site writing articles related to and I am very satisfied.


Автор: Niki Bolla (не зарегистрирован), дата: 14 июля, 2022 - 20:37
#permalink

Автор: 마하캔디 (не зарегистрирован), дата: 15 июля, 2022 - 10:58
#permalink

I always think about what is. It seems to be a perfect article that seems to blow away such worries. 마하캔디 seems to be the best way to show something. When you have time, please write an article about what means!!


Автор: 바카라게임사이트 (не зарегистрирован), дата: 17 июля, 2022 - 11:51
#permalink

I'm so happy to finally find a post with what I want. 바카라게임사이트 You have inspired me a lot. If you are satisfied, please visit my website and leave your feedback.


Автор: 해머캔디 (не зарегистрирован), дата: 18 июля, 2022 - 11:03
#permalink

Hello! Nice to meet you, I say . The name of the community I run is 해머캔디 , and the community I run contains articles similar to your blog. If you have time, I would be very grateful if you visit my site .


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 23 июля, 2022 - 11:24
#permalink

I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I'll quote this post and post it on my blog. Would you like to visit my blog later? 온라인카지노사이트


Автор: 온라인카지노사이트 (не зарегистрирован), дата: 23 июля, 2022 - 11:25
#permalink

I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I'll quote this post and post it on my blog. Would you like to visit my blog later? 온라인카지노사이트
ZFVDFG


Автор: 바카라사이트 (не зарегистрирован), дата: 6 августа, 2022 - 10:38
#permalink

This is the perfect post.바카라사이트 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.
dxzgh


Автор: 베트남 황제투어 (не зарегистрирован), дата: 20 августа, 2022 - 07:45
#permalink

Which is some inspirational stuff. Never knew that opinions might be this varied. Thank you for all the enthusiasm to provide such helpful information here.베트남 황제투어 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.


Автор: 바카라사이트 (не зарегистрирован), дата: 23 августа, 2022 - 06:02
#permalink

This is the perfect post.바카라사이트 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.
fdhfgd


Автор: 바카라사이트 (не зарегистрирован), дата: 5 сентября, 2022 - 03:22
#permalink

LIVE 바카라사이트 GAMES - Sunday stream!


Автор: 다낭 밤문화 (не зарегистрирован), дата: 5 сентября, 2022 - 07:06
#permalink

After study a handful of the blog posts with your internet site now, we truly like your technique for blogging. I bookmarked it to my bookmark internet site list and are checking back soon. 다낭 밤문화


Автор: Gaia1956 (не зарегистрирован), дата: 19 сентября, 2022 - 15:17
#permalink

Автор: Isabel (не зарегистрирован), дата: 19 сентября, 2022 - 15:20
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 19 сентября, 2022 - 15:39
#permalink

Автор: Gaia1956 (не зарегистрирован), дата: 20 сентября, 2022 - 15:46
#permalink

Автор: keonhacai (не зарегистрирован), дата: 6 октября, 2022 - 07:14
#permalink

Hello! I could have sworn I've been to this site before but after checking through some of the post I realized it's new to me. Nonetheless, I'm definitely happy I found keonhacai and I'll be book-marking and checking back frequently!


Автор: 해머캔디효과 (не зарегистрирован), дата: 9 октября, 2022 - 06:10
#permalink

What a nice post! I'm so happy to read this. 해머캔디효과 What you wrote was very helpful to me. Thank you. Actually, I run a site similar to you. If you have time, could you visit my site? Please leave your comments after reading what I wrote. If you do so, I will actively reflect your opinion. I think it will be a great help to run my site. Have a good day.


Автор: 바카라사이트추천 (не зарегистрирован), дата: 9 октября, 2022 - 06:22
#permalink

Your article was very impressive to me. It was unexpected information,but after reading it like this 바카라사이트추천, I found it very interesting.


Автор: 해머캔디가격 (не зарегистрирован), дата: 16 октября, 2022 - 05:40
#permalink

I finally found what I was looking for! I'm so happy. 해머캔디가격 Your article is what I've been looking for for a long time. I'm happy to find you like this. Could you visit my website if you have time? I'm sure you'll find a post of interest that you'll find interesting.


Автор: 바카라사이트추천 (не зарегистрирован), дата: 28 октября, 2022 - 10:11
#permalink

I’m not sure exactly why but this weblog is loading incredibly slow for me. Is anyone else having this problem or is it a problem on my end? I’ll check back later on and see if the problem still exists. 바카라사이트추천
fhj


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
2 + 16 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum