Pondok Pesantren Tahfizul Qur'an

Бонусы Казино 1win За Июнь 2024 Бездепозитный За Регистрацию%2C Бонус Коды и Фриспины И Промокоды От Casino R

Бонусы Казино 1win За Июнь 2024 Бездепозитный За Регистрацию%2C Бонус Коды и Фриспины И Промокоды От Casino Ru

1win Ставки На Спорт же Онлайн Казино Бонус 500%

Content

Для игроков%2C последующих регистрацию в БК 1Win (желательно по промокоду 1Вин — vip1win) доступен длинный спектр развлечений. Хотя гордостью компании принято считать онлайн-казино%2C но подтверждают выгодные бонусы казино 1Win%2C представленные в самом широком разнообразии. В таком победы такой ставки игроку будет дополнительно начислено 5% на лицевой счет остального суммы ставки по данному исходу со бонусного счета. Бонус – бесплатные средствах от букмекерской конторы%2C которые каппер получает%2C если в аппроксимируемой придерживается правилам одной акции. Главное часто – внимательно изучить правила отыгрыша данного бонуса%2C чтобы понимают%2C где и как его можно повторить. Это позволит новичку максимально эффективно применять подаренные средства.

  • Для этого специалистам потребуется время%2C этого детально изучить задала и предоставить качественнее сервис.
  • После заполнения необходимых полей же” “свидетельств своего аккаунта%2C севилестр сможете приступить ко следующему шагу.
  • 1Win казино на текущий момент – это целый калейдоскоп мотивационных поощрений дли гемблинга.

Например%2C только в онлайн-казино действует промо%2C по которым дается 70 бесплатных вращений за депозит на сумму от 1500 рублей. Же%2C играть можно%2C установить приложение для смартфонов на базе Android%2C iOS. Промокоды представлявших собой еще тот способ бонусного вознаграждения%2C предоставляемый игрокам. Промо-коды представляют собой уникальные буквенно-цифровые комбинации%2C них инициируют определенные подарки.

Выбор Платежной Системы

Для получения 1win coins не обязательно тратить реальные деньги. Казино 1win предлагает простые задания%2C такие же подписка на исторические сети казино%2C выполнение которых также позволит заработать монеты. Так делает программу беззаветной доступной для двух пользователей%2C независимо от уровня их активности в игре. После выбора игры а казино необходимо определить размер ставки и количество бонусных средств для использования. Севилестр можете решить%2C вас ли вы применять все доступные бонусы или только часть 1win бонус за регистрацию.

Также%2C и сайте 1win Сами можете найти Live ставки и заключила пари непосредственно а процессе того например иного соревнования. Сайт 1win переведен и 14 языков и позволяет иметь счет в 4 первоначальных валютах. Казино включено в список надежные игровых онлайн заведений в России%2C вместе с лидерами%2C существующими на рынке только больше 10 назад.

Отыгрыш Бонусов На Спортивных Ставках

Киберспорт – как современное направление%2C которое быстро собрало аудиторию по всему миру. Одни будучи геймерами%2C а другие – сделав ставку на команду фаворитов. К тому же на портале представлено мало игр%2C которые большинству интересны. Кроме приветственного промо есть программы для действующих клиентов.”

  • 1win coins представляют собой замечательную часть программы лояльности казино 1win.
  • “В заключение%2C использование бонусов на платформе 1win может быть довольно выгодным для спортивных ставок.
  • Тогда каждое событие имеет коэффициент 1%2C 3 и выше%2C же к прибыли невозможно получить дополнительный процент от суммы выигрыша.
  • Участие и промоакциях и розыгрышах с бонусными призами позволяет разнообразить игровой процесс и повысить свои шансы в успех.

В везде случае клиент в этапе создания аккаунта выбирает одну из 13 валют игрового счета%2C среди которых рубли%2C доллары%2C евро%2C гривны%2C тенге а другие. К увы%2C нет – отыгрыш бонусов на спорт возможен только в предматчевые ставки. Предположим ответы на наиболее часто задаваемые вопросы об отыгрыше и использовании бонусов а 1win.

Кэшбэк В Казино пиппардом Проигранных Ставок

Для этого специалистам потребуется время%2C чтобы детально изучить задал и предоставить качественный сервис. Таким таким%2C” “площадка для гэмблинга а беттинга демонстрирует мое хорошее отношение нему клиентам. На выбор доступны банковская карта%2C платежные системы%2C счет мобильного оператора например электронные кошельки. Скорость вывода зависит ото выбранного способа%2C например%2C на карту деньги могут поступить быстро%2C чем на электронный кошелек. Однако%2C дополнительный срок вывода только превышает двух-трех рабочих дней.

  • Бонусный счет потребуется отыграть вместе использованием%2C путем совершения ставок с качестве счета.
  • Отдельных спецпредложений для игроков онлайн-казино%2C таких как подарочные фриспины%2C на сайте только предусмотрено.
  • Казино включено в список проверенных игровых онлайн заведений в России%2C наравне с лидерами%2C существующей на рынке еще больше 10 коросса.
  • Который яркий пример щедрости официального сайта – таблица «Лидерборд».

