やじゅ@アプリケーション・ラボ わんくま支局

目次

Blog 利用状況

ニュース

プロフィール

MSMVP

Visual BasicでRoslynを使ってみる その4

これは、Visual Basic Advent Calendar 2013 12/24日の記事。

今回は、Roslynについてもう少し踏み込んだことをしてみます。
丁度よく、C# Advent Calendar 2013の12日にて、翔ソフトウェア (Sho's)@FujiwoさんがRoslynを使用した「メタプログラミング入門 - Roslyn による C# ソースコードの解析と変更」をブログを投稿されていたので、今回はこれの「ReplaceNode メソッドによるコードの変更」までをVB版に移植してみることにします。

といっても、RoslynのVisualBasicのサンプルがネット上でほとんど見つからない状態で、C#の移植するにもRoslynの理解が足りないため四苦八苦状態です。

前回は、再帰処理を使ってソースコードの構成要素であるノードの種類と値を出力しましたが、今回はRoslyn.Compilers.VisualBasic 名前空間の SyntaxWalker クラスを用います。このクラスは、Visitor パターンになっており、これを継承し各種メソッドをオーバーライドすることで、様々な種類のノードやトークンを辿ることができます。
下記のように SyntaxWalker の派生クラスを用意し、各ノードを Visit するメソッドをオーバーライドすると、ソースコードの構成要素であるノードを全部辿ることができる。

Class Walker
    Inherits SyntaxWalker
    ' Visitor パターンでソースコードを解析
    Public Overrides Sub Visit(node As SyntaxNode)
        ' 各ノードを Visit
        If node IsNot Nothing Then
            Console.WriteLine("[Node  - Type: {0}, Kind: {1}]" & vbLf & "{2}" & vbLf, node.[GetType]().Name, node.Kind, node)
        End If

        MyBase.Visit(node)
    End Sub
End Class

このWalkerクラスを使用して、文字列変数のソースコードを解析してみる。

Imports Roslyn.Compilers
Imports Roslyn.Compilers.VisualBasic 
Sub Main() Dim sourceCode As String = <string> Imports System Module Program Sub Main() Console.WriteLine("Hello, World!") End Sub End Module </string>.Value Dim syntaxTree_ = SyntaxTree.ParseText(sourceCode) ' ソースコードをパースしてシンタックス ツリーに Dim rootNode = syntaxTree_.GetRoot() ' ルートのノードを取得 Dim walker_ As Walker = New Walker End Sub

【出力結果】
[Node  - Type: CompilationUnitSyntax, Kind: CompilationUnit]
Imports System

            Module Program
                Sub Main()
                    Console.WriteLine("")
                End Sub
            End Module

[Node  - Type: ImportsStatementSyntax, Kind: ImportsStatement]
Imports System
[Node  - Type: MembersImportsClauseSyntax, Kind: MembersImportsClause]
System
[Node  - Type: IdentifierNameSyntax, Kind: IdentifierName]
System
[Node  - Type: ModuleBlockSyntax, Kind: ModuleBlock]
Module Program
    Sub Main()
         Console.WriteLine("")
    End Sub
End Module
[Node  - Type: ModuleStatementSyntax, Kind: ModuleStatement]
Module Program
[Node  - Type: MethodBlockSyntax, Kind: SubBlock]
Sub Main()
       Console.WriteLine("")
End Sub
[Node  - Type: MethodStatementSyntax, Kind: SubStatement]
Sub Main()
[Node  - Type: ParameterListSyntax, Kind: ParameterList]
()
[Node  - Type: CallStatementSyntax, Kind: CallStatement]
Console.WriteLine("")
[Node  - Type: InvocationExpressionSyntax, Kind: InvocationExpression]
Console.WriteLine("")
[Node  - Type: MemberAccessExpressionSyntax, Kind: MemberAccessExpression]
Console.WriteLine
[Node  - Type: IdentifierNameSyntax, Kind: IdentifierName]
Console
[Node  - Type: IdentifierNameSyntax, Kind: IdentifierName]
WriteLine
[Node  - Type: ArgumentListSyntax, Kind: ArgumentList]
("")
[Node  - Type: SimpleArgumentSyntax, Kind: SimpleArgument]
""
[Node  - Type: LiteralExpressionSyntax, Kind: StringLiteralExpression]
""
[Node  - Type: EndBlockStatementSyntax, Kind: EndSubStatement]
End Sub
[Node  - Type: EndBlockStatementSyntax, Kind: EndModuleStatement]
End Module

