Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ユニバーサルアプリの理想と現実: Yahoo! JAPAN MeetUp #2
Search
kazuhiro4949
September 08, 2016
Technology
7
1.2k
ユニバーサルアプリの理想と現実: Yahoo! JAPAN MeetUp #2
Yahoo! JAPAN MeetUp #2 (iOS) の時の発表資料です。
http://yj-meetup.connpass.com/event/38348/
kazuhiro4949
September 08, 2016
Tweet
Share
More Decks by kazuhiro4949
See All by kazuhiro4949
SwiftUIをUIKitのライフサイクルで拡張するTips
kazuhiro4949
4
2.6k
iOS15でプッシュ通知のテストが大変だった話
kazuhiro4949
0
570
Source Editor Extensionと SwiftSyntaxでコード自動生成ツール を作る
kazuhiro4949
2
3.7k
iOS 12サポート終了で使えるAPIおさらい
kazuhiro4949
2
330
Source Editor ExtensionとSwiftSyntaxでコード自動生成
kazuhiro4949
0
78
大企業の最前線でコードを書き続けるためにやってきたこと
kazuhiro4949
28
19k
10分で振り返るここ数年のWWDCの技術トレンド
kazuhiro4949
0
280
コードを書きながら同時に設計していくためのiOSアプリ開発方針
kazuhiro4949
6
2.6k
身近な技術的課題から始めるOSSプロジェクト
kazuhiro4949
0
290
Other Decks in Technology
See All in Technology
株式会社Awarefy(アウェアファイ)会社説明資料 / Awarefy-Company-Deck
awarefy
3
11k
AIエージェント時代のエンジニアになろう #jawsug #jawsdays2025 / 20250301 Agentic AI Engineering
yoshidashingo
8
3.9k
データベースの負荷を紐解く/untangle-the-database-load
emiki
2
540
ウォンテッドリーのデータパイプラインを支える ETL のための analytics, rds-exporter / analytics, rds-exporter for ETL to support Wantedly's data pipeline
unblee
0
140
Amazon Q Developerの無料利用枠を使い倒してHello worldを表示させよう!
nrinetcom
PRO
2
120
EMConf JP 2025 懇親会LT / EMConf JP 2025 social gathering
sugamasao
2
200
Ruby on Railsで持続可能な開発を行うために取り組んでいること
am1157154
3
160
AIエージェント元年@日本生成AIユーザ会
shukob
1
240
あなたが人生で成功するための5つの普遍的法則 #jawsug #jawsdays2025 / 20250301 HEROZ
yoshidashingo
2
320
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
2
490
Change Managerを活用して本番環境へのセキュアなGUIアクセスを統制する / Control Secure GUI Access to the Production Environment with Change Manager
yuj1osm
0
110
2025/3/1 公共交通オープンデータデイ2025
morohoshi
0
100
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
51
11k
We Have a Design System, Now What?
morganepeng
51
7.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Git: the NoSQL Database
bkeepers
PRO
428
65k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
How to Ace a Technical Interview
jacobian
276
23k
GraphQLの誤解/rethinking-graphql
sonatard
69
10k
Transcript
݄ ,B[VIJSP)BZBTIJ ϢχόʔαϧΞϓϦ ͷཧͱݱ࣮ :BIPP+"1"/.FFU6Q
ࣗݾհ ྛ߂ ͔ͣ͠ͻΖ HJUIVC!LB[VIJSP RJJUB!LB[VIJSP UXJUUFSॾࣄͰౚ݁த ˙͓ࣄ w:BIPPγϣοϐϯά
wJ04ΞϓϦ wUW04ΞϓϦ
ΞϓϦͷϢχόʔαϧԽʹ͍ͭͯ Λ͠·͢
͍ҙຯͰͷϢχόʔαϧΞϓϦͷΑΓͪΐͬͱڱ͍ൣғΛѻ͍·͢ w͞ͳ͍͜ͱ wࠃࡍԽ%ZOBNJD5ZQFͳͲ w͢͜ͱ wը໘αΠζʹΑΔσβΠϯͷҧ͍
̍ͷ-BOETDBQFɾ1PSUSBJUΛߟ͑ΕΑ͔ͬͨ ग़య: https://developer.apple.com/videos/play/wwdc2016/222/
ͨ͘͞ΜͷαΠζΛߟ͑Δඞཁ͕͋Δ ग़య: https://developer.apple.com/videos/play/wwdc2016/222/
ը໘αΠζ ͲΜͲΜଟ༷Խ͍ͯ͠Δ
"EBQUJWF6*
88%$l#VJMEJOH"EBQUJWF"QQTXJUI6*,JUz wJ04Ҏ߱ͷϞμϯͳ։ൃํ๏ ͱͯ͠ɺz"EBQUJWF6*zͷ֓೦ Λߏங wσόΠεɾճసɾϏϡʔαΠζ ͷଟ༷ੑʹڞ௨ͷΫϥεͰରԠ ग़య: https://developer.apple.com/videos/play/wwdc2014/216/
88%$l.BLJOH"QQT"EBQUJWF 1BSUɾ1BSUz w88%$ͷηογϣϯΛ ϕʔεʹz"EBQUJWF6*zΛ࣮ ΞϓϦద༻͢Δࡍͷ w࣮ફతʹͲ͏͍͏ઃܭɾ࣮Λ ߦ͑Α͍͔Λѻ͍ͬͯΔ ग़య: https://developer.apple.com/videos/play/wwdc2016/222/
"EBQUJWF6*Λࢧ͑Δ 6*,JUͷΈ
"EBQUJWF6*Λࢧ͑Δ6*,JUͷΈ w"VUP-BZPVU J04ʙ w6*5SBJU$PMMFDUJPO 4J[F$MBTT J04ʙ w6*4QMJU7JFX$POUSPMMFS
6*1SFTFOUBUJPO$POUSPMMFS J04ʙ w6*4UBDL7JFX J04ʙ
"VUP-BZPVU ग़య: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ w 7JFXಉ࢜ͷ૬ରతͳִؒαΠζͷൺ Λઃఆ͢Δ͜ͱͰϨΠΞτܾఆͤ͞Δ w Ұ൪֎ଆͷΟϯυαΠζʹԠͯࣗ͡ ಈతʹͦΕͧΕͷ7JFXͷҐஔ͕ܭࢉ͞Ε
Δ w J04͔Β͑Δ
4J[F$MBTT w εΫϦʔϯαΠζͷҧ͍ΛநԽͨ͠ ͷ w ෯ͱߴ͞ͷαΠζʹ3FHVMBS $PNQBDU ͷछྨͷΧςΰϦΛఆٛ w
4UPSZCPBSE"TTFUT$BUBMPHͰ4J[F $MBTT୯Ґͷมߋ͕Մೳ w J04ҎલͰ͑ͳ͍ ग़య: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITraitCollection_ClassReference/
6*5SBJU$PMMFDUJPO wεΫϦʔϯαΠζɾσόΠεͷछྨɾ ղ૾ͳͲ͕7JFX$POUSPMMFSɾ 7JFX୯ҐͰ֨ೲ͞Εͨͷ wJ04Ҏ߱Ͱճసɾը໘ׂͳͲ Ͱ7JFXαΠζ͕มߋ͞ΕΔ߹ ͜ΕΛݟΔ ग़య: https://developer.apple.com/videos/play/wwdc2014/216/
6*4QMJU7JFX$POUSPMMFS w "EBQUJWFͳ7JFX$POUSPMMFS w .BTUFS%FUBJMߏͷը໘Ͱ༻Մೳ w 5SBJU$PMMFDUJPOͷύϥϝʔλʹΑͬͯ ݟͤํΛม͑ΒΕΔ w
J04ҎલJ1BEͷΈͰར༻Մ ग़య: https://developer.apple.com/videos/play/wwdc2014/216/
6*1SFTFOUBUJPO$POUSPMMFS w "EBQUJWFͳ1SFTFOUBUJPO w ϞʔμϧϏϡʔͷදࣔํ๏ΛΧελϚΠ ζͰ͖Δ w 5SBJU$PMMFDUJPOͷύϥϝʔλʹΑͬͯ ݟͤํΛม͑ΒΕΔ
w J04ҎલͰ͑ͳ͍ ग़య: https://developer.apple.com/videos/play/wwdc2014/216/
6*4UBDL7JFX w7JFXཁૉΛִؒͰฒΔ͜ ͱ͕Ͱ͖ΔศརΫϥε w4J[F$MBTT୯ҐͰִؒฒ ํΛઃఆͰ͖Δ wJ04Ҏ߱Ͱͳ͍ͱ͑ͳ͍ ग़య: https://developer.apple.com/videos/play/wwdc2015/218/
ͦΕΒͷΈΛ߹Θͤͯ͜͏͍ͬͨΞϓϦΛ࡞Δ͜ͱ͕Ͱ͖Δ wͻͱͭͷ7JFX$POUSPMMFSΛ ͍ͳ͕Βҧͬͨը໘ΛݟͤΔ͜ ͱ͕Ͱ͖Δ w"QQMF͕ਪ͢Δzܕzʹ·ͬ ͨܗͰ"EBQUJWF6*͕࣮ݱͰ ͖Δ ग़య: https://developer.apple.com/videos/play/wwdc2014/216/
ݱ࣮ͷʹ ͖߹͏
࣮ͰؔΘΔΞϓϦͬͱ͍͜͠
࣮ͰؔΘΔΞϓϦͬͱ͍͜͠ wݹ͍04ͷαϙʔτ
࣮ͰؔΘΔΞϓϦͬͱ͍͜͠ wݹ͍04ͷαϙʔτ wαʔϏεಠࣗͷσβΠϯ֓೦
࣮ͰؔΘΔΞϓϦͬͱ͍͜͠ wݹ͍04ͷαϙʔτ wαʔϏεಠࣗͷσβΠϯ֓೦ w։ൃϦιʔεεϐʔυͱͷ݉Ͷ߹͍
࣮ͰؔΘΔΞϓϦͬͱ͍͜͠ wݹ͍04ͷαϙʔτ wαʔϏεಠࣗͷσβΠϯ֓೦ w։ൃϦιʔεεϐʔυͱͷ݉Ͷ߹͍ ଟ༷ͳσόΠε࠷దԽ͍ͨ͠ ؾ࣋ͪͱͷᷤ౻
αʔϏεͷࣄʹ߹Θͤͨ Ћͷ͕ඞཁ
ϙΠϯτ ߇͑ΊͳมߋͰ ຊ࣭తͳҧ͍ʹཹΊΔ
ʑͷ։ൃۀͰ͏͔ͬΓى͖ͯ͠·͍͕ͪͳ͜ͱ J1IPOFͷσβΠϯ͜ΕͰ͍͍ͱͯ͠J1BEͲ͏͢Δʁʁ ΤϯδχΞ σβΠφ
ʑͷ։ൃۀͰ͏͔ͬΓى͖ͯ͠·͍͕ͪͳ͜ͱ J1IPOFͷσβΠϯ͜ΕͰ͍͍ͱͯ͠J1BEͲ͏͢Δʁʁ ͏ʔΜʜͦ͏͍͑ʜ ΤϯδχΞ σβΠφ
ʑͷ։ൃۀͰ͏͔ͬΓى͖ͯ͠·͍͕ͪͳ͜ͱ ͜ͷػೳJ1BE༻ͷσβΠϯ࣮Ͱ͖ͦ͏ʁ σΟϨΫλʔ ΤϯδχΞ
ʑͷ։ൃۀͰ͏͔ͬΓى͖ͯ͠·͍͕ͪͳ͜ͱ ͜ͷػೳJ1BE༻ͷσβΠϯ࣮Ͱ͖ͦ͏ʁ ೲظ͕ۙ͘ɺ༨༟͕ແ͍ͷͰJ1BEͰ͜ͷػೳΓ·͢ʜ σΟϨΫλʔ ΤϯδχΞ
ʑͷ։ൃۀͰ͏͔ͬΓى͖ͯ͠·͍͕ͪͳ͜ͱ ͦ͏͍͑J1BEճస࣌ͷಈ࡞֬ೝ͢ΔͷΪϦΪϦ·ͰΕͯͨ ΤϯδχΞ
ʑͷ։ൃۀͰ͏͔ͬΓى͖ͯ͠·͍͕ͪͳ͜ͱ ͋ΕʁJ1BE൛ʹ͜ͷػೳͳ͍ͱ͍͏༷Ͱਖ਼ղͳΜ͚ͩͬʜ σΟϨΫλʔ
αʔϏεΛఏڙ͠ଓ͚ΒΕΔϓϩμΫτΛࢦ͢ wେݪଇͱͯ͠J1IPOFͱJ1BEͰίʔυΛڞ༗͢Δ wۃྗɺશσόΠεɾ04Ͱػೳ༷Λ౷Ұ͠ɺݟ͚ͨͩม͑Δ wͱΓ͋͑ͣJ1IPOFͷීٴͰૉૣ͘σβΠϯΛܾΊͯ͠·͏ wେମͷέʔεͰ͔ͦ͜Β"VUPMBZPVUͰԣʹ৳ͨ͠Γɺ SFBEBCMF$POUFOU(VJEFͰϚʔδϯΛ࡞ͬͨΓ͢Δͷ͕ແ
αʔϏεΛఏڙ͠ଓ͚ΒΕΔϓϩμΫτΛࢦ͢ ͨͩ͠ ΤϯδχΞͱͯ͠ͷ ཧɺ σόΠεຖʹ࠷దԽ͞ΕͨϓϩμΫτΛఏڙ͍ͨ͠ wେݪଇͱͯ͠J1IPOFͱJ1BEͰίʔυΛڞ༗͢Δ wۃྗɺશσόΠεɾ04Ͱػೳ༷Λ౷Ұ͠ɺݟ͚ͨͩม͑Δ wͱΓ͋͑ͣJ1IPOFͷීٴͰૉૣ͘σβΠϯΛܾΊͯ͠·͏ wେମͷέʔεͰ͔ͦ͜Β"VUPMBZPVUͰԣʹ৳ͨ͠Γɺ
SFBEBCMF$POUFOU(VJEFͰϚʔδϯΛ࡞ͬͨΓ͢Δͷ͕ແ
ϙΠϯτ 6*5BCMF7JFX͔Β 6*$PMMFDUJPO7JFXͰͷ࣮มߋ
6*$PMMFDUJPO7JFX w 6*5BCMF7JFXʹൺͯϨΠΞτͷ ࣗ༝͕ߴ͍ w ෳࡶͳը໘Ληϧ Ϟδϡʔϧ ʹ Ͱ͖Δ
w J04͔Β͑Δ 4UBDL7JFXͩͱ J04Ҏ͔߱͑͠ͳ͍
6*$PMMFDUJPO7JFX'MPX-BZPVUΛͬͯɺEFMFHBUFͰذͤ͞Δ ॳڃ func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath
indexPath: NSIndexPath) -> CGSize { switch (indexPath.section, indexPath.item) { case (0, 0) where traitCollection.userInterfaceIdiom == .Phone: return CGSize(width: aWidth, height: aHeight) case (0, 0) where traitCollection.userInterfaceIdiom == .Pad: return CGSize(width: aWidth / 2, height: aHeight) .. .. .. } }
6*$PMMFDUJPO7JFX'MPX-BZPVUΛͬͯɺEFMFHBUFͰذͤ͞Δ ॳڃ func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath
indexPath: NSIndexPath) -> CGSize { switch (indexPath.section, indexPath.item) { case (0, 0) where traitCollection.userInterfaceIdiom == .Phone: return CGSize(width: aWidth, height: aHeight) case (0, 0) where traitCollection.userInterfaceIdiom == .Pad: return CGSize(width: aWidth / 2, height: aHeight) .. .. .. } } J1IPOFͰ͋Ε͋Δ෯ΛऔΓɺJ1BEͰ͋ΕJ1IPOFͷ෯ͷʹ͢Δ
6*$PMMFDUJPO7JFX'MPX-BZPVUΛͬͯɺEFMFHBUFͰذͤ͞Δ ॳڃ
6*$PMMFDUJPO7JFX'MPX-BZPVUΛͬͯɺEFMFHBUFͰذͤ͞Δ ॳڃ w J1IPOFͰηϧΛॎʹ ฒΔ w J1BEͰηϧΛԣʹฒ Δ
6*$PMMFDUJPO7JFX'MPX-BZPVUΛܧঝͯ͠ɺϨΠΞτΫϥεͰذͤ͞Δ தڃ class GridLayout: UICollectionViewFlowLayout { enum DisplayMode {
case TwoColumns = 2 case FourColumns = 4 func estimatedWidth(viewWidth: CGFloat, space: CGFloat) -> CGFloat { return CGFloat(Int(viewWidth - space) /rawValue) } .. .. } .. .. }
6*$PMMFDUJPO7JFX'MPX-BZPVUΛܧঝͯ͠ɺϨΠΞτΫϥεͰذͤ͞Δ தڃ class GridLayout: UICollectionViewFlowLayout { enum DisplayMode {
case TwoColumns = 2 case FourColumns = 4 func estimatedWidth(viewWidth: CGFloat, space: CGFloat) -> CGFloat { return CGFloat(Int(viewWidth - space) /rawValue) } .. .. } .. .. } J1IPOFͰ͋ΕྻΛऔͬͯɺJ1BEͰ͋ΕྻΛऔΔΑ͏ʹ -BZPVUΫϥεͰFOVNΛ࡞Δ
6*$PMMFDUJPO7JFX'MPX-BZPVUΛܧঝͯ͠ɺϨΠΞτΫϥεͰذͤ͞Δ தڃ
6*$PMMFDUJPO7JFX'MPX-BZPVUΛܧঝͯ͠ɺϨΠΞτΫϥεͰذͤ͞Δ தڃ wJ1IPOFͰྻ wJ1BEͰྻ
J1IPOF༻ͱJ1BE༻ͷϨΠΞτΫϥεΛ࡞ͬͯΓସ͑Δ ্ڃ class UICollectionViewController { override func viewDidLoad() {
super.viewDidLoad() if traitCollection.userInterfaceIdiom == .Pad { collectionView?.collectionViewLayout = SectionSplitLayout(delegate: self) } else { collectionView?.collectionViewLayout = UICollectionViewFlowLayout() } } } ͜͜ͰۮηΫγϣϯΛࠨحηΫγϣϯΛӈฒΔϨΠΞτΫϥεΛ࡞ J1BEͷ͚࣌ͩͦͷಠ࣮ࣗͨ͠ϨΠΞτΫϥεΛೖΕΔ
J1IPOF༻ͱJ1BE༻ͷϨΠΞτΫϥεΛ࡞ͬͯΓସ͑Δ ্ڃ J1BE J1IPOF
J1IPOF༻ͱJ1BE༻ͷϨΠΞτΫϥεΛ࡞ͬͯΓସ͑Δ ্ڃ J1BE J1IPOF wJ1IPOFͰηΫγϣϯΛ ॎʹฒΔ wJ1BEͰۮηΫγϣϯ ΛࠨɺحηΫγϣϯΛ ӈʹஔ͢Δ
6*$PMMFDUJPO7JFXΛ͏͜ͱͰ w7JFX7JFX$POUSPMMFS͔ΒϨΠΞτͷΈΛΓͤΔ wը໘ύʔπͷΈ͑ʹΑͬͯɺʮը໘ͷ͞ͷҧ͍ʯʹ Ԡͨ͡࠷ݶͷมԽΛ༩͑Δࣄ͕Ͱ͖Δ
ϙΠϯτ 7JFX7JFX$POUSPMMFS͔Β ը໘αΠζґଘͷίʔυΛΓ͢
88%$Ͱਪ͞Εͨํ๏ w ֤7JFX$POUSPMMFSຖʹz%FTJHO0CKFDU Λ༻ҙ͢Δ w TUSVDUFOVNΛޮՌతʹ͏ w 7JFX$POUSPMMFSͰذ͢ΔͷͰͳ ͘ɺz%FTJHO0CKFDUzΧϓηϧԽ͢
Δ ग़య: https://developer.apple.com/videos/play/wwdc2016/233/
7JFX$POUSPMMFS͔Βʮ͠J1BEͳΒʯͱ͍͏ذΛΓ͢ enum LayoutContext { case DefaultScreen case WideScreen init(traitCollection:
UITraitCollection, size: CGSize) { if traitCollection.horizontalSizeClass == .Regular && size.width >= size.height { self = .WideScreen } else { self = .DefaultScreen } } var navigationBarTranslucent: Bool { switch self { case .DefaultScreen: return true case .WideScreen: return false } } }
7JFX$POUSPMMFSͰཧ͞ΕΔը໘ͷϨΠΞτύλʔϯ͕Θ͔Γ͘͢ͳΔ
7JFX$POUSPMMFSͰཧ͞ΕΔը໘ͷϨΠΞτύλʔϯ͕Θ͔Γ͘͢ͳΔ w ྫ͑ɺ͖ͬ͞ͷܕͷத ͰɺJ1IPOFಁ໌ɾ J1BEෆಁ໌ͷφϏήʔ γϣϯΛఆٛ͢Δɻ w 7JFX$POUSPMMFSͷ৭ ΜͳՕॴͰҧ͍͕ൃੜ͢
Δ߹ʹɺ͜ͷΑ͏ʹ Γग़͢ͱɺ༷͕·ͱ ·ͬͯΘ͔Γ͍͢
γεςϜ্ͷఆٛͱσβΠφɾσΟϨΫλ͔Βݟͨఆٛͷҧ͍Λٵऩ wྫ͑:BIPPγϣοϐϯάͰσβΠφͰҎԼͷׅΓͰΞϓϦσ βΠϯΛ࡞͍ͬͯΔ ߋʹ04ͷόʔδϣϯʹΑͬͯҧ͏͜ͱ͕͋Δ wJ1IPOF wJ1BEॎ wJ1BEԣ w6*5SBJU$PMMFDUJPOΛ͍ɺ4J[F$MBTTͱॎɾԣͷαΠζൺͰͭͷ
۠ผΛ͢Δɻͦͯͦ͠ͷҧ͍Λz%FTJHO0CKFDUzʹΧϓηϧԽ
·ͱΊ
·ͱΊ wJ1IPOF J1BEͰಉ͡ػೳɾαʔϏεΛఏڙ͠ଓ͚Δ͜ͱΛ ࢦ͢
·ͱΊ wJ1IPOF J1BEͰಉ͡ػೳɾαʔϏεΛఏڙ͠ଓ͚Δ͜ͱΛ ࢦ͢ wग़དྷΔݶΓ"QQMFͷෑ͍ͨϨʔϧʹΔ
·ͱΊ wJ1IPOF J1BEͰಉ͡ػೳɾαʔϏεΛఏڙ͠ଓ͚Δ͜ͱΛ ࢦ͢ wग़དྷΔݶΓ"QQMFͷෑ͍ͨϨʔϧʹΔ w͔ͦ͜Β֎ΕΔ߹ɺຊ࣭తͳมԽͷΈΛ࡞Δ
·ͱΊ wJ1IPOF J1BEͰಉ͡ػೳɾαʔϏεΛఏڙ͠ଓ͚Δ͜ͱΛ ࢦ͢ wग़དྷΔݶΓ"QQMFͷෑ͍ͨϨʔϧʹΔ w͔ͦ͜Β֎ΕΔ߹ɺຊ࣭తͳมԽͷΈΛ࡞Δ w͋·Γಠࣗ࿏ઢͰڽΔͱকདྷ͔ͳΓۤ͠Ή
ࢀߟࢿྉ w "EBQUJWF6TFS*OUFSGBDFT"QQMF%FWFMPQFS w 88%$4FTTJPO#VJMEJOH"EBQUJWF"QQTXJUI6*,JU w 88%$4FTTJPO.BLJOH"QQT"EBQUJWF 1BSU w 88%$4FTTJPO.BLJOH"QQT"EBQUJWF
1BSU
ऴΘΓ