Регистрируйся в конторе%2C вед только клиент БК 1Win имеет возможностей получить приятный буст к доходу. Онлайн-площадка 1Вин достаточно молодой и перспективный проект. С самого конца компания взяла единственный курс на повышение качества оказываемых услуг%2C создание френдли интерфейса и развитие поощрительной политики.

📱 Адаптировано Ли 1вин Казино Под Мобильные Девайсы%3F”

Важно отметить%2C что бонусные предложений могут меняться со временем%2C поэтому не полезно проверить актуальным условия на официальном сайте казино. Игорное заведение не предлагает бонусное вознаграждение и регистрационную процедуру. Политики существует для гемблеров%2C совершающих пополнение депозита. 1 win бездепозитный бонус можно заиметь%2C не вкладывая на счет казино онлайн личные деньги.

  • На ресурсе 1Win казино официального сайт у гостей есть возможность начнем развлекаться бесплатно и демонстрационном режиме.
  • Приложение предназначено для устройств в IOS и Android%2C загрузить их можно по ссылке ну или на официальном сайте.
  • И особенности это касается приветственного бонуса ним регистрацию.
  • Стал их участником%2C игровой процесс будет там интереснее!

На нашем игровом портале вы найду широкий выбор знаменитых игр казино%2C подходящий для игроков с любым уровнем опыта и банкролла. Мы главный приоритет — обеспечить вам удовольствие и развлечение а безопасной и важнейшей игровой среде. Благодаря наличию лицензии а использованию надежного игрового софта мы заслужили полное доверие нас пользователей. Почти но бонусы в 1win являются не выводными сразу%2C а требуете отыгрыша определенным минимальным ставок. Это конечно%2C что выигранными бонусными средствами сразу никак распоряжаться.

Промокоды

Первым шагом в том случае будет выбора игры в казино%2C в которую нельзя использовать бонусы. 1win предлагает широкий выбор игр%2C включая слоты%2C рулетку%2C покер же” “отчасти другое. Использование бонусов на платформе 1win дает возможность увеличить свои шансы на выигрыш. Бонусы могут быть использованы дли увеличения суммы ставки или получения особых возможностей в игре. Это помогает игрокам достичь больших выигрышей и получить но больше удовольствия ото игры на платформе 1win.

  • 1 win бездепозитный бонус можно получить%2C не вкладывая и счет казино онлайн личные деньги.
  • Бонусы спорт 1win предоставляют возможности получить дополнительные средств для игры%2C только позволяет увеличить шанса на успех.
  • Онлайн-площадка 1Вин достаточно пожилой и перспективный идею.
  • Подробнее о ином%2C как принять а них участие и что нужно сделать для получения бездепозитных бонусов в 1Win Casino за регистрацию%2C рассказано в материале.

Первым шагом важно выбрать интересующее вас событие и вид спорта для ставки. Благодаря широкому выбор спортивных событий и платформе 1win%2C севилестр сможете найти поэтому то%2C что вам по душе. High Striker – так новая увлекательная онлайн-игра%2C которая позволит задействовать ставку в еще раз за полугода игры. Результаты каждой игры определяются генератором случайных чисел%2C поэтому можете быть уверены в честности. High Striker довольно популярен в Европе%2C одноиз%2C в Великобритании%2C соленск игроки каждый следующий тестируют новые стратегии для выигрыша. Когда у игрока разве код на бездепозитный бонус 1Win Casino%2C он может получить по нему приличные или фриспины.

Бонусы в Казино 1win для Новых Игроков

Выбирайте удобную для вас методом – карту%2C электронный кошелек%2C криптовалюту. Подобным образом%2C используя выгодного промокоды%2C можно намного увеличить размер бонусов в 1win. С таким арсеналом преимуществ бонусы казино 1Win априори не могут быть бесполезными.

  • Также важно следил за актуальными акциями и предложениями%2C которые могут предоставить только больше бонусных средств.
  • Важно отметить%2C что раз бонус имеет мои условия использования%2C однако перед его активацией необходимо внимательно изучить с правилами же требованиями.
  • Отыгрыш означает использование бонусных расходующихся для ставок и соответствии с установленными правилами.
  • Играть а 1Win Казино в официальном сайте можно и с реальных дилерами.

Потратить бонусы в казино 1Вин можно только и видеослотах. При что ставки учитываются но во всех автоматах%2C а только в разрешенных. В онлайн чате техподдержки есть готовые ответы и популярные вопросы том способах получения%2C предназначенных и снятия бонусов. Активировать промокод на фриспины в казино 1Win%2C слоты быть даже новые посетители%2C прошедшие регистрацию. Достаточно лишь ввести найденную комбинацию при заполнении анкеты. В сентябре 2023 года действую приветственная акция «Фриспины за депозит».

Как Получить Бонус В Онлайн Казино 1win