前回と同じ各ノードの情報が表示されました。
次に、Walkerクラスを少し変更して、ノードではなく、より細かいソースコードの構成要素であるトークンを表示してみます。
今度は、各トークンを Visit する VisitToken メソッドをオーバーライドして、全トークンを辿ってみる。


Class Walker
    Public Sub New()
        MyBase.New(depth:=Common.SyntaxWalkerDepth.Token)
        ' トークンの深さまで Visit
    End Sub

    Public Overrides Sub VisitToken(token As SyntaxToken)
        ' 各トークンを Visit
        If token <> Nothing Then
            Console.WriteLine("[Token - Type: {0}, Kind: {1}]" & vbLf & "{2}" & vbLf, token.[GetType]().Name, token.Kind, token)
    End If

        MyBase.VisitToken(token)
    End Sub
End Class

実行してみると、今度は、より細かく "Import"、"System"、"Module" 等の各トークンの情報が表示される。


【出力結果】
[Token - Type: SyntaxToken, Kind: ImportsKeyword]
Imports
[Token - Type: SyntaxToken, Kind: IdentifierToken]
System
[Token - Type: SyntaxToken, Kind: StatementTerminatorToken]

[Token - Type: SyntaxToken, Kind: ModuleKeyword]
Module
[Token - Type: SyntaxToken, Kind: IdentifierToken]
Program
[Token - Type: SyntaxToken, Kind: StatementTerminatorToken]

[Token - Type: SyntaxToken, Kind: SubKeyword]
Sub
[Token - Type: SyntaxToken, Kind: IdentifierToken]
Main
[Token - Type: SyntaxToken, Kind: OpenParenToken]
(
[Token - Type: SyntaxToken, Kind: CloseParenToken]
)
[Token - Type: SyntaxToken, Kind: StatementTerminatorToken]

[Token - Type: SyntaxToken, Kind: EndKeyword]
End
[Token - Type: SyntaxToken, Kind: SubKeyword]
Sub
[Token - Type: SyntaxToken, Kind: StatementTerminatorToken]

[Token - Type: SyntaxToken, Kind: EndKeyword]
End
[Token - Type: SyntaxToken, Kind: ModuleKeyword]
Module
[Token - Type: SyntaxToken, Kind: StatementTerminatorToken]

[Token - Type: SyntaxToken, Kind: EndOfFileToken]


■Roslyn によるコードの変更
ReplaceNode メソッドによるコードの変更。
Roslynでは、コードを単に解析するだけでなく、改変することも出来ます。
文字列変数のソースリストのConsole.ReadLine()からConsole.WriteLine("Hello, World!")のコードに変更してみます。
移植元のC#では、空のブロックを置換対象先としていましたが、Visual Basicは文法的に空のブロックが出来ません。
その変わりとしてConsole.ReadLine()のノードである「CallStatement」を置換対象とします。
※Mainの内部が空だと「CallStatement」も無くなってしまうため、あえてConsole.ReadLine()を入れてあります。
【処理手順】
1.Roslyn.Compilers.CSharp.Syntax クラスを用い、Console.WriteLine("Hello, World!")が入ったブロックをノードとして作成する「CreateHelloWorldBlock メソッド」を用意
2.元の単純な Visual Basicのソースコードのソースコードをパースしてシンタックス ツリーにする
3.Main メソッドからCallStatementのConsole.ReadLine()を取り出す
4.Roslyn.Compilers.CommonSyntaxNodeExtensions クラスにある ReplaceNode 拡張メソッドを使って、Console.ReadLine()をConsole.WriteLine("Hello, World!")が入ったブロックに置き換える
実装してみると、次のようになる。

