SlideShare uma empresa Scribd logo
1 de 62
InputMethodKit
     IMK
      a.k.a zonble
IMK
•               developer

    •               hack

•               NSTextView   NSTextField
                                    UI
    developer
zonble
zonble
• OpenVanilla
zonble
• OpenVanilla
• Yahoo
zonble
• OpenVanilla
• Yahoo
•                X1
zonble
• OpenVanilla
• Yahoo
•                X1

•                     Mac
zonble
• OpenVanilla
• Yahoo
•                X1

•                     Mac

•
IMK

• Mac OS X 10.5
• Mac OS X 10.4         TSM


      …
Dynamic Loading
      vs
 Client/Server
…
    dylib                      crash


                              Finder
                 crash
        Finder        crash
             crash…
IMK

  Input Client               Input Server
用來打字的應用程式                       輸入法




IMK                client/server
                 app           app          plug-in
                 32/64
crash    app




   IMK
IMK
                                            Input Controller
                                              輸入法邏輯




          Input Client
        用來打字的應用程式
                                      Input Server
                         Proxy      監聽輸入事件的 server




                                                IPC
                                 server server
controller
Input Controller
                        delegate                             …
                                        Delegate




                                          Input Controller
                                            輸入法邏輯




        Input Client
      用來打字的應用程式

                       Proxy

                                   Input Server
                                 監聽輸入事件的 server




                               delegate
     Input Controller
Input Controllre

•
    delegate

•
               …
Delegate     IMKServerInput




                                                 Input Controller     IMKStateSetting
                                                   輸入法邏輯




                 Input Client
IMKTextInput   用來打字的應用程式

                                Proxy

                                          Input Server
                                        監聽輸入事件的 server
IMKTextInput
  protocol
                   App
     informal protocol
setMarkedText:selectionRange:
     replacementRange:
•   - (void)setMarkedText:(id)string selectionRange:
    (NSRange)selectionRange replacementRange:
    (NSRange)replacementRange

•        method



•
•
setMarkedText:selectionRange:
     replacementRange:




   Opera
setMarkedText:selectionRange:
     replacementRange:
setMarkedText:selectionRange:
     replacementRange:




       Nally
               yllan++
setMarkedText:selectionRange:
     replacementRange:




          iTerm2
      Leafy        patch   :D
attributesForCharacterIndex:li
       neHeightRectangle:
• - (NSDictionary*)attributesForCharacterIndex:
  (NSUInteger)index lineHeightRectangle:
    (NSRect*)lineRect

•   attributes



•   lineRect
attributesForCharacterIndex:li
      neHeightRectangle:




                     x    -30000
                 …
Mac OS X
…
IMK
template
•     Xcode                     project
    template

•          OpenVanilla Syrup

• https://github.com/lukhnos/syrup
•                      template :p
info.plist
<key>TISInputSourceID</key>
<string>org.openvanilla.inputmethod.syrup</string>

                                 id
                        id



  inputmethod
net.zonble.inputmethod.myinputmethod…
Info.plist

<key>TISIntendedLanguage</key>
<string>zh-Hant</string>
  10.6
     bug
           —               Security Bug
               =_=
Main.m
IMKServer *server = [[IMKServer alloc]
initWithName:kConnectionName bundleIdentifier:
[[NSBundle mainBundle] bundleIdentifier]];

                                 server
connection name     info.plist
•      compile         app bundle         ~/
    Library/Input Methods/
•          syrup              tistool
                     tistool -r
    <PATH_OF_YOUR_INPUT_METHOD>
•                    script     compile
•        TIS Text Input Service API

• TISRegisterInputSource((CFURLRef)inBund
  leURL)
protocol
IMKStateSetting protocol
            Input Controller
•   activateServer:

    •
    •                   init

•   deactivateServer:

    •
    •                              …
IMKServerInput protocol
    Input Controller   delegate

•
    •   /

    •   input client     input buffer

    •                  input client

    •   /
/
•

    •        – handleEvent:client:

    •        – inputText:key:modifiers:client:

    •              – inputText:client:    – 
        didCommandBySelector:client:
– handleEvent:client:
•                    NSEvent

    •   -characters //

    •   -keyCode //            key code

    •   -modifierFlags //                     command
        shift    option ctrl

    •           – inputText:key:modifiers:client:
modifierFlags
•   flags & NSShiftKeyMask //       shift

•   flags & NSControlKeyMask //         control

•   flags & NSAlternateKeyMask //           option

•   flags & NSCommandKeyMask //             command

•   flags & NSNumericPadKeyMask //