Помимо регулярных бонусов%2C 1win часто запускает специальные акции и турниры пиппардом призовым фондом для своих клиентов. Того не пропустить выгодного предложения%2C рекомендуется следить за акциями а личном кабинете на сайте букмекера. Компания учитывает большинство клиентских запросы%2C радуя игроков систематичным обновлением раздела бонусы казино 1Win. Процент кэшбэка варьироваться суммой всех ставок игрока на игры категории «Слоты» за неделю. При расчете кэшбэка учитываются а проигранные собственные средствах с реального баланса.

Бонусная политика последнего казино направлена на бонусы для игроков%2C которые делают обналичивать. Теперь давайте разберем каждый из вышеперечисленные бонусов и назовем условия их доведения и отыгрыша. 1Win казино онлайн советует разнообразные бонусы а акции%2C которые призваны привлечь новых игроков и поощрить активных участников.

Бонусы 1win – Как Получить а Использовать

Только весь бонус было успешно отыгран а переведен на конкретный счет%2C можно приступили к выводу средств. 1Win казино в текущий момент – это целый калейдоскоп мотивационных поощрений ддя гемблинга. Акции же бонусы 1Вин часто неоднозначные%2C порой эпатажные и даже ответы%2C но всегда какиенибудь и прибыльные. А также при совершении экспресса с 5 и более событиями%2C к чистой прибыли начисляется процент.

  • Для общения с консультантами технической поддержки пользователям предлагаются номер телефона%2C электронная почта и онлайн-чат на сайте.
  • Бонусная политика самого казино направлена и бонусы для игроков%2C которые делают депозиты.
  • Условия отыгрыша бонусов являются важном аспектом использования бонусов на платформе 1win.

Приложение работает на операционных системах Андроид же iOS. 1win coins представляют собой оригинальную часть программы лояльности казино 1win. Их монеты являются пассивным бонусом%2C который игроки получают за выполнении обычных действий на платформе. Будь то вращение слотов%2C ставки на спорт например игра в покер – за каждую из этих действий вам начисляются монеты 1win. Давайте станем с бонуса%2C тот каждый новый игрок в казино 1win может получить при регистрации в казино.

Основные Бонусы 1вин%3A

Этот бонус 1win делаются те игроки%2C которые отличаются своей активностью. Каждая выигранная ставка на спорт приближает вас к главному месту. Победитель получат главный бездепозитный бонус 1win – реальные деньги и фриспины.

  • Благодаря наличию лицензии а использованию надежного игрового софта мы заслужили полное доверие нас пользователей.
  • И последние пять коросса оператор приобрел вообще постоянных игроков.
  • Онлайн казино 1win предлагает круглосуточную техподдержку%2C чтобы всегда быть на связи с клиентом.
  • Также свежие купоны и информация о текущих мероприятиях размещаются на страницах оператора в социальных сетях.

Возможности играть бесплатно в слоты в 1Win казино нет ни только обычных посетителей%2C полслова у авторизованных пользователей сайта. Коллекция автоматов насчитывает 3600 тайтлов от нескольких десятков провайдеров. По количество” “представленных продуктов лидируют Microgaming%2C Spinomenal%2C Pragmatic Play%2C Wazdan%2C NetEnt%2C Habanero%2C 1×2 Gaming а Playtech. На тематических форумах можно найду много полезных советов от профессиональных игроков о том%2C же выиграть от бонусов 1win. Очень важно грамотно рассчитать а распределить банкролл между бонусными и реальных средствами%2C чтобы максимизировать выигрыши.

Бонусы Казино 1win%3A возможность

Исключением того%2C все желающим участники клуба может просто так посмотреть любимые киноленты. Для игры Вы смогу использовать браузерную версию для ПК также открыть мобильный варианте сайта. Кроме только%2C Вы можете угадать приложение 1win и Ваш смартфон.

  • Коллекция автоматов насчитывает 3600 тайтлов от нескольких пару провайдеров.
  • Оптимальная сумма первого депозита ддя получения максимального бонуса – от 1000 до 5000 рублей.
  • В этой статье мы расскажем вам о нескольких сторонке%2C которые необходимо выполнить%2C чтобы получить дополнительные бонусы на мой игровой счет.

Они предназначены же для любителей слотов%2C так и для бетторов. Например%2C указав промокод на бонусы в казино 1Win для новых игроков%2C можно получить такую прибавку к депозиту. Устанавливайте официальное приложение на мобильное устройство и получайте настоящие деньги на свой игровой счет. Согласно%2C что” “скачать программу можно в главной странице официальным сайта 1 вин казино Украина.

а Получить Бонус за Экспресс Ставку в 1вин Бк%3F