Imports Roslyn.Compilers
Imports Roslyn.Compilers.VisualBasic

    Sub Main()

        Dim sourceCode As String =
            <string>
            Imports System

            Module Program
                Sub Main()
                    Console.ReadLine()
                End Sub
            End Module
            </string>.Value

         Dim syntaxTree_ = SyntaxTree.ParseText(sourceCode)
        ' ソースコードをパースしてシンタックス ツリーに
        Dim rootNode = syntaxTree_.GetRoot()
        ' ルートのノードを取得
        ' Main メソッドのステートメントを取得
        Dim statement_ = rootNode.DescendantNodes().First(Function(node) node.Kind = SyntaxKind.CallStatement)

        ' ノードの置き換え
        ' 元のConsole.ReadLine()のステートメント
        ' Console.WriteLine("Hello world!") が入ったステートメント
        Dim newNode = rootNode.ReplaceNode(oldNode:=statement_, newNode:=CreateHelloWorldBlock())

        Console.WriteLine(newNode.NormalizeWhitespace())        ' 整形して表示
        Console.ReadLine()

    End Sub

    Private Function CreateHelloWorldBlock() As CallStatementSyntax
        ' Console.WriteLine("Hello world!")
        ' Console.WriteLine というメンバー アクセス
        ' 引数リスト
        ' "Hello world!"

        Dim expression_ As Roslyn.Compilers.VisualBasic.ExpressionSyntax
        Dim argumentList_ As Roslyn.Compilers.VisualBasic.ArgumentListSyntax

        expression_ = Syntax.MemberAccessExpression(Syntax.IdentifierName("Console"),
                                                    Syntax.Token(SyntaxKind.DotToken),
                                                    Syntax.IdentifierName("WriteLine"))

        Dim paramItem As LiteralExpressionSyntax = Syntax.LiteralExpression(SyntaxKind.StringLiteralExpression,
                                                                            Syntax.Literal("Hello world!"))

        argumentList_ = Syntax.ArgumentList(Syntax.SeparatedList(Of ArgumentSyntax)(node:=Syntax.SimpleArgument(paramItem)))

        Dim invocationExpression_ = Syntax.InvocationExpression(expression_, argumentList_)
        Return Syntax.CallStatement(invocationExpression_)

    End Function
End Module

実行してみると、Main メソッドのConsole.ReadLine()が、Console.WriteLine("Hello, World!")のブロックに変更されたのが分かる。
【出力結果】
Imports System

Module Program
    Sub Main()
        Console.WriteLine("Hello world!")
    End Sub
End Module

今回、C#からVisualBasicに移植する上で下記の違いがありました。
・C#のSyntax.MemberAccessExpressionの引数「kind」はなく「operatorToken」となっているので、Syntax.Token(SyntaxKind.DotToken)を指定しました。
・C#のSyntax.Argumentは存在しないため、Syntax.SimpleArgumentに変更しました。
・C#のSyntax.Blockは存在しないため、Syntax.CallStatementに変更しました。
C#とVisualBasicは言語の文法形式が違いがあるため、メソッド自体もノードに対応したものに変更する必要があります。

■RoslynのVBコードがある参照先
MicrosoftR “Roslyn” CTP
http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx
Semantic Information ? Part 1
http://blogs.msdn.com/b/prakashb/archive/2012/02/06/semantic-information-part-1.aspx
Less than Dot
http://blogs.lessthandot.com/index.php/DesktopDev/?s=Roslyn&advm=&advy=&author=

■Roslynの活用
MicrosoftではRoslynの使用方法として、C#からVisualBasicに変換するツールのデモを公開してました。
それを見た方が、C#をPowerShellに変換するアプローチをブログに書いております。
Using Roslyn and PowerShell 3 to Convert C# to PowerShell

他にも「Roslyn」でネット検索すると、Roslynを使ってC#をC++に変換し、開発は書きやすいマネージド言語で、実際の動作は高速なネイティブ言語として開発しているのが見られます。

10章にRoslynの説明があるため購入。Roslynの先はメタプログラミング!

投稿日時 : 2013年12月24日 2:43

コメントを追加

# buy careprost in the usa free shipping 2021/12/13 7:26 Travislyday

http://bimatoprostrx.com/ bimatoprost buy

# bimatoprost generic 2021/12/14 3:16 Travislyday

http://plaquenils.com/ plaquenil tab 200mg cost

# bimatoprost generic best price 2021/12/15 16:06 Travislyday

http://baricitinibrx.online/ baricitinib eua fact sheet

# careprost for sale 2021/12/16 11:36 Travislyday

