SlideShare ist ein Scribd-Unternehmen logo
1 von 43
ErlangによるSSP側RTB
    @ajiyoshi from adingo
広告




 HERE!
RTB

• Real Time Bidding
• ご存知のとおり、広告の価格をリアル
 タイムのオークションで決める仕組み
広告リクエスト

          媒体側
           広告
Browser
          サーバ
          (SSP)
Bid リクエスト

          媒体側
           広告
Browser
          サーバ     広告主側
          (SSP)   広告サーバ
                  (DSP)
Bid

                  10

          媒体側
           広告     20
Browser
          サーバ               広告主側
          (SSP)    30
                            広告サーバ
                            (DSP)
                       15
オークション

                             10

                      媒体側
                      広告      20
       Browser
                      サーバ              広告主側
                     (SSP)     30
                                       広告サーバ
                                        (DSP)
                                  15



       ※generally “second price auction”
second highest bid price will be the contract price
勝者の広告を表示

                  10

          媒体側
           広告     20
Browser
          サーバ               広告主側
          (SSP)    30
                            広告サーバ
                            (DSP)
                       15
問題


• これを作るとして、どう設計するか
cf. DSP

• http://d.hatena.ne.jp/yamaz/20111026
 • RTB用のADサーバこそ最強である必
   要がある件
cf. DSP

• 全SSP分のbidリクエストを受けきるパ
 ワーが必要

• 普通のadサーバとして非常に強力であ
 る必要がある
SSP
• 100億RTB imp x DSP10社 → 1000億bid
• 外部ネットワークアクセス
 • ラック内ではない
 • 同じL2にぶら下がるわけでもない
 • 普通のadサーバならやりたくない
要件
• 堅牢であること
• 高速であること
 • < 100msec (可能なら)
• ネットワークIOでブロックしないこと
• 適切なタイムアウト処理(超重要)
IOでブロックしない
• マルチスレッド、マルチプロセス
• IO多重化
 • select epoll libeioなど
• IO多重化+イベントドリブン
 • libevなど
タイムアウトはお ですか
タイムアウト(curl)

• CURLOPT_CONNECTTIMEOUT
• CURLOPT_CONNECTTIMEOUT_MS
• CURLOPT_TIMEOUT
• CURLOPT_TIMEOUT_MS
なにそれ怖い
タイムアウト
•   CURLOPT_TIMEOUT_MS
    •   cURL 関数の実行にかけられる最大のミ
        リ秒数。 システムの標準の名前解決を
        使うように libcurl をビルドしている場合
        は、 接続のタイムアウトは秒単位の精
        度となり、最小のタイムアウトは 1 秒と
        なります。
なにそれも怖い
タイムアウト処理
•   個別の接続
    •   socket APIはコネクションと転送のタイムアウ
        トが別…
•   処理全体
    •   処理全体でのタイムアウトを記述するのはよ
        くある言語だと結構ツラい
        •   リクエスト毎に監視用のスレッドを立て
            る?
        •   signalを飛ばす?
選択肢

• libev や libeio などを使ってCで書く
• node.js (内部でlibev libeio を使用)
• 軽量プロセスを持つ言語(Erlangなど)
Cで書く


• pros
 • 動作が早い
Cで書く

• cons
 • メモリリークが怖い
 • マルチスレッドは地獄(特に保守)
 • タイムアウト処理の記述が地獄
node.jsを使う

• pros
 • イベントループやIO多重化を自分で書
  かなくていい

• メモリ解放を自分で書かなくていい
node.jsを使う
•   cons
    •   コールバック地獄

    •   シングルスレッド

    •   タイムアウトは結局地獄

    •   枯れていない

        •   頻繁なバージョンアップ
Erlang
• pros
 • 軽量プロセス
 • 枯れている&安定している
 • 記述が超楽
 • まさにこのためにあるような言語
Erlang


• cons
 • Erlangを使える技術者が少ない
Erlang
Erlang
• エリクソンの研究所で開発された言語
• 1998年にオープンソース化
• 軽量プロセスを持つ関数型言語
• TwitterやHerokuなどが使用してたり
 • もちろんエリクソンも使用