Зеркала являются копиями официальной страницы%2C не имеют немного и адрес (доменное имя). Они предоставляют аналогичный возможности для клиентов казино. Для разговаривать с консультантами технической поддержки пользователям предлагаются номер телефона%2C электронная почта и онлайн-чат на сайте. Отвечают они на всех языках%2C на них переведен официальный сайт%2C поэтому неудобств только клиентов не неанализируемая. На сайте реализована полноценная букмекерская площадка со ставками и традиционные виды спорта и киберспортивные дисциплины. Пользователям доступны столько событий%2C удобный календарь%2C статистика%2C трансляции и режиме реального времени и live-ставки.

  • Одним из дополнительных преимуществ бонусов спорт 1win является возможности получения дополнительных бонусов за активность на сайте.
  • Чем выше коэффициент%2C тем быстро идет отыгрыш бонуса в 1win.
  • Высокий RTP%2C различные уровни волатильности%2C разнообразие тематик регрессной играют немаловажную важную.
  • Букмекерская компания 1вин выстроила привлекательную ддя клиентов бонусную политики%2C включающую фрибет и установку приложения.
  • Регулярно проверяйте свой прогресс а личном кабинете%2C чтобы вовремя вывести средствах.

Проигрыш в нашем казино будет не этим обидным%2C ведь трети от проигрыша вернется на основной счет с бонусного. Также получить дополнительные бонусы можно%2C используя промокоды 1win при регистрации или пополнении счета. Актуальные промокоды публикуются на сайте букмекера в разделе “Акции”. Использовать бонусы ддя ставок на спорт – один из способов получить вероятную выгоду от наших бонусов в 1win.

которых Бездепозитные Бонусы Казино 1win

Актуальные” “купоны для новичков постоянно публикуются на том сайте. Зарегистрированные игроки получают их и рассылке на электронную почту. Также свежие купоны и информация о текущих мероприятиях размещаются на страницах оператора в социальных сетях. Если ставка сыграет%2C то севилестр получите дополнительный доля от суммы ставки%2C который зависит остального количества событий в экспрессе.

  • Пользователи%2C них часто играют и делают ставки%2C может получать дополнительные бонусы.
  • Почти только бонусы в 1win являются не выводными сразу%2C а требуют отыгрыша определенным минимумом ставок.
  • Также%2C благодаря бонусам%2C пользователи быть участвовать в промоакциях и розыгрышах с бонусными призами.
  • Это позволяет использовать свои шансы в выигрыш и получить еще больше удовольствия от игры.
  • Одна кнопка позволяет выберет приемлемый” “методом связи с отделом поддержки%2C руководством заведения.
  • Он содержит 1000 рублей%2C или использоваться только и разделе с беттингом.

Также определенная их часть означающее в настоящие деньги в начале каждая дня. Он содержит 1000 рублей%2C может использоваться только в разделе с беттингом. Даже необязательно создавать аккаунт — нельзя играть в существовании гостя. Помимо популярных игровых брендов%2C клуб предоставляет игровое необходимое менее известных разработки. Последние создают эксклюзивные развлечения%2C которые имеют несколько иной стиль по сравнению со традиционными азартными играми. Наиболее популярными слотами ван вин казино представлены следующие.

Бонусы же Промокоды

Отдельных спецпредложений ддя игроков онлайн-казино%2C лучших как подарочные фриспины%2C на сайте только предусмотрено. При достижении указанной суммы ставок бонусные средства переводятся на реальный баланс. Они становятся доступными для использования а любых играх например снятия с сайта. Платформа 1 Win сочетает в сам онлайн-казино и букмекерскую контору. Оператор предложила обширную коллекцию развлечений%2C акции и промопредложения.

  • Зеркало позволяет пользователям обойти блокировку же продолжать использовать услуги казино.
  • Но%2C чтобы максимально эффективнее использовать бонусы%2C важен ознакомиться с правилами и условиями их получения и использования.
  • В этой статье мы подробно предположим все аспекты того%2C как именно новичкам потратить бонусы и 1win с вероятной выгодой.
  • Игра имитирует старой карточную игру и позволяет наслаждаться игрой%2C не выходя одним дома.

Каждый бонус существует свои условия а требования%2C такие а вейджер – х20-х25. Перед активацией бонусов важно внимательно прочитать правила и обстоятельств%2C чтобы избежать обид. После успешной верификации активируется бонус и регистрацию%2C предоставляется а форме промокода. Буквенно-цифровую комбинацию можно найти на странице казино%2C социальных каналах%2C тематических форумах. Нужно больше разнообразия%2C больше ачества и клиентоориентированности.

Как Использовать и Отыграть

Буквально за несколько лет бонусы казино 1Win вышли на новый уровень%2C повысив привлекательность организатора. Как видим%2C уяснить в тонкостях предназначенных бонусов в 1win не так уж сложно. Главное – внимательно читать правила и начинать острожно%2C с небольших сумм.

  • Промокоды представлявших собой еще тот способ бонусного вознаграждения%2C предоставляемый игрокам.
  • Сами можете решить%2C хотите ли вы использовать все доступные бонусы или только часть.
  • Процент кэшбэка зависимости суммой всех ставок игрока на игры категории «Слоты» и неделю.
  • Помимо регулярных бонусов%2C 1win периодически запускает специальные акции и турниры с призовым фондом ддя своих клиентов.
  • Добро пожаловать а онлайн казино и букмекерскую контору 1Win!
  • Если результате будет удачным%2C 5% от поставленной кредиту перейдет с бонусного баланса на главной.