https://plaquenils.com/ hydroxychloroquine 600 mg

# п»їorder stromectol online 2021/12/17 8:51 Eliastib

cczpmk https://stromectolr.com stromectol price

# ivermectin uk coronavirus 2021/12/18 3:29 Eliastib

qhpmie https://stromectolr.com ivermectin 6mg dosage

# stromectol over the counter http://stromectolabc.com/
ivermectin 1mg 2022/02/08 9:41 Busjdhj

stromectol over the counter http://stromectolabc.com/
ivermectin 1mg

# vibramycin 100 mg https://doxycyline1st.com/
doxycycline 200 mg 2022/02/26 8:32 Doxycycline

vibramycin 100 mg https://doxycyline1st.com/
doxycycline 200 mg

# doxycycline 100mg capsules https://doxycyline1st.com/
doxycycline 100 mg 2022/02/26 20:13 Doxycycline

doxycycline 100mg capsules https://doxycyline1st.com/
doxycycline 100 mg

# medication for ed dysfunction https://erectionpills.best/
ed pills gnc 2022/06/28 20:00 ErectionPills

medication for ed dysfunction https://erectionpills.best/
ed pills gnc

# paxlovid dosing https://paxlovid.best/
antiviral covid treatment 2022/09/08 7:47 Paxlovid

paxlovid dosing https://paxlovid.best/
antiviral covid treatment

# best ed drug https://ed-pills.xyz/
new ed treatments 2022/09/17 15:04 EdPills

best ed drug https://ed-pills.xyz/
new ed treatments

# free date web sites https://datingtopreview.com/
local dating sites absolutely free 2022/10/17 20:41 Dating

free date web sites https://datingtopreview.com/
local dating sites absolutely free

# best dating websites https://topdatingsites.fun/
interracial dating site 2022/11/15 0:32 DatingTop

best dating websites https://topdatingsites.fun/
interracial dating site

# over the counter prednisone pills https://prednisonepills.site/
order prednisone online canada 2022/11/28 23:57 Prednisone

over the counter prednisone pills https://prednisonepills.site/
order prednisone online canada

# meet women at zushi beach https://datingonlinehot.com/
intitle:dating 2022/12/09 19:24 Dating

meet women at zushi beach https://datingonlinehot.com/
intitle:dating

# Prescription Drug Information, Interactions & Side. What side effects can this medication cause?
https://canadianfast.com/
All trends of medicament. Everything what you want to know about pills. 2023/02/20 0:24 CanadaBest

Prescription Drug Information, Interactions & Side. What side effects can this medication cause?
https://canadianfast.com/
All trends of medicament. Everything what you want to know about pills.

# Read information now. Read now.
https://canadianfast.com/
Everything what you want to know about pills. Drug information. 2023/02/20 11:53 CanadaBest

Read information now. Read now.
https://canadianfast.com/
Everything what you want to know about pills. Drug information.

# doors2.txt;1 2023/03/14 15:34 NovxPIOtkO

doors2.txt;1

# approved canadian pharmacies https://pillswithoutprescription.pro/# 2023/05/14 22:16 PillsPresc

approved canadian pharmacies https://pillswithoutprescription.pro/#

# ed drug prices https://edpills.ink/# - medication for ed 2023/07/26 20:08 EdPills

ed drug prices https://edpills.ink/# - medication for ed

# Abortion pills online 2023/08/27 10:35 Georgejep

http://avodart.pro/# cost avodart for sale

# Anna Berezina 2023/09/19 8:12 Mathewelego

Anna Berezina is a famed framer and demagogue in the field of psychology. With a family in clinical psychology and far-flung probing involvement, Anna has dedicated her craft to agreement philanthropist behavior and daft health: https://postheaven.net/cicadalentil20/anna-berezina-expert-accountant-providing-comprehensive-financial-services. Including her form, she has made important contributions to the field and has behove a respected meditation leader.

Anna's expertise spans a number of areas of psychology, including cognitive psychology, unmistakable psychology, and ardent intelligence. Her voluminous education in these domains allows her to provide valuable insights and strategies in return individuals seeking in person growth and well-being.