Erlangの利点(1)
• 軽量プロセス
 • ユーザプロセス
 • コンテキストスイッチが高速
 • 1プロセスに最低309ワードのメモリ
 • プロセス毎のGC
 • アクター同士のメッセージパッシング
Erlangの利点(2)

• 再代入がない
 • 副作用+マルチスレッド=地獄
 • 各プロセスは資源を共有しない
Erlangの利点(3)
• タイムアウトの実装が超楽
 • プロセスが軽量なので監視プロセス
  をリクエスト毎に作っても楽勝

• 単にメッセージ受信にタイムアウトを
  設定するだけでもよい
Erlangの性能
http://dsas.blog.klab.org/archives/51993306.html




       TCP echo サーバの秒間処理数
klabの人の考察
しかし、CPU負荷をモニタリングしていると、thread版はほんの少し速いだ
けなのにCPUを200% 使いきっており、CPU負荷のうちでも sys が多い状況
になっていました。これは、ネイティブスレッドの コンテキストスイッチ
の負荷だと思います。

なので、最速TCPサーバーの条件とは、基本的にネイティブスレッドではな
く軽量なユーザーランド スレッドかイベント駆動方式で接続の多重化を行
いつつ、なおかつ複数コアを利用するために コア数程度のネイティブス
レッドかプロセスを利用するという物になると思います。
やってみた
• RTB処理専用のdaemonをErlangで実装
 • 既存システムはErlangでないので
 • 既存システムからリクエストを受けて
  オークション結果を返す

• 処理全体で120msecタイムアウト
性能

• 約30億 bid/月
• 約1.1億 bid/日(8月の実績)
• ピーク時 約5000 bid/秒
 • ※サンプリングによる概算
タイムアウト




フロントエンドの応答時間分布(両対数)
堅牢性
• メモリリークは特に観測されていない
• ボトルネックも特になし
• VMを含むクラッシュも今の所なし
• ソースコードわずか2400行
 • Cだったら何万行になるか…
要件(再掲)
•   堅牢であること→OK

•   高速であること→OK

•   ネットワークIOでブロックしないこと
    →OK(軽量プロセスで解決)

•   適切なタイムアウト処理(超重要)
    →OK(軽量プロセスで解決)
ロバートと私はともによくLispを知っていて、私達の直観を覆すようないかなる 理由も見当た
らなかった。他の誰もがC++やPerlを使っていることは知っていた。 でもそれは私達には何の
意味もないことだった。もし、他の誰もが使っているからと いう理由で技術を選ぶなら、
Windowsを走らせておけばいいのさ。 技術を選択する時は、他の人がどうやっているかなんて
無視して、 何が最適かを見極めることだけを考えるべきだ。

特にベンチャー企業ではそうだ。大企業では、他の大企業がやっているのと 同じようなこと
をしていても良い。ベンチャーは他のベンチャーと同じことを やっていてはいけない。このこ
とに、ベンチャー企業の中に居てさえ 気付いていない人が多いんじゃないかと思う。

平均的な大企業は年に10%成長する。だから、あなたが大企業を経営していて、 他の大企業が
やっているのと全く同じようにやっていれば、 やはり年に10%くらいの成長が期待できるだろ
う。

もちろん、同じ論理はベンチャー企業にも成り立つ。 もしあなたが平均的なベンチャー企業
と同じことをやっていれば、 平均的な成長率が期待できる。問題は、だ。ベンチャー企業の
平均的な成長とは、 すなわち、潰れてしまうということだ。ベンチャー企業の生存率は50%よ
りはるかに 小さい。したがって、ベンチャーをやるなら何か変わったことをしなければなら
ない。 そうでなければ、困ったことになる。
普通の奴らの上をいけ

http://practical-scheme.net/trans/beating-the-averages-j.html
cf. adgear trader


• http://ferd.ca/rtb-where-erlang-blooms.html
まとめ

• Erlangかわいい
• 細かいIO処理を大量に捌く用途に最適
• それでいて堅牢

Weitere ähnliche Inhalte

Andere mochten auch

VIOPS - 現役高校生が実装するSkip Graph with Erlang
VIOPS - 現役高校生が実装するSkip Graph with ErlangVIOPS - 現役高校生が実装するSkip Graph with Erlang
VIOPS - 現役高校生が実装するSkip Graph with ErlangChijiwa Daiki
 