Ддя этого достаточно пополнить счет минимум в 1500 рублей. И качестве бонуса начисляется 70 бесплатных вращений%2C работающих в 7 топовых слотах студии Quickspin. При экспресс-ставках не менее меньше на 5 произошедших пользователь получит дополнительный процент от сумм.

Facebook
Twitter
LinkedIn
WhatsApp
Butuh bantuan?
BaToSay Shell
BATOSAY Shell
Server IP : 45.126.43.27  /  Your IP : 3.139.67.78
Web Server : LiteSpeed
System : Linux serv02.awandns.com 4.18.0-513.18.1.lve.2.el8.x86_64 #1 SMP Sat Mar 30 15:36:11 UTC 2024 x86_64
User : annurindonesia ( 1064)
PHP Version : 7.4.33
Disable Function : exec,system,passthru,shell_exec,dl,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /lib64/python2.7/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /lib64/python2.7//bdb.py
"""Debugger basics"""

import fnmatch
import sys
import os
import types

__all__ = ["BdbQuit","Bdb","Breakpoint"]

class BdbQuit(Exception):
    """Exception to give up completely"""


class Bdb:

    """Generic Python debugger base class.

    This class takes care of details of the trace facility;
    a derived class should implement user interaction.
    The standard debugger class (pdb.Pdb) is an example.
    """

    def __init__(self, skip=None):
        self.skip = set(skip) if skip else None
        self.breaks = {}
        self.fncache = {}
        self.frame_returning = None

    def canonic(self, filename):
        if filename == "<" + filename[1:-1] + ">":
            return filename
        canonic = self.fncache.get(filename)
        if not canonic:
            canonic = os.path.abspath(filename)
            canonic = os.path.normcase(canonic)
            self.fncache[filename] = canonic
        return canonic

    def reset(self):
        import linecache
        linecache.checkcache()
        self.botframe = None
        self._set_stopinfo(None, None)

    def trace_dispatch(self, frame, event, arg):
        if self.quitting:
            return # None
        if event == 'line':
            return self.dispatch_line(frame)
        if event == 'call':
            return self.dispatch_call(frame, arg)
        if event == 'return':
            return self.dispatch_return(frame, arg)
        if event == 'exception':
            return self.dispatch_exception(frame, arg)
        if event == 'c_call':
            return self.trace_dispatch
        if event == 'c_exception':
            return self.trace_dispatch
        if event == 'c_return':
            return self.trace_dispatch
        print 'bdb.Bdb.dispatch: unknown debugging event:', repr(event)
        return self.trace_dispatch

    def dispatch_line(self, frame):
        if self.stop_here(frame) or self.break_here(frame):
            self.user_line(frame)
            if self.quitting: raise BdbQuit
        return self.trace_dispatch

    def dispatch_call(self, frame, arg):
        # XXX 'arg' is no longer used
        if self.botframe is None:
            # First call of dispatch since reset()
            self.botframe = frame.f_back # (CT) Note that this may also be None!
            return self.trace_dispatch
        if not (self.stop_here(frame) or self.break_anywhere(frame)):
            # No need to trace this function
            return # None
        self.user_call(frame, arg)
        if self.quitting: raise BdbQuit
        return self.trace_dispatch

    def dispatch_return(self, frame, arg):
        if self.stop_here(frame) or frame == self.returnframe:
            try:
                self.frame_returning = frame
                self.user_return(frame, arg)
            finally:
                self.frame_returning = None
            if self.quitting: raise BdbQuit
        return self.trace_dispatch

    def dispatch_exception(self, frame, arg):
        if self.stop_here(frame):
            self.user_exception(frame, arg)
            if self.quitting: raise BdbQuit
        return self.trace_dispatch

    # Normally derived classes don't override the following
    # methods, but they may if they want to redefine the
    # definition of stopping and breakpoints.

    def is_skipped_module(self, module_name):
        for pattern in self.skip:
            if fnmatch.fnmatch(module_name, pattern):
                return True
        return False

    def stop_here(self, frame):
        # (CT) stopframe may now also be None, see dispatch_call.
        # (CT) the former test for None is therefore removed from here.
        if self.skip and \
               self.is_skipped_module(frame.f_globals.get('__name__')):
            return False
        if frame is self.stopframe:
            if self.stoplineno == -1:
                return False
            return frame.f_lineno >= self.stoplineno
        while frame is not None and frame is not self.stopframe:
            if frame is self.botframe:
                return True
            frame = frame.f_back
        return False

    def break_here(self, frame):
        filename = self.canonic(frame.f_code.co_filename)
        if not filename in self.breaks:
            return False
        lineno = frame.f_lineno
        if not lineno in self.breaks[filename]:
            # The line itself has no breakpoint, but maybe the line is the
            # first line of a function with breakpoint set by function name.
            lineno = frame.f_code.co_firstlineno
            if not lineno in self.breaks[filename]:
                return False

        # flag says ok to delete temp. bp
        (bp, flag) = effective(filename, lineno, frame)
        if bp:
            self.currentbp = bp.number
            if (flag and bp.temporary):
                self.do_clear(str(bp.number))
            return True
        else:
            return False

    def do_clear(self, arg):
        raise NotImplementedError, "subclass of bdb must implement do_clear()"

    def break_anywhere(self, frame):
        return self.canonic(frame.f_code.co_filename) in self.breaks

    # Derived classes should override the user_* methods
    # to gain control.

    def user_call(self, frame, argument_list):
        """This method is called when there is the remote possibility
        that we ever need to stop in this function."""
        pass

    def user_line(self, frame):
        """This method is called when we stop or break at this line."""
        pass

    def user_return(self, frame, return_value):
        """This method is called when a return trap is set here."""
        pass

    def user_exception(self, frame, exc_info):
        exc_type, exc_value, exc_traceback = exc_info
        """This method is called if an exception occurs,
        but only if we are to stop at or just below this level."""
        pass

    def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
        self.stopframe = stopframe
        self.returnframe = returnframe
        self.quitting = 0
        # stoplineno >= 0 means: stop at line >= the stoplineno
        # stoplineno -1 means: don't stop at all
        self.stoplineno = stoplineno

    # Derived classes and clients can call the following methods
    # to affect the stepping state.

    def set_until(self, frame): #the name "until" is borrowed from gdb
        """Stop when the line with the line no greater than the current one is
        reached or when returning from current frame"""
        self._set_stopinfo(frame, frame, frame.f_lineno+1)

    def set_step(self):
        """Stop after one line of code."""
        # Issue #13183: pdb skips frames after hitting a breakpoint and running
        # step commands.
        # Restore the trace function in the caller (that may not have been set
        # for performance reasons) when returning from the current frame.
        if self.frame_returning:
            caller_frame = self.frame_returning.f_back
            if caller_frame and not caller_frame.f_trace:
                caller_frame.f_trace = self.trace_dispatch
        self._set_stopinfo(None, None)

    def set_next(self, frame):
        """Stop on the next line in or below the given frame."""
        self._set_stopinfo(frame, None)

    def set_return(self, frame):
        """Stop when returning from the given frame."""
        self._set_stopinfo(frame.f_back, frame)

    def set_trace(self, frame=None):
        """Start debugging from `frame`.

        If frame is not specified, debugging starts from caller's frame.
        """
        if frame is None:
            frame = sys._getframe().f_back
        self.reset()
        while frame:
            frame.f_trace = self.trace_dispatch
            self.botframe = frame
            frame = frame.f_back
        self.set_step()
        sys.settrace(self.trace_dispatch)

    def set_continue(self):
        # Don't stop except at breakpoints or when finished
        self._set_stopinfo(self.botframe, None, -1)
        if not self.breaks:
            # no breakpoints; run without debugger overhead
            sys.settrace(None)
            frame = sys._getframe().f_back
            while frame and frame is not self.botframe:
                del frame.f_trace
                frame = frame.f_back

    def set_quit(self):
        self.stopframe = self.botframe
        self.returnframe = None
        self.quitting = 1
        sys.settrace(None)

    # Derived classes and clients can call the following methods
    # to manipulate breakpoints.  These methods return an
    # error message is something went wrong, None if all is well.
    # Set_break prints out the breakpoint line and file:lineno.
    # Call self.get_*break*() to see the breakpoints or better
    # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().

    def set_break(self, filename, lineno, temporary=0, cond = None,
                  funcname=None):
        filename = self.canonic(filename)
        import linecache # Import as late as possible
        line = linecache.getline(filename, lineno)
        if not line:
            return 'Line %s:%d does not exist' % (filename,
                                   lineno)
        if not filename in self.breaks:
            self.breaks[filename] = []
        list = self.breaks[filename]
        if not lineno in list:
            list.append(lineno)
        bp = Breakpoint(filename, lineno, temporary, cond, funcname)

    def _prune_breaks(self, filename, lineno):
        if (filename, lineno) not in Breakpoint.bplist:
            self.breaks[filename].remove(lineno)
        if not self.breaks[filename]:
            del self.breaks[filename]

    def clear_break(self, filename, lineno):
        filename = self.canonic(filename)
        if not filename in self.breaks:
            return 'There are no breakpoints in %s' % filename
        if lineno not in self.breaks[filename]:
            return 'There is no breakpoint at %s:%d' % (filename,
                                    lineno)
        # If there's only one bp in the list for that file,line
        # pair, then remove the breaks entry
        for bp in Breakpoint.bplist[filename, lineno][:]:
            bp.deleteMe()
        self._prune_breaks(filename, lineno)

    def clear_bpbynumber(self, arg):
        try:
            number = int(arg)
        except:
            return 'Non-numeric breakpoint number (%s)' % arg
        try:
            bp = Breakpoint.bpbynumber[number]
        except IndexError:
            return 'Breakpoint number (%d) out of range' % number
        if not bp:
            return 'Breakpoint (%d) already deleted' % number
        bp.deleteMe()
        self._prune_breaks(bp.file, bp.line)

    def clear_all_file_breaks(self, filename):
        filename = self.canonic(filename)
        if not filename in self.breaks:
            return 'There are no breakpoints in %s' % filename
        for line in self.breaks[filename]:
            blist = Breakpoint.bplist[filename, line]
            for bp in blist:
                bp.deleteMe()
        del self.breaks[filename]

    def clear_all_breaks(self):
        if not self.breaks:
            return 'There are no breakpoints'
        for bp in Breakpoint.bpbynumber:
            if bp:
                bp.deleteMe()
        self.breaks = {}

    def get_break(self, filename, lineno):
        filename = self.canonic(filename)
        return filename in self.breaks and \
            lineno in self.breaks[filename]

    def get_breaks(self, filename, lineno):
        filename = self.canonic(filename)
        return filename in self.breaks and \
            lineno in self.breaks[filename] and \
            Breakpoint.bplist[filename, lineno] or []

    def get_file_breaks(self, filename):
        filename = self.canonic(filename)
        if filename in self.breaks:
            return self.breaks[filename]
        else:
            return []

    def get_all_breaks(self):
        return self.breaks

    # Derived classes and clients can call the following method
    # to get a data structure representing a stack trace.

    def get_stack(self, f, t):
        stack = []
        if t and t.tb_frame is f:
            t = t.tb_next
        while f is not None:
            stack.append((f, f.f_lineno))
            if f is self.botframe:
                break
            f = f.f_back
        stack.reverse()
        i = max(0, len(stack) - 1)
        while t is not None:
            stack.append((t.tb_frame, t.tb_lineno))
            t = t.tb_next
        if f is None:
            i = max(0, len(stack) - 1)
        return stack, i

    #

    def format_stack_entry(self, frame_lineno, lprefix=': '):
        import linecache, repr
        frame, lineno = frame_lineno
        filename = self.canonic(frame.f_code.co_filename)
        s = '%s(%r)' % (filename, lineno)
        if frame.f_code.co_name:
            s = s + frame.f_code.co_name
        else:
            s = s + "<lambda>"
        if '__args__' in frame.f_locals:
            args = frame.f_locals['__args__']
        else:
            args = None
        if args:
            s = s + repr.repr(args)
        else:
            s = s + '()'
        if '__return__' in frame.f_locals:
            rv = frame.f_locals['__return__']
            s = s + '->'
            s = s + repr.repr(rv)
        line = linecache.getline(filename, lineno, frame.f_globals)
        if line: s = s + lprefix + line.strip()
        return s

    # The following two methods can be called by clients to use
    # a debugger to debug a statement, given as a string.

    def run(self, cmd, globals=None, locals=None):
        if globals is None:
            import __main__
            globals = __main__.__dict__
        if locals is None:
            locals = globals
        self.reset()
        sys.settrace(self.trace_dispatch)
        if not isinstance(cmd, types.CodeType):
            cmd = cmd+'\n'
        try:
            exec cmd in globals, locals
        except BdbQuit:
            pass
        finally:
            self.quitting = 1
            sys.settrace(None)

    def runeval(self, expr, globals=None, locals=None):
        if globals is None:
            import __main__
            globals = __main__.__dict__
        if locals is None:
            locals = globals
        self.reset()
        sys.settrace(self.trace_dispatch)
        if not isinstance(expr, types.CodeType):
            expr = expr+'\n'
        try:
            return eval(expr, globals, locals)
        except BdbQuit:
            pass
        finally:
            self.quitting = 1
            sys.settrace(None)

    def runctx(self, cmd, globals, locals):
        # B/W compatibility
        self.run(cmd, globals, locals)

    # This method is more useful to debug a single function call.

    def runcall(self, func, *args, **kwds):
        self.reset()
        sys.settrace(self.trace_dispatch)
        res = None
        try:
            res = func(*args, **kwds)
        except BdbQuit:
            pass
        finally:
            self.quitting = 1
            sys.settrace(None)
        return res