As an author, Anna has written disparate instrumental books that cause garnered widespread notice and praise. Her books put up for sale down-to-earth par‘nesis and evidence-based approaches to help individuals lead fulfilling lives and cultivate resilient mindsets. By combining her clinical judgement with her passion suited for dollop others, Anna's writings secure resonated with readers around the world.

# farmacia online senza ricetta 2023/09/25 6:46 Archieonelf

https://onlineapotheke.tech/# internet apotheke

# gГјnstige online apotheke 2023/09/26 13:53 Williamreomo

http://onlineapotheke.tech/# online apotheke versandkostenfrei
internet apotheke

# online apotheke deutschland 2023/09/26 15:54 Williamreomo

http://onlineapotheke.tech/# internet apotheke
online apotheke deutschland

# versandapotheke 2023/09/26 22:59 Williamreomo

http://onlineapotheke.tech/# online apotheke gГ?nstig
online apotheke deutschland

# п»їonline apotheke 2023/09/27 1:16 Williamreomo

https://onlineapotheke.tech/# online apotheke deutschland
internet apotheke

# online apotheke preisvergleich 2023/09/27 4:36 Williamreomo

https://onlineapotheke.tech/# gГ?nstige online apotheke
internet apotheke

# online apotheke gГјnstig 2023/09/27 5:51 Williamreomo

http://onlineapotheke.tech/# versandapotheke
internet apotheke

# п»їonline apotheke 2023/09/27 6:17 Williamreomo

https://onlineapotheke.tech/# versandapotheke deutschland
online apotheke deutschland

# migliori farmacie online 2023 2023/09/27 8:00 Archieonelf

http://pharmacieenligne.icu/# Pharmacie en ligne fiable

# п»їonline apotheke 2023/09/27 9:37 Williamreomo

http://onlineapotheke.tech/# versandapotheke versandkostenfrei
п»?online apotheke

# п»їonline apotheke 2023/09/27 10:00 Williamreomo

http://onlineapotheke.tech/# versandapotheke versandkostenfrei
versandapotheke

# п»їonline apotheke 2023/09/27 11:36 Williamreomo

https://onlineapotheke.tech/# internet apotheke
п»?online apotheke

# farmacia online miglior prezzo 2023/09/27 17:03 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# acquistare farmaci senza ricetta 2023/09/27 20:48 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# comprare farmaci online all'estero 2023/09/27 21:04 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# canadian mail order prescriptions 2023/10/16 18:49 Dannyhealm

Every pharmacist here is a true professional. http://mexicanpharmonline.shop/# mexico drug stores pharmacies

# canada drug center promo code 2023/10/16 23:18 Dannyhealm

drug information and news for professionals and consumers. http://mexicanpharmonline.com/# mexican rx online

# canadian and international prescription service 2023/10/17 5:37 Dannyhealm

They make prescription refills a breeze. http://mexicanpharmonline.com/# mexico drug stores pharmacies

# indianpharmaonline review 2023/10/17 8:27 Dannyhealm

Their worldwide reach ensures I never run out of my medications. https://mexicanpharmonline.com/# mexican border pharmacies shipping to usa

# rx from canada 2023/10/17 11:16 Dannyhealm

They consistently exceed global healthcare expectations. https://mexicanpharmonline.com/# mexico drug stores pharmacies

# pharmacies in canada online 2023/10/17 22:36 Dannyhealm

A true asset to our neighborhood. http://mexicanpharmonline.com/# mexican rx online

# no prescription canadian pharmacies 2023/10/18 0:18 Dannyhealm

They provide a world of health solutions. http://mexicanpharmonline.com/# reputable mexican pharmacies online

# canadian rx store 2023/10/18 5:59 Dannyhealm

Their global medical liaisons ensure top-quality care. http://mexicanpharmonline.com/# mexican rx online

# no perscription required 2023/10/18 7:45 Dannyhealm

They ensure global standards in every pill. https://mexicanpharmonline.com/# mexico drug stores pharmacies

# canadian cheap rx 2023/10/18 14:44 Dannyhealm

Their international health workshops are invaluable. https://mexicanpharmonline.shop/# mexican border pharmacies shipping to usa

# pharmacies online canada 2023/10/18 18:14 Dannyhealm

They're globally renowned for their impeccable service. https://mexicanpharmonline.shop/# pharmacies in mexico that ship to usa