•
Key Code
•     Key Code                char
             Key Code                 char

•                                Key Code
                   QWERTY            Dvorak



•     overrideKeyboardWithKeyboardNamed
    Input Client   Keyboard Layout
characters
•           NSString



•
    • -characters
    • -charactersIgnoringModifiers
– inputText:key:modifiers:client:

•             – handleEvent:client:
    NSEvent                            :)

•   NSResponder      interpretKeyEvents:

•
inputText:client:                      – 
didCommandBySelector:client:
 • inputText:client:
 • didCommandBySelector:client:
  NSResponder          Action Messages

  •   insertNewline:    insertTab:…

  •        NSResponder        -doCommandBySelector:
           method                          action
           editor                     :)
inputText:client:                – 
didCommandBySelector:client:

•              selector        keycode

•                             Command
    Selector

    •                 Shift              …
input client
•              Input Client
    setMarkedText:selectionRange:replacement
    Range:
    •   [client setMarkedText:inputString
        selectionRange:NSMakeRange(cursorIndex, 0)
        replacementRange:NSMakeRange(NSNotFound,
        NSNotFound)];

    •   selectionRange
        replacementRange
input
- (void)commitComposition:(id)client
{
   [client insertText:_composingBuffer
replacementRange:NSMakeRange(NSNotFou
nd, NSNotFound)];
	

 //
• IMK   IMKCandidate



•             class
IMKCandidate
•
•           Grid

•
•

•
IMKCandidate
•

•              setSelectionkeys:
     keyCode                  …

•                Shift+
•              NSWindow sublcass

•                 main window          key window
        window level

•                           window level
        3D                                     level
        CGShieldingWindowLevel() + 1

    •        input client       window level
InputController


•          -menu
IMKTextInput
  protocol
IMKTextInput
•   IMKTextInput         input client
    protocol                            input client



•
    •               input client    window
         window    frame
               input client
IMKTextInput
•       10.7
    (     TextEdit


•

•              -
    (NSDictionary*)attributesForChara
    cterIndex:(NSUInteger)index
    lineHeightRectangle:
    (NSRect*)lineRect
•               Xcode attach
    process            Xcode      Editor



•             Xcode crash

•                       Xcode        debug
              NSLog            Console
• 10.7 Sandboxing
 •                  Input Methods
喻
•
•




•
•
•


•
    …
Input Method Kit

Mais conteúdo relacionado

Mais procurados

State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVMState: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
Jonas Bonér
 

Mais procurados (20)

JavaOne 2011 - JVM Bytecode for Dummies
JavaOne 2011 - JVM Bytecode for DummiesJavaOne 2011 - JVM Bytecode for Dummies
JavaOne 2011 - JVM Bytecode for Dummies
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
 
Testing with Spring: An Introduction
Testing with Spring: An IntroductionTesting with Spring: An Introduction
Testing with Spring: An Introduction
 
Rust Programming Language
Rust Programming LanguageRust Programming Language
Rust Programming Language
 
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVMState: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
 
React js入門教學
React js入門教學React js入門教學
React js入門教學
 
Javascript under the hood 1
Javascript under the hood 1Javascript under the hood 1
Javascript under the hood 1
 
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
How A Compiler Works: GNU Toolchain
How A Compiler Works: GNU ToolchainHow A Compiler Works: GNU Toolchain
How A Compiler Works: GNU Toolchain
 
Deep dive into SoapUI
Deep dive into SoapUIDeep dive into SoapUI
Deep dive into SoapUI
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang) [Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
 
The lazy programmer's guide to writing thousands of tests
The lazy programmer's guide to writing thousands of testsThe lazy programmer's guide to writing thousands of tests
The lazy programmer's guide to writing thousands of tests
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
 
GMock framework
GMock frameworkGMock framework
GMock framework
 

Semelhante a Input Method Kit

Connecting C++ and JavaScript on the Web with Embind
Connecting C++ and JavaScript on the Web with EmbindConnecting C++ and JavaScript on the Web with Embind
Connecting C++ and JavaScript on the Web with Embind
Chad Austin
 
UA Mobile 2012 (English)
UA Mobile 2012 (English)UA Mobile 2012 (English)
UA Mobile 2012 (English)
dmalykhanov
 
E yantra robot abstractions
E yantra robot abstractionsE yantra robot abstractions
E yantra robot abstractions
Akshar Desai
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
Lihan Chen
 
Wayland intro with_i18n_hacks
Wayland intro with_i18n_hacksWayland intro with_i18n_hacks
Wayland intro with_i18n_hacks
Peng Wu
 
[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation
[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation	[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation
[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation
종빈 오
 

Semelhante a Input Method Kit (20)

Connecting C++ and JavaScript on the Web with Embind
Connecting C++ and JavaScript on the Web with EmbindConnecting C++ and JavaScript on the Web with Embind
Connecting C++ and JavaScript on the Web with Embind
 
Samantha Wang [InfluxData] | Data Collection Overview | InfluxDays 2022
Samantha Wang [InfluxData] | Data Collection Overview | InfluxDays 2022Samantha Wang [InfluxData] | Data Collection Overview | InfluxDays 2022
Samantha Wang [InfluxData] | Data Collection Overview | InfluxDays 2022
 
An introduction to the API for OnTime for IBM
An introduction to the API for OnTime for IBMAn introduction to the API for OnTime for IBM
An introduction to the API for OnTime for IBM
 
UA Mobile 2012 (English)
UA Mobile 2012 (English)UA Mobile 2012 (English)
UA Mobile 2012 (English)
 
Dino2 - the Amazing Evolution of the VA Smalltalk Virtual Machine
Dino2 - the Amazing Evolution of the VA Smalltalk Virtual MachineDino2 - the Amazing Evolution of the VA Smalltalk Virtual Machine
Dino2 - the Amazing Evolution of the VA Smalltalk Virtual Machine
 
Gene Hynson [InfluxData] | How We Built the MQTT Native Collector | InfluxDay...
Gene Hynson [InfluxData] | How We Built the MQTT Native Collector | InfluxDay...Gene Hynson [InfluxData] | How We Built the MQTT Native Collector | InfluxDay...
Gene Hynson [InfluxData] | How We Built the MQTT Native Collector | InfluxDay...
 
System insight without Interference
System insight without InterferenceSystem insight without Interference
System insight without Interference
 
Runtime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for Smalltalk
 
MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...
MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...
MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...
 
basic arithmetic operations in linux environment
basic arithmetic operations in linux environmentbasic arithmetic operations in linux environment
basic arithmetic operations in linux environment
 
E yantra robot abstractions
E yantra robot abstractionsE yantra robot abstractions
E yantra robot abstractions
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
 
Discovering Vulnerabilities For Fun and Profit
Discovering Vulnerabilities For Fun and ProfitDiscovering Vulnerabilities For Fun and Profit
Discovering Vulnerabilities For Fun and Profit
 
idsecconf2010-hacking priv8 network
idsecconf2010-hacking priv8 networkidsecconf2010-hacking priv8 network
idsecconf2010-hacking priv8 network
 
y3dips hacking priv8 network
y3dips hacking priv8 networky3dips hacking priv8 network
y3dips hacking priv8 network
 
Wayland intro with_i18n_hacks
Wayland intro with_i18n_hacksWayland intro with_i18n_hacks
Wayland intro with_i18n_hacks
 
Swagger codegen tool to generate REST services
Swagger codegen tool to generate REST servicesSwagger codegen tool to generate REST services
Swagger codegen tool to generate REST services
 
Over-the-Air: How we Remotely Compromised the Gateway, BCM, and Autopilot ECU...
Over-the-Air: How we Remotely Compromised the Gateway, BCM, and Autopilot ECU...Over-the-Air: How we Remotely Compromised the Gateway, BCM, and Autopilot ECU...
Over-the-Air: How we Remotely Compromised the Gateway, BCM, and Autopilot ECU...
 
[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation
[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation	[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation
[shaderx7] 8.1 Cross-Platform Rendering Thread : Design and Implementation
 
How bol.com makes sense of its logs, using the Elastic technology stack.
How bol.com makes sense of its logs, using the Elastic technology stack.How bol.com makes sense of its logs, using the Elastic technology stack.
How bol.com makes sense of its logs, using the Elastic technology stack.
 

Mais de Weizhong Yang

苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
Weizhong Yang
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
Weizhong Yang
 

Mais de Weizhong Yang (20)

Flutter BLE
Flutter BLEFlutter BLE
Flutter BLE
 
怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情
 
Dart null safety
Dart null safetyDart null safety
Dart null safety
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事
 
Github Actions
Github ActionsGithub Actions
Github Actions
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing Aids
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code
 
貪食蛇
貪食蛇貪食蛇
貪食蛇
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio API
 
Html 5 native drag
Html 5 native dragHtml 5 native drag
Html 5 native drag
 
Retina mac
Retina macRetina mac
Retina mac
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Input Method Kit

Notas do Editor

  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
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n