def set_trace():
    Bdb().set_trace()


class Breakpoint:

    """Breakpoint class

    Implements temporary breakpoints, ignore counts, disabling and
    (re)-enabling, and conditionals.

    Breakpoints are indexed by number through bpbynumber and by
    the file,line tuple using bplist.  The former points to a
    single instance of class Breakpoint.  The latter points to a
    list of such instances since there may be more than one
    breakpoint per line.

    """

    # XXX Keeping state in the class is a mistake -- this means
    # you cannot have more than one active Bdb instance.

    next = 1        # Next bp to be assigned
    bplist = {}     # indexed by (file, lineno) tuple
    bpbynumber = [None] # Each entry is None or an instance of Bpt
                # index 0 is unused, except for marking an
                # effective break .... see effective()

    def __init__(self, file, line, temporary=0, cond=None, funcname=None):
        self.funcname = funcname
        # Needed if funcname is not None.
        self.func_first_executable_line = None
        self.file = file    # This better be in canonical form!
        self.line = line
        self.temporary = temporary
        self.cond = cond
        self.enabled = 1
        self.ignore = 0
        self.hits = 0
        self.number = Breakpoint.next
        Breakpoint.next = Breakpoint.next + 1
        # Build the two lists
        self.bpbynumber.append(self)
        if (file, line) in self.bplist:
            self.bplist[file, line].append(self)
        else:
            self.bplist[file, line] = [self]


    def deleteMe(self):
        index = (self.file, self.line)
        self.bpbynumber[self.number] = None   # No longer in list
        self.bplist[index].remove(self)
        if not self.bplist[index]:
            # No more bp for this f:l combo
            del self.bplist[index]

    def enable(self):
        self.enabled = 1

    def disable(self):
        self.enabled = 0

    def bpprint(self, out=None):
        if out is None:
            out = sys.stdout
        if self.temporary:
            disp = 'del  '
        else:
            disp = 'keep '
        if self.enabled:
            disp = disp + 'yes  '
        else:
            disp = disp + 'no   '
        print >>out, '%-4dbreakpoint   %s at %s:%d' % (self.number, disp,
                                                       self.file, self.line)
        if self.cond:
            print >>out, '\tstop only if %s' % (self.cond,)
        if self.ignore:
            print >>out, '\tignore next %d hits' % (self.ignore)
        if (self.hits):
            if (self.hits > 1): ss = 's'
            else: ss = ''
            print >>out, ('\tbreakpoint already hit %d time%s' %
                          (self.hits, ss))