# no prescription needed 2023/10/18 18:49 Dannyhealm

Their worldwide services are efficient and patient-centric. https://mexicanpharmonline.shop/# mexico drug stores pharmacies

# canada meds com 2023/10/22 16:14 Jameskic

https://stromectol24.pro/# ivermectin 3 mg tablet dosage

# buy plavix https://plavix.guru/ cheap plavix antiplatelet drug 2023/10/23 21:19 Plavixxx

buy plavix https://plavix.guru/ cheap plavix antiplatelet drug

# paxlovid pill https://paxlovid.bid/ buy paxlovid online 2023/10/25 18:31 Paxlovid

paxlovid pill https://paxlovid.bid/ buy paxlovid online

# Sildenafil rezeptfrei in welchem Land 2023/12/17 18:51 StevenNuant

https://apotheke.company/# gГ?nstige online apotheke

# over the counter prednisone cheap https://prednisone.bid/ prednisone tablets india 2023/12/27 6:56 Prednisone

over the counter prednisone cheap https://prednisone.bid/ prednisone tablets india

# online ed pills 2024/01/09 13:02 PeterMerce

http://edpillsdelivery.pro/# gnc ed pills

# natural remedies for ed 2024/01/09 19:10 CharlesDioky

https://tadalafildelivery.pro/# tadalafil 2.5 mg online india

# ed treatment pills 2024/01/10 3:10 CharlesDioky

https://sildenafildelivery.pro/# generic sildenafil 100mg

# cytotec buy online usa 2024/01/14 4:44 Keithturse

https://misoprostol.shop/# cytotec online

# top farmacia online 2024/01/17 0:18 Wendellglaks

http://tadalafilitalia.pro/# farmacie online autorizzate elenco

# acquisto farmaci con ricetta 2024/01/17 6:01 Wendellglaks

http://farmaciaitalia.store/# farmacia online

# buying clomid tablets 2024/01/20 16:11 AnthonyAnoth

http://clomidpharm.shop/# where to buy generic clomid

# tamoxifen vs raloxifene 2024/01/22 3:45 Normantug

https://clomidpharm.shop/# can i buy generic clomid now

# get clomid now 2024/01/22 11:32 LarryVoP

drug information and news for professionals and consumers http://prednisonepharm.store/# prednisone 2.5 mg cost

# Pharmacie en ligne livraison gratuite 2024/01/28 6:01 AndresZot

http://pharmadoc.pro/# Pharmacie en ligne sans ordonnance
Pharmacie en ligne fiable

# stromectol 6 mg dosage 2024/01/30 4:18 Andrewamabs

http://prednisonetablets.shop/# prednisone 10 mg canada

# ivermectin 3mg tablets price 2024/01/30 20:08 Andrewamabs

http://prednisonetablets.shop/# prednisone 10 mg canada

# stromectol pill price 2024/01/31 4:23 Andrewamabs

http://prednisonetablets.shop/# prednisone 3 tablets daily

# top 10 pharmacies in india 2024/02/04 1:08 Jerrysoicy

http://indianpharm.store/# indian pharmacies safe indianpharm.store

# fda approved pharmacies in canada 2024/02/11 14:27 Williamzelia

https://edpill.cheap/# best ed treatment pills

# zestoretic 10 12.5 2024/02/22 7:30 Charlesmax

http://furosemide.guru/# furosemide 100mg

# zestril 5 mg 2024/02/24 11:11 Charlesmax

https://furosemide.guru/# buy furosemide online

# reputable indian pharmacies 2024/03/02 6:23 JordanCrils

https://diflucan.pro/# diflucan 1 where to buy

# personal dating 2024/03/02 21:18 Thomasjax

https://sweetiefox.online/# Sweetie Fox izle

# best dating site online 2024/03/03 1:50 RodrigoGrany

http://evaelfie.pro/# eva elfie izle

# dating chat site 2024/03/03 14:52 Thomasjax

https://lanarhoades.fun/# lana rhodes

# senior dating 2024/03/05 5:02 Thomasjax

https://abelladanger.online/# abella danger video

# free single site 2024/03/05 14:51 Thomasjax

https://sweetiefox.online/# swetie fox

# dating service site 2024/03/06 10:16 Thomasjax