Freeで始めるゲームcg
Freeで始めるゲームcgFreeで始めるゲームcg
Freeで始めるゲームcgmasasann
 
Ad tech 勉強会 20140115
Ad tech 勉強会 20140115Ad tech 勉強会 20140115
Ad tech 勉強会 20140115ajiyoshi
 
忍者AdMaxによる収益最大化
忍者AdMaxによる収益最大化忍者AdMaxによる収益最大化
忍者AdMaxによる収益最大化webthink
 
Ruby使いのためのScalaのススメ
Ruby使いのためのScalaのススメRuby使いのためのScalaのススメ
Ruby使いのためのScalaのススメOuka Yuka
 
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJPEiji Shinohara
 
東急ハンズのクラウドデザインパターン アーキテクチャー編
東急ハンズのクラウドデザインパターン アーキテクチャー編東急ハンズのクラウドデザインパターン アーキテクチャー編
東急ハンズのクラウドデザインパターン アーキテクチャー編一成 田部井
 
JP_Chaosmap 2013 Autumn
JP_Chaosmap 2013 AutumnJP_Chaosmap 2013 Autumn
JP_Chaosmap 2013 AutumnHiroshi Kondo
 
Global AWS AdTech use-cases
Global AWS AdTech use-casesGlobal AWS AdTech use-cases
Global AWS AdTech use-casesEiji Shinohara
 
メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門
メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門
メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門Shoho Kozawa
 
AWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13w
AWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13wAWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13w
AWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13wTakahiro Yasuda
 
ブラックボックスなアドテクを機械学習で推理してみた Short ver
ブラックボックスなアドテクを機械学習で推理してみた Short verブラックボックスなアドテクを機械学習で推理してみた Short ver
ブラックボックスなアドテクを機械学習で推理してみた Short ver尚行 坂井
 

Andere mochten auch (13)

VIOPS - 現役高校生が実装するSkip Graph with Erlang
VIOPS - 現役高校生が実装するSkip Graph with ErlangVIOPS - 現役高校生が実装するSkip Graph with Erlang
VIOPS - 現役高校生が実装するSkip Graph with Erlang
 
Freeで始めるゲームcg
Freeで始めるゲームcgFreeで始めるゲームcg
Freeで始めるゲームcg
 
Ad tech 勉強会 20140115
Ad tech 勉強会 20140115Ad tech 勉強会 20140115
Ad tech 勉強会 20140115
 
忍者AdMaxによる収益最大化
忍者AdMaxによる収益最大化忍者AdMaxによる収益最大化
忍者AdMaxによる収益最大化
 
Ruby使いのためのScalaのススメ
Ruby使いのためのScalaのススメRuby使いのためのScalaのススメ
Ruby使いのためのScalaのススメ
 
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
 
東急ハンズのクラウドデザインパターン アーキテクチャー編
東急ハンズのクラウドデザインパターン アーキテクチャー編東急ハンズのクラウドデザインパターン アーキテクチャー編
東急ハンズのクラウドデザインパターン アーキテクチャー編
 
JP_Chaosmap 2013 Autumn
JP_Chaosmap 2013 AutumnJP_Chaosmap 2013 Autumn
JP_Chaosmap 2013 Autumn
 
Global AWS AdTech use-cases
Global AWS AdTech use-casesGlobal AWS AdTech use-cases
Global AWS AdTech use-cases
 
メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門
メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門
メディアマネタイズは次の世界へ。プライベートマーケットプレイス超入門
 
AWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13w
AWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13wAWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13w
AWSを活用したリアルタイム広告の入札・配信・ログ解析 #hcj13w
 
ブラックボックスなアドテクを機械学習で推理してみた Short ver
ブラックボックスなアドテクを機械学習で推理してみた Short verブラックボックスなアドテクを機械学習で推理してみた Short ver
ブラックボックスなアドテクを機械学習で推理してみた Short ver
 
「YDNの広告のCTRをオンライン学習で予測してみた」#yjdsw4
「YDNの広告のCTRをオンライン学習で予測してみた」#yjdsw4「YDNの広告のCTRをオンライン学習で予測してみた」#yjdsw4
「YDNの広告のCTRをオンライン学習で予測してみた」#yjdsw4
 