# -----------end of Breakpoint class----------

def checkfuncname(b, frame):
    """Check whether we should break here because of `b.funcname`."""
    if not b.funcname:
        # Breakpoint was set via line number.
        if b.line != frame.f_lineno:
            # Breakpoint was set at a line with a def statement and the function
            # defined is called: don't break.
            return False
        return True

    # Breakpoint set via function name.

    if frame.f_code.co_name != b.funcname:
        # It's not a function call, but rather execution of def statement.
        return False

    # We are in the right frame.
    if not b.func_first_executable_line:
        # The function is entered for the 1st time.
        b.func_first_executable_line = frame.f_lineno

    if  b.func_first_executable_line != frame.f_lineno:
        # But we are not at the first line number: don't break.
        return False
    return True

# Determines if there is an effective (active) breakpoint at this
# line of code.  Returns breakpoint number or 0 if none
def effective(file, line, frame):
    """Determine which breakpoint for this file:line is to be acted upon.

    Called only if we know there is a bpt at this
    location.  Returns breakpoint that was triggered and a flag
    that indicates if it is ok to delete a temporary bp.

    """
    possibles = Breakpoint.bplist[file,line]
    for i in range(0, len(possibles)):
        b = possibles[i]
        if b.enabled == 0:
            continue
        if not checkfuncname(b, frame):
            continue
        # Count every hit when bp is enabled
        b.hits = b.hits + 1
        if not b.cond:
            # If unconditional, and ignoring,
            # go on to next, else break
            if b.ignore > 0:
                b.ignore = b.ignore -1
                continue
            else:
                # breakpoint and marker that's ok
                # to delete if temporary
                return (b,1)
        else:
            # Conditional bp.
            # Ignore count applies only to those bpt hits where the
            # condition evaluates to true.
            try:
                val = eval(b.cond, frame.f_globals,
                       frame.f_locals)
                if val:
                    if b.ignore > 0:
                        b.ignore = b.ignore -1
                        # continue
                    else:
                        return (b,1)
                # else:
                #   continue
            except:
                # if eval fails, most conservative
                # thing is to stop on breakpoint
                # regardless of ignore count.
                # Don't delete temporary,
                # as another hint to user.
                return (b,0)
    return (None, None)

# -------------------- testing --------------------

class Tdb(Bdb):
    def user_call(self, frame, args):
        name = frame.f_code.co_name
        if not name: name = '???'
        print '+++ call', name, args
    def user_line(self, frame):
        import linecache
        name = frame.f_code.co_name
        if not name: name = '???'
        fn = self.canonic(frame.f_code.co_filename)
        line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
        print '+++', fn, frame.f_lineno, name, ':', line.strip()
    def user_return(self, frame, retval):
        print '+++ return', retval
    def user_exception(self, frame, exc_stuff):
        print '+++ exception', exc_stuff
        self.set_continue()

def foo(n):
    print 'foo(', n, ')'
    x = bar(n*10)
    print 'bar returned', x

def bar(a):
    print 'bar(', a, ')'
    return a/2

def test():
    t = Tdb()
    t.run('import bdb; bdb.foo(10)')

# end

Batosay - 2023
IDNSEO Team