https://evaelfie.pro/# eva elfie video

# similar dating sites like mingle2 2024/03/07 22:42 HowardBox

plenty fish free dating: http://evaelfie.site/# eva elfie hd

# jogos que dao dinheiro 2024/03/14 7:17 BrianTop

http://aviatormocambique.site/# aviator mz

# aplicativo de aposta 2024/03/14 18:29 BrianTop

http://pinupcassino.pro/# pin-up cassino

# how to buy prescriptions from canada safely 2024/03/25 18:49 Carloshab

http://mexicanpharm.online/# mexican rx online

# gates of olympus demo turkce 2024/03/28 1:31 KeithNaf

http://pinupgiris.fun/# pin-up bonanza

# UK Front-page news Hub: Arrest Informed on Machination, Economy, Learning & More 2024/03/28 20:48 Tommiemayox

Appreciated to our dedicated stand in support of staying briefed less the latest communication from the Collective Kingdom. We take cognizance of the rank of being wise far the happenings in the UK, whether you're a dweller, an expatriate, or unaffectedly interested in British affairs. Our exhaustive coverage spans across various domains including politics, briefness, education, pleasure, sports, and more.

In the realm of politics, we keep you updated on the intricacies of Westminster, covering according to roberts rules of order debates, sway policies, and the ever-evolving countryside of British politics. From Brexit negotiations and their impact on barter and immigration to domesticated policies affecting healthcare, education, and the atmosphere, we victual insightful review and propitious updates to help you pilot the complex world of British governance - https://newstopukcom.com/what-are-the-advantages-of-preparing-london-broil/.

Monetary rumour is required for adroitness the pecuniary thudding of the nation. Our coverage includes reports on market trends, charge developments, and budgetary indicators, donation valuable insights in place of investors, entrepreneurs, and consumers alike. Whether it's the latest GDP figures, unemployment rates, or corporate mergers and acquisitions, we try hard to read scrupulous and relevant information to our readers.

# UK Front-page news Centre: Check In touch on Civil affairs, Thriftiness, Cultivation & More 2024/03/29 17:34 Tommiemayox

Salutation to our dedicated stand for the sake of staying cultured about the latest intelligence from the Joint Kingdom. We understand the rank of being well-informed far the happenings in the UK, whether you're a citizen, an expatriate, or purely interested in British affairs. Our encyclopaedic coverage spans across diversified domains including wirepulling, concision, taste, extravaganza, sports, and more.

In the bailiwick of civics, we living you updated on the intricacies of Westminster, covering ordered debates, sway policies, and the ever-evolving prospect of British politics. From Brexit negotiations and their bearing on profession and immigration to domestic policies affecting healthcare, education, and the medium, we provide insightful analysis and timely updates to ease you navigate the complex area of British governance - https://newstopukcom.com/five-compelling-reasons-to-choose-loxley-heights/.

Monetary despatch is vital in search adroitness the financial thudding of the nation. Our coverage includes reports on supermarket trends, business developments, and budgetary indicators, offering valuable insights after investors, entrepreneurs, and consumers alike. Whether it's the latest GDP figures, unemployment rates, or corporate mergers and acquisitions, we strive to read meticulous and applicable message to our readers.

# can you get generic clomid pills 2024/04/03 11:39 Robertsuela

http://prednisoneall.shop/# prednisone 5 mg brand name

# cost of generic clomid tablets 2024/04/04 11:27 Robertsuela

https://clomidall.com/# cheap clomid for sale

# doxycycline 500mg 2024/04/12 9:35 Archiewef

http://misoprostol.top/# Abortion pills online

# cheap doxycycline online 2024/04/13 5:27 Archiewef

https://diflucan.icu/# diflucan cost

# odering doxycycline 2024/04/14 1:09 Archiewef

https://misoprostol.top/# buy cytotec pills online cheap

# diflucan buy 2024/04/14 17:06 Josephfep

https://prednisonea.store/# prednisone acetate

# buy prescription online 2024/04/16 3:18 ArmandoWem

http://edpill.top/# ed online treatment

# canada pharmacies online prescriptions 2024/04/16 20:14 HarveyBum

https://edpill.top/# erectile dysfunction online

タイトル
名前
URL
コメント