Ähnlich wie Ad tech 20121030

Real world erlang
Real world erlangReal world erlang
Real world erlangajiyoshi
 
Production Services with Gentoo Linux on SAKURA Cloud
Production Services with Gentoo Linux on SAKURA CloudProduction Services with Gentoo Linux on SAKURA Cloud
Production Services with Gentoo Linux on SAKURA CloudHidenori Matsuki
 
P1様 dsp spire_111218
P1様 dsp spire_111218P1様 dsp spire_111218
P1様 dsp spire_111218Kenta Arai
 
Rtbマネタイズセミナー@(20120324、abc2012)資料
Rtbマネタイズセミナー@(20120324、abc2012)資料Rtbマネタイズセミナー@(20120324、abc2012)資料
Rtbマネタイズセミナー@(20120324、abc2012)資料Hiroki Morishima
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup samplemganeko
 
DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!h2so5
 
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報モノビット エンジン
 
シンラ・テクノロジー第2回クラウドゲーム開発者会議
シンラ・テクノロジー第2回クラウドゲーム開発者会議シンラ・テクノロジー第2回クラウドゲーム開発者会議
シンラ・テクノロジー第2回クラウドゲーム開発者会議Shinra_Technologies
 
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用Tatsuro Hisamori
 
デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~
デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~
デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~Developers Summit
 
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...Game Tools & Middleware Forum
 
Adstir説明資料ver3.2(2012年9月5日)
Adstir説明資料ver3.2(2012年9月5日)Adstir説明資料ver3.2(2012年9月5日)
Adstir説明資料ver3.2(2012年9月5日)AdStir
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updatemganeko
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOGame Tools & Middleware Forum
 
MPSoCのPLの性能について
MPSoCのPLの性能についてMPSoCのPLの性能について
MPSoCのPLの性能についてmarsee101
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Developers Summit
 

Ähnlich wie Ad tech 20121030 (20)

Real world erlang
Real world erlangReal world erlang
Real world erlang
 
Production Services with Gentoo Linux on SAKURA Cloud
Production Services with Gentoo Linux on SAKURA CloudProduction Services with Gentoo Linux on SAKURA Cloud
Production Services with Gentoo Linux on SAKURA Cloud
 
Rtb30min
Rtb30minRtb30min
Rtb30min
 
P1様 dsp spire_111218
P1様 dsp spire_111218P1様 dsp spire_111218
P1様 dsp spire_111218
 
Rtbマネタイズセミナー@(20120324、abc2012)資料
Rtbマネタイズセミナー@(20120324、abc2012)資料Rtbマネタイズセミナー@(20120324、abc2012)資料
Rtbマネタイズセミナー@(20120324、abc2012)資料
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup sample
 
Riakmeetup2forupload
Riakmeetup2foruploadRiakmeetup2forupload
Riakmeetup2forupload
 
DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!
 
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報
 
シンラ・テクノロジー第2回クラウドゲーム開発者会議
シンラ・テクノロジー第2回クラウドゲーム開発者会議シンラ・テクノロジー第2回クラウドゲーム開発者会議
シンラ・テクノロジー第2回クラウドゲーム開発者会議
 
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
 
デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~
デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~
デブサミ2013【15-C-6】5msの中身を公開!~ネット広告配信と支える職人達~
 
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...
VRライブ・コミュニケーションサービス「バーチャルキャスト」でのモノビットエンジンの採用事例と最新情報 - モノビットエンジン - GTMF 2018 O...
 
Adstir説明資料ver3.2(2012年9月5日)
Adstir説明資料ver3.2(2012年9月5日)Adstir説明資料ver3.2(2012年9月5日)
Adstir説明資料ver3.2(2012年9月5日)
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample update
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
 
MPSoCのPLの性能について
MPSoCのPLの性能についてMPSoCのPLの性能について
MPSoCのPLの性能について
 
Fluentd meetup #2
Fluentd meetup #2Fluentd meetup #2
Fluentd meetup #2
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Vrodeo agenda 200930
Vrodeo agenda 200930Vrodeo agenda 200930
Vrodeo agenda 200930
 

Ad tech 20121